director/showHandlers/YoutubeHandler.cs

127 lines
5.1 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);
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<YoutubeRelease>(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<silver_messages.global.report>(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<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.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<string>() { 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.");
}
}
}