182 lines
8.4 KiB
C#
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.");
|
|
}
|
|
}
|
|
} |