using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using director; using Director; using franz; using Newtonsoft.Json; using Schedulable.Show; namespace ShowHandlers { public class YoutubeHandler : ShowHandler { private readonly AutoResetEvent checkSignal = new AutoResetEvent(false); private static string[] AgentsNeeded { get; set; } = { "youtube" }; private List agentsPresent {get;set;} = new List(); public override TimeSpan LeadTimeDesired { get => TimeSpan.FromDays(1); } private silver_messages.youtube.yt_metadata metadataSoFar = new silver_messages.youtube.yt_metadata(); public override void Handle(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine($"begin youtube handler. current time {DateTime.Now.ToLongTimeString()}"); //Console.WriteLine(JsonConvert.SerializeObject(evt)); Task.Run(() => PreShow(evt)); Console.WriteLine("kicked off the pre-show"); if (evt.OccurrenceStart > DateTime.Now) { Task.WaitAll(Task.Delay(evt.OccurrenceStart - DateTime.Now)); } //youtube releases in particular jump right to post-show PostShow(evt); } ~YoutubeHandler() { //Telefranz.Instance.removeHandler(agentReports); //Telefranz.Instance.removeHandler(checkReports); } protected void PreShow(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine($"it's the pre-show, showtime at: {evt.OccurrenceStart}"); preShow_GetAgents(evt, TimeSpan.FromMinutes(10)); preShow_RunChecks(evt, TimeSpan.FromMinutes(10)); Console.WriteLine("pre show seems to be set."); } protected void preShow_GetAgents(iCalHoopJumping.CalendarOccurrence evt, TimeSpan leadNeeded) { Console.WriteLine($"preshow agents needed: {string.Join(", ", AgentsNeeded)}"); agentsPresent.Clear(); Telefranz.Instance.addHandler(agentReports); Telefranz.Instance.ProduceMessage(new silver_messages.global.sound_off()); while (AgentsNeeded.Where(ap => !agentsPresent.Contains(ap))?.Count() > 0) { checkSignal.WaitOne(TimeSpan.FromSeconds(15)); //Telefranz.Instance.ProduceMessage(new silver_messages.global.sound_off()); if (DateTime.Now > evt.OccurrenceStart - leadNeeded) { var miaAgents = string.Join(", ", AgentsNeeded.Where(ap => !agentsPresent.Contains(ap))); HumanCommunication.Instance.Say($"Youtube handler getting antsy and going forward. mia agents: {miaAgents}", HumanCommunication.LogLevel.Warning); break; } } } protected void preShow_RunChecks(iCalHoopJumping.CalendarOccurrence evt, TimeSpan leadNeeded) { var argsList = new List() { JsonConvert.SerializeObject(evt) }; Telefranz.Instance.addHandler(youtubeAgentReports); Console.WriteLine($"pre show: run check. It's just going to be \"is the metadata set\"."); Action issueChecks = () => { //Telefranz.Instance.ProduceMessage(new silver_messages.youtube.request_metadata_needed()); }; issueChecks(); while (metadataUnset(metadataSoFar)) { //checkSignal.WaitOne(TimeSpan.FromHours(6)); //so bother me every 6 hours before yt release time if metadata isn't ready checkSignal.WaitOne(TimeSpan.FromSeconds(15)); if (DateTime.Now > evt.OccurrenceStart - leadNeeded) { HumanCommunication.Instance.Say($"Youtube handler reports no metadata in time! too late now though. {JsonConvert.SerializeObject(metadataSoFar)}", HumanCommunication.LogLevel.Error); break; } issueChecks(); } } protected void agentReports(silver_messages.global.report r) { Console.WriteLine($"agent responding to sound off: {r.name}"); if (AgentsNeeded?.FirstOrDefault(an => an.ToLower() == r.name.ToLower()) != null) { lock (agentsPresent) { agentsPresent.Add(r.name.ToLower()); checkSignal.Set(); } } } protected void youtubeAgentReports(silver_messages.youtube.metadata_needed neededmsg) { metadataSoFar = neededmsg.needed.Where(kvp => kvp.Key == "key")?.Select(kvp => kvp.Value)?.FirstOrDefault(); checkSignal.Set(); } protected bool metadataUnset(silver_messages.youtube.yt_metadata metadata) { return ( string.IsNullOrWhiteSpace(metadata.playlist) || metadata.recording == null || metadata.release == null || string.IsNullOrWhiteSpace(metadata.thumbnail) || string.IsNullOrWhiteSpace(metadata.title) ); } protected void PostShow(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine("there really isn't a post-show atm, but in future would be cool to pester matrix/discord/twitter"); //Telefranz.Instance.ProduceMessage(new silver_messages.directorial.execute_command("advertise")); } } }