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); 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); 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}"); config.PreShow.AgentsNeeded = config.PreShow.AgentsNeeded.Select(s => s.ToLower()).ToList(); var commandLeadNeeded = TimeSpan.FromMinutes(15); foreach(var cl in config.PreShow.Commands) { if(cl.leadTime > commandLeadNeeded){ commandLeadNeeded = cl.leadTime; } } preShow_GetAgents(evt, commandLeadNeeded + TimeSpan.FromMinutes(10)); preShow_RunChecks(evt, commandLeadNeeded); preShow_RunCommands(evt); Console.WriteLine("pre show seems to be set."); } protected void preShow_GetAgents(iCalHoopJumping.CalendarOccurrence evt, TimeSpan leadNeeded) { 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.FromSeconds(15)); if(DateTime.Now > evt.OccurrenceStart - leadNeeded) { 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, TimeSpan leadNeeded) { checksProgress.Clear(); var argsList = new List() { JsonConvert.SerializeObject(evt) }; //Telefranz.Instance.addHandler() foreach (var c in config.PreShow.Checks) { checksProgress.Add(c.cmd, false); } Console.WriteLine($"pre show: run checks: {string.Join(", ", config.PreShow.Checks.Select(c => c.cmd))}"); Action issueChecks = () => { foreach (var checkCmd in checksProgress.Where(cp => cp.Value == false).Select(kvp => kvp.Key)) { var check = config.PreShow.Checks.First(clc => clc.cmd == checkCmd); // Telefranz.Instance.ProduceMessage(new silver_messages.directorial.execute_check() // { // check = check.cmd, // args = argsList.Append(check.args).ToList() // }); } }; issueChecks(); while (checksProgress.ContainsValue(false)) { checkSignal.WaitOne(TimeSpan.FromSeconds(15)); if(DateTime.Now > evt.OccurrenceStart - leadNeeded) { var stillFailing = string.Join(", ", checksProgress.Where(cp => cp.Value == false).Select(cp => cp.Key)); HumanCommunication.Instance.Say($"Youtube handler getting antsy and going forward. checks still failing: {stillFailing}", HumanCommunication.LogLevel.Error); break; } issueChecks(); } Console.WriteLine("going forward"); } protected void preShow_RunCommands(iCalHoopJumping.CalendarOccurrence evt) { Console.WriteLine($"pre show: run commands: {string.Join(", ", config.PreShow.Commands.Select(c => c.cmd))}"); foreach(var cmd in config.PreShow.Commands.OrderByDescending(cmd => cmd.leadTime)) { if(DateTime.Now < evt.OccurrenceStart - cmd.leadTime) { var waitTime = evt.OccurrenceStart - cmd.leadTime - DateTime.Now; Console.WriteLine($"waiting {waitTime} before executing {cmd.cmd}"); Task.WaitAll(Task.Delay(waitTime)); } var argsList = new List() { JsonConvert.SerializeObject(evt) }.Append(cmd.args).ToList(); Console.WriteLine($"telefranzing execution: {cmd.cmd} with args {string.Join(' ', argsList)}"); // Telefranz.Instance.ProduceMessage(new silver_messages.directorial.execute_command() // { // command = cmd.cmd, // args = argsList, // timeout = (int)cmd.timeout.TotalMilliseconds //TODO: update when franz gets updated // }); } Console.WriteLine("seems all pre-show commands have been issued, but to be fair I wasn't listening for output."); } 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($"post show: run commands: {string.Join(", ", config.PostShow.Commands.Select(c => c.cmd))}"); foreach(var cmd in config.PostShow.Commands) { var argsList = new List() { JsonConvert.SerializeObject(evt) }.Append(cmd.args).ToList(); Console.WriteLine($"telefranzing execution: {cmd.cmd} with args {string.Join(' ', argsList)}"); // Telefranz.Instance.ProduceMessage(new silver_messages.directorial.execute_command() // { // command = cmd.cmd, // args = argsList, // timeout = (int)cmd.timeout.TotalMilliseconds //TODO: update when franz gets updated // }); } Console.WriteLine("seems all post-show commands have been issued, but to be fair I wasn't listening for output."); } } }