using System; using System.IO; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using franz; using Ical.Net; using Newtonsoft.Json; namespace director { class Program { //private static Telefranz tf; public static Config conf; private static TimeSpan calendarNaptime = TimeSpan.FromHours(1); 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(7); static void Main(string[] args) { if (!File.Exists("appsettings.json")) { Console.Error.WriteLine("appsettings.json was not found!"); return; } conf = JsonConvert.DeserializeObject(File.ReadAllText("appsettings.json")); httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String( System.Text.Encoding.ASCII.GetBytes($"{conf.webdav_username}:{conf.webdav_password}"))); //tf = new Telefranz("scheduler", conf.kafka_bootstrap); //todo: subscribe to event appears message - you don't need to respond to an event disappearing message //todo: talk to dave. What's coming up in the next short timeframe? scratch = Scratch.LoadScratch(); while (true) { Task.WaitAll( //await and do next calendar task, calendarCheck(), Task.Delay(calendarNaptime) ); } } private static async Task calendarCheck() { //pull calendar ics's try { Task.WaitAll( checkYoutube(), checkTwitch() ); } catch (Exception e) { Console.Error.WriteLine("sure would be nice if it threw an error"); Console.Error.WriteLine(e); } Console.WriteLine("k."); lock (scratch) { //verify against existing copy, react to changes //put in scratch } } private static async Task checkTwitch() { var calString = await httpClient.GetStringAsync(conf.webdav_uri + conf.calendar_twitch + "?export"); lock(scratch) { scratch.Calendars["twitch"] = calString; } var calT = Calendar.Load(calString); Console.WriteLine($"calendar name: {calT.Name}"); foreach(var evt in calT.Events){ var upcoming = evt.GetOccurrences(searchStart, searchEnd)?.FirstOrDefault(); if(upcoming != null){ Console.WriteLine($"[twitch] event {evt.Summary} has an occurence: {upcoming.Period.StartTime}"); } } } private static async Task checkYoutube() { var calString = await httpClient.GetStringAsync(conf.webdav_uri + conf.calendar_youtube + "?export"); lock(scratch) { scratch.Calendars["youtube"] = calString; } var calYT = Calendar.Load(calString); Console.WriteLine($"calendar name: {calYT.Name}"); foreach(var evt in calYT.Events){ var upcoming = evt.GetOccurrences(searchStart, searchEnd)?.FirstOrDefault(); if(upcoming != null){ Console.WriteLine($"[youtube] event {evt.Summary} has an occurence: {upcoming.Period.StartTime}"); } } } } }