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 YoutubeRelease config; private List agentsPresent = new List(); private Dictionary checksProgress = new Dictionary(); private readonly AutoResetEvent checkSignal = new AutoResetEvent(false); protected override TimeSpan AgentsRespondingBuffer { get { return TimeSpan.FromHours(1); } } public override void Handle(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine($"begin youtube handler. current time {DateTime.Now.ToLongTimeString()}"); Console.WriteLine(JsonConvert.SerializeObject(evt)); var ytConfig = File.ReadAllText(Program.conf.show_template_yt_release); config = JsonConvert.DeserializeObject(ytConfig); config.PreShow.AgentsNeeded = config.PreShow.AgentsNeeded.Select(s => s.ToLower()).ToList(); 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); } protected void PreShow(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine($"it's the pre-show, showtime at: {evt.OccurrenceStart}"); preShow_GetAgents(evt); preShow_RunChecks(evt); preShow_RunCommands(evt); } protected void preShow_GetAgents(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine($"preshow agents needed: {string.Join(", ", config.PreShow.AgentsNeeded)}"); agentsPresent.Clear(); //TODO: actual telefranz //Telefranz.Instance.addHandler(agentReports); //Telefranz.Instance.ProduceMessage(new silver_messages.global.sound_off()); while (config.PreShow.AgentsNeeded.Where(ap => !agentsPresent.Contains(ap))?.Count() > 0) { checkSignal.WaitOne(TimeSpan.FromMinutes(1)); if(DateTime.Now > evt.OccurrenceStart - AgentsRespondingBuffer) { var miaAgents = string.Join(", ", config.PreShow.AgentsNeeded.Where(ap => !agentsPresent.Contains(ap))); HumanCommunication.Instance.Say($"Youtube handler getting antsy and going forward. mia agents: {miaAgents}", HumanCommunication.LogLevel.Error); break; } } Console.WriteLine("going forward"); } protected void preShow_RunChecks(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine("pre show: run checks:"); //TODO checksProgress.Clear(); var argsList = new List() { JsonConvert.SerializeObject(evt) }; //Telefranz.Instance.addHandler() foreach (var c in config.PreShow.Checks) { checksProgress.Add(c.cmd, false); Telefranz.Instance.ProduceMessage(new silver_messages.directorial.execute_check() { check = c.cmd, args = argsList.Append(c.args).ToList() }); } while (true) { checkSignal.WaitOne(TimeSpan.FromSeconds(45)); } } protected void preShow_RunCommands(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine("pre show: run commands"); } protected void agentReports(silver_messages.global.report r) { if (config.PreShow.AgentsNeeded?.FirstOrDefault(an => an.ToLower() == r.name.ToLower()) != null) { lock (agentsPresent) { agentsPresent.Add(r.name.ToLower()); checkSignal.Set(); } } } protected void checkReports(silver_messages.directorial.check_complete check) { var myCheck = config.PreShow.Checks.FirstOrDefault(psc => psc.cmd == check.check); if (myCheck != null) { lock (checksProgress) { checksProgress[myCheck.cmd] = check.result == myCheck.target; } checkSignal.Set(); } } protected void PostShow(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine("can't do this bit without understanding when a show ends, sooo."); } } }