director/ShowHandler.cs
Adam R. Grey c4d994f76b rework progress
todo: don't have containers, just have each line be "text" if you want
2021-10-13 09:25:03 -04:00

100 lines
3.2 KiB
C#

using System;
using System.Collections;
using System.Linq;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using schedulable;
using System.Collections.Generic;
namespace director
{
public class ShowHandler
{
private Scheduled todo;
private string outputPath;
public ShowHandler(Scheduled todo, string outputPath)
{
this.todo = todo;
this.outputPath = outputPath;
}
internal void StartHandling()
{
Console.WriteLine("start handling");
CreateChecklist();
var napLength = (todo.Showtime - todo.Configuration.LeadTimeDesired) - DateTime.Now;
Console.WriteLine($"napping until {todo.Showtime - todo.Configuration.LeadTimeDesired} ({napLength})");
if (napLength.TotalMinutes > 0)
{
Task.WaitAll(Task.Delay(napLength));
}
Console.WriteLine("nap done, begin the checklist. which to us effectively means SHOWTIME");
//or do I want to split the checklists in the config file? consider later.
try
{
HandleChecklist();
}
catch (Exception e)
{
HumanCommunication.Instance.Say($"error in show handler! Panicking!\n{JsonConvert.SerializeObject(e)}", HumanCommunication.LogLevel.Showstopper);
}
}
private void CreateChecklist()
{
Console.WriteLine($"begin the pre-pre show by creating a checklist.");
Directory.CreateDirectory(outputPath);
var text = new StringBuilder();
text.AppendLine($"# {todo.Occurrence._event.Description}");
#region share with humans
var allItems = checklistFlattened();
if(allItems?.FirstOrDefault(pl => pl.type == "manual") != null)
{
Console.WriteLine($"nothing manual, not sharing with humans.");
}
else
{
//TODO: share
}
#endregion
}
private IEnumerable<ProcessionLine> checklistFlattened()
{
if (todo.Configuration.checklist?.Count() > 0)
{
var toReturn = new List<ProcessionLine>();
foreach(var line in todo.Configuration.checklist)
{
toReturn.AddRange(recurseChecklist(line));
}
return toReturn;
}
return null;
}
private IEnumerable<ProcessionLine> recurseChecklist(ProcessionLine line)
{
var asContainer = line as container;
if (asContainer == null || asContainer.subitems?.Count() == 0)
{
return new List<ProcessionLine>() { line };
}
else
{
var toReturn = new List<ProcessionLine>();
toReturn.AddRange(recurseChecklist(line));
return toReturn;
}
}
internal void HandleChecklist()
{
Console.WriteLine($"should now be at the desired lead time. showtime: {todo.Showtime}");
}
}
}