director/Program.cs
2021-08-18 23:16:57 -04:00

107 lines
3.9 KiB
C#

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<Config>(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}");
}
}
}
}
}