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 feedItems = new Dictionary(); private DispatcherTimer dispatcherTimer = new DispatcherTimer(); public event EventHandler> NewFeedItem; public delegate List 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 feedItemsList=new List(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 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 cacheItems=new List(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)); } private void LoadFeed(object state) { try { List 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(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, ""); } } }