From 4fc8ef9a296acee798690c3740137ccfcad4fb43 Mon Sep 17 00:00:00 2001 From: "Adam R. Grey" Date: Fri, 20 Aug 2021 00:26:00 -0400 Subject: [PATCH] less editorializing --- Program.cs | 145 +++++++++++-------------------------- schedulable/Schedulable.cs | 9 ++- 2 files changed, 49 insertions(+), 105 deletions(-) diff --git a/Program.cs b/Program.cs index f0a4ced..d2e79e2 100644 --- a/Program.cs +++ b/Program.cs @@ -9,6 +9,7 @@ using franz; using Ical.Net; using Ical.Net.CalendarComponents; using Ical.Net.DataTypes; +using Ical.Net.Serialization; using Newtonsoft.Json; namespace director @@ -21,7 +22,9 @@ namespace director private static Scratch scratch; private static HttpClient httpClient; private static DateTime searchStart = DateTime.Now; //is it slower to just call datetime.now every time? /shrug - private static DateTime searchEnd = DateTime.Now.AddDays(14); + private static DateTime searchEnd = DateTime.Now.AddDays(7); + //I don't understand why the entire .net ecosystem insists on ignoring ToString(). Is it really that much fun writing a serializer factory? ...java programmers. + private static EventSerializer ser = new EventSerializer(); static void Main(string[] args) { if (!File.Exists("appsettings.json")) @@ -48,133 +51,69 @@ namespace director } private static async Task calendarCheck() { - //pull calendar ics's try { + lock (scratch) + { + scratch.agenda.Clear(); + } Task.WaitAll( - checkYoutube(), - checkTwitch() + checkCalendar(conf.calendar_twitch, "youtube", (ref Schedulable.Schedulable n) => + { + n.ScedulableType = Schedulable.ScedulableType.YTRelease; + }), + checkCalendar(conf.calendar_twitch, "twitch", (ref Schedulable.Schedulable n) => + { + n.ScedulableType = Schedulable.ScedulableType.TwitchStream; + }) ); - //await checkTwitch(); + lock (scratch) + { + scratch.Save(); + } } catch (Exception e) { - Console.Error.WriteLine("sure would be nice if it threw an error"); Console.Error.WriteLine(e); } - Console.WriteLine("k."); + Console.WriteLine($"calendars pulled, scratch has {scratch.agenda.Count} schedulables."); + + foreach (var s in scratch.agenda) + { + if (s.Showtime - DateTime.Now <= calendarNaptime) + { + Console.WriteLine("I'm an item on the agenda and showtime is near!"); + Console.WriteLine(s.Event); + } + } } - private delegate Schedulable.Schedulable schedulableCreate(CalendarEvent evt); - private delegate void schedulableUpdate(Schedulable.Schedulable old, CalendarEvent evt); - private delegate void schedulableRemove(Schedulable.Schedulable removed); - private static async Task checkCalendar(string calendarUri, string calLabel, - schedulableCreate createSchedulable, - schedulableUpdate updateSchedulable, - schedulableRemove removeSchedulable) + private delegate void schedulableCreate(ref Schedulable.Schedulable creating); + private static async Task checkCalendar(string calendarUri, string calLabel, schedulableCreate createSchedulable) { //?export is a hack to allow me to access the calendar - //it likes to throw an error saying "this is the webDAV interface, use webDAV" at my webDAV client. + //it likes to throw an error saying "this is the webDAV interface, use webDAV" at my webDAV client, stopping me from using webDAV. var calString = await httpClient.GetStringAsync(conf.webdav_uri + calendarUri + "?export"); var calT = Calendar.Load(calString); var knownChecklist = new List(); lock (scratch) { scratch.Calendars[calLabel] = calString; - foreach (var s in scratch.agenda) - { - if (s.Event.Calendar == calT) - { - knownChecklist.Add(s); - } - } - foreach (var evt in calT.Events) - { - - if(evt.Start.Value >= searchStart && evt.End.Value <= searchEnd) - { - Console.WriteLine($"[{calLabel}] hi im an event in the search space, {evt.Summary} on {evt.Start}"); - } - } - foreach(var calOccurrence in calT.GetOccurrences(searchStart, searchEnd)) + foreach (var calOccurrence in calT.GetOccurrences(searchStart, searchEnd)) { var asEvent = calOccurrence.Source as Ical.Net.CalendarComponents.CalendarEvent; - Console.WriteLine($"[{calLabel}] hi im an occurence in the search space, {asEvent.Summary} on {calOccurrence.Period.StartTime}"); - Console.WriteLine($"{asEvent.Uid}"); - } - - // foreach (var evt in calT.Events) - // { - // var foundInRange = evt.GetOccurrences(searchStart, searchEnd); - // if (foundInRange?.Count > 0) - // { - // Console.WriteLine($"[{calLabel}] event {evt.Summary} has {foundInRange.Count} occurences"); - // foreach (var upcoming in foundInRange) - // { - // if (upcoming != null) - // { - // Console.WriteLine($"[{calLabel}] event {evt.Summary} has an occurence: {upcoming.Period.StartTime.Date.ToShortDateString()}; uid: {evt.Uid}"); - // Console.WriteLine($"Description: {evt.Description}"); - // Console.WriteLine($"Calendar: {evt.Calendar}"); - // Console.WriteLine($"Children: {evt.Children.Count}"); - // Console.WriteLine($"Class: {evt.Class}"); - // Console.WriteLine($"stamp: {evt.DtStamp} created: {evt.Created} start: {evt.DtStart} end: {evt.DtEnd}"); - // // Console.WriteLine($"Name: {evt.Name}"); - // // Console.WriteLine($"Parent: {evt.Parent}"); - // // Console.WriteLine($"Properties: {evt.Properties.Count}"); - // // if (evt.Properties.Count > 0) - // // { - // // foreach (var thing in evt.Properties) - // // { - // // Console.WriteLine($"{thing.Name}: {thing.Value}"); - // // } - // // } - // Console.WriteLine($"RecurrenceRules: {evt.RecurrenceRules.Count}"); - // // var existing = scratch.agenda.FirstOrDefault(s => s.Event.Uid == upcoming); - // // if(existing == null) - // // { - // // scratch.agenda.Add(createSchedulable(upcoming)); - // // } - // // else - // // { - // // knownChecklist.Remove(existing); - // // if(existing.Event != upcoming) - // // { - // // Console.WriteLine("existing event != new event, but has same uid"); - // // updateSchedulable(existing, upcoming); - // // existing.Event = upcoming; - // // } - // // } - // } - // } - // } - // } - if (knownChecklist.Count > 0) - { - foreach (var removed in knownChecklist) + var newSchedulable = new Schedulable.Schedulable() { - scratch.agenda.Remove(removed); - removeSchedulable(removed); - } + Event = ser.SerializeToString(asEvent), + OccurrenceStart = calOccurrence.Period.StartTime.Date, + OccurrenceEnd = calOccurrence.Period.EndTime.Date, + Showtime = calOccurrence.Period.StartTime.Date, + }; + createSchedulable(ref newSchedulable); + scratch.agenda.Add(newSchedulable); } } } - private static async Task checkTwitch() - { - await checkCalendar(conf.calendar_twitch, "twitch", - (e) => { return new Schedulable.Schedulable() { Event = e }; }, - (o, e) => { }, - (o) => { } - ); - } - private static async Task checkYoutube() - { - await checkCalendar(conf.calendar_youtube, "youtube", - (e) => { return new Schedulable.Schedulable() { Event = e }; }, - (o, e) => { }, - (o) => { } - ); - } } } diff --git a/schedulable/Schedulable.cs b/schedulable/Schedulable.cs index f25a868..5d3df58 100644 --- a/schedulable/Schedulable.cs +++ b/schedulable/Schedulable.cs @@ -6,7 +6,12 @@ namespace Schedulable { public class Schedulable { - public CalendarEvent Event { get; set; } - public Occurrence Occurrence { get; set; } + //no, not calendar event. Circular reference, trips up jsonconvert. + public string Event { get; set; } + public DateTime OccurrenceStart { get; set; } + public DateTime OccurrenceEnd { get; set; } + public DateTime Showtime { get; set; } + public ScedulableType ScedulableType { get; set; } = ScedulableType.Other; } + public enum ScedulableType { TwitchStream, YTRelease, Other }; } \ No newline at end of file