162 lines
5.4 KiB
C#
162 lines
5.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading;
|
|
using System.Windows.Threading;
|
|
using Ticker.Models;
|
|
using Ticker.Helper;
|
|
|
|
namespace Ticker.Animation
|
|
{
|
|
public class FeedManager
|
|
{
|
|
private static int FEED_DEFAULT_INTERVAL_MINUTES=1;
|
|
private static String FEED_CACHE_FILE_NAME="feedcache.txt";
|
|
private readonly Dictionary<string, FeedItem> feedItems = new Dictionary<string, FeedItem>();
|
|
private DispatcherTimer dispatcherTimer = new DispatcherTimer();
|
|
public event EventHandler<ItemEventArgs<FeedItem>> NewFeedItem;
|
|
public delegate List<FeedItem> GetFeedItemsEventHandler();
|
|
public event GetFeedItemsEventHandler FeedSourceEventHandler;
|
|
private bool stop = false;
|
|
private bool isInit=true;
|
|
public FeedManager()
|
|
{
|
|
ReadCache();
|
|
dispatcherTimer.Tick += DispatcherTimer_Tick;
|
|
dispatcherTimer.Interval = new TimeSpan(0, FEED_DEFAULT_INTERVAL_MINUTES, 0);
|
|
}
|
|
public virtual void Dispose()
|
|
{
|
|
Stop();
|
|
}
|
|
public void MarkFeedAsRead(FeedItem item)
|
|
{
|
|
if(!feedItems.ContainsKey(item.Guid))return;
|
|
feedItems[item.Guid].Read = true;
|
|
WriteCache(item);
|
|
}
|
|
public int GetFeedItemCount()
|
|
{
|
|
int count=0;
|
|
lock(feedItems)
|
|
{
|
|
if(null==feedItems||0==feedItems.Count)return count;
|
|
List<FeedItem> feedItemsList=new List<FeedItem>(feedItems.Values);
|
|
count=(from FeedItem feedItem in feedItemsList where feedItem.Read==false select feedItem).Count();
|
|
}
|
|
return count;
|
|
}
|
|
private void DispatcherTimer_Tick(object sender, EventArgs e)
|
|
{
|
|
Go();
|
|
}
|
|
public int FeedIntervalMinutes
|
|
{
|
|
get{return dispatcherTimer.Interval.Minutes;}
|
|
set{dispatcherTimer.Interval=new TimeSpan(0,value,0);}
|
|
}
|
|
public void Start()
|
|
{
|
|
stop = false;
|
|
Go();
|
|
dispatcherTimer.Start();
|
|
}
|
|
public void Stop()
|
|
{
|
|
if(stop)return;
|
|
if(null!=dispatcherTimer)dispatcherTimer.Stop();
|
|
stop = true;
|
|
}
|
|
private void Go()
|
|
{
|
|
if(stop)return;
|
|
if(isInit)
|
|
{
|
|
isInit=false;
|
|
AddOpeningBanner();
|
|
}
|
|
ThreadPool.QueueUserWorkItem(LoadFeed,null);
|
|
}
|
|
// ***************************************************************************************************************************************************
|
|
// *************************************************************************** F E E D C A C H E ****************************************************
|
|
// ***************************************************************************************************************************************************
|
|
private void ReadCache()
|
|
{
|
|
lock(feedItems)
|
|
{
|
|
feedItems.Clear();
|
|
List<FeedItem> cacheItems=FeedSerializer.Deserialize(FEED_CACHE_FILE_NAME);
|
|
foreach(FeedItem feedItem in cacheItems)
|
|
{
|
|
if(!feedItems.ContainsKey(feedItem.Guid))feedItems.Add(feedItem.Guid,feedItem);
|
|
}
|
|
}
|
|
}
|
|
private void WriteCache(FeedItem feedItem)
|
|
{
|
|
lock(feedItems)
|
|
{
|
|
List<FeedItem> cacheItems=new List<FeedItem>(feedItems.Values);
|
|
FeedSerializer.Serialize(FEED_CACHE_FILE_NAME,DateTime.Today,feedItem);
|
|
}
|
|
}
|
|
// ***************************************************************************************************************************************************
|
|
private void AddOpeningBanner()
|
|
{
|
|
FeedItem feedItem=new FeedItem();
|
|
DateTime today=DateTime.Now;
|
|
feedItem.Description="TradeBlotter";
|
|
feedItem.Title=today.ToLongDateString()+" "+today.ToLongTimeString();
|
|
feedItem.Guid=today.ToLongTimeString();
|
|
feedItem.Link="https://www.time.gov/";
|
|
feedItem.Source="";
|
|
feedItem.PubDate=today.ToLongDateString();
|
|
feedItems.Add(feedItem.Guid,feedItem);
|
|
if (NewFeedItem != null) NewFeedItem(this, new ItemEventArgs<FeedItem>(feedItem));
|
|
}
|
|
private void LoadFeed(object state)
|
|
{
|
|
try
|
|
{
|
|
List<FeedItem> newFeedItems=null;
|
|
if(null==FeedSourceEventHandler)return;
|
|
newFeedItems=FeedSourceEventHandler();
|
|
if(null==newFeedItems||0==newFeedItems.Count)return;
|
|
foreach (FeedItem item in newFeedItems)
|
|
{
|
|
if (stop) return;
|
|
if (feedItems.ContainsKey(item.Guid)) continue;
|
|
item.Title = Clean(item.Title).Replace("\r","").Replace("\n","");
|
|
item.Description = Clean(item.Description);
|
|
lock (feedItems)
|
|
{
|
|
feedItems.Add(item.Guid, item);
|
|
}
|
|
if (NewFeedItem != null) NewFeedItem(this, new ItemEventArgs<FeedItem>(item));
|
|
}
|
|
}
|
|
catch(Exception)
|
|
{
|
|
}
|
|
}
|
|
private static string Clean(string input)
|
|
{
|
|
string output = input.Trim();
|
|
output = output.Replace("'", "'");
|
|
output = output.Replace("&", "&");
|
|
output = output.Replace(""", "\"");
|
|
output = output.Replace(" ", " ");
|
|
output = RemoveHTMLTags(output);
|
|
return output;
|
|
}
|
|
private static string RemoveHTMLTags(string text)
|
|
{
|
|
string regularExpressionString = "<.+?>";
|
|
Regex r = new Regex(regularExpressionString, RegexOptions.Singleline);
|
|
return r.Replace(text, "");
|
|
}
|
|
}
|
|
} |