Files
TickerLib/Animation/FeedManager.cs
2024-02-23 06:55:00 -05:00

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("&#39;", "'");
output = output.Replace("&amp;", "&");
output = output.Replace("&quot;", "\"");
output = output.Replace("&nbsp;", " ");
output = RemoveHTMLTags(output);
return output;
}
private static string RemoveHTMLTags(string text)
{
string regularExpressionString = "<.+?>";
Regex r = new Regex(regularExpressionString, RegexOptions.Singleline);
return r.Replace(text, "");
}
}
}