director/showHandlers/YoutubeHandler.cs

182 lines
8.4 KiB
C#

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<string> agentsPresent = new List<string>();
private Dictionary<string, bool> checksProgress = new Dictionary<string, bool>();
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<YoutubeRelease>(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<silver_messages.global.report>(agentReports);
//Telefranz.Instance.removeHandler<silver_messages.directorial.check_complete>(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<silver_messages.global.report>(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<string>() { 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<string>() { 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<string>() { 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.");
}
}
}