107 lines
3.4 KiB
C#
107 lines
3.4 KiB
C#
using Core;
|
|
using KubernetesWorkflow;
|
|
using KubernetesWorkflow.Types;
|
|
using Utils;
|
|
|
|
namespace CodexDiscordBotPlugin
|
|
{
|
|
public class CodexDiscordBotPlugin : IProjectPlugin, IHasLogPrefix, IHasMetadata
|
|
{
|
|
private const string ExpectedStartupMessage = "Debug option is set. Discord connection disabled!";
|
|
private readonly IPluginTools tools;
|
|
|
|
public CodexDiscordBotPlugin(IPluginTools tools)
|
|
{
|
|
this.tools = tools;
|
|
}
|
|
|
|
public string LogPrefix => "(DiscordBot) ";
|
|
|
|
public void Announce()
|
|
{
|
|
tools.GetLog().Log($"Codex DiscordBot (BiblioTech) loaded.");
|
|
}
|
|
|
|
public void AddMetadata(IAddMetadata metadata)
|
|
{
|
|
metadata.Add("codexdiscordbotid", new DiscordBotContainerRecipe().Image);
|
|
}
|
|
|
|
public void Decommission()
|
|
{
|
|
}
|
|
|
|
public RunningPod Deploy(DiscordBotStartupConfig config)
|
|
{
|
|
var workflow = tools.CreateWorkflow();
|
|
return StartContainer(workflow, config);
|
|
}
|
|
|
|
public RunningPod DeployRewarder(RewarderBotStartupConfig config)
|
|
{
|
|
var workflow = tools.CreateWorkflow();
|
|
return StartRewarderContainer(workflow, config);
|
|
}
|
|
|
|
private RunningPod StartContainer(IStartupWorkflow workflow, DiscordBotStartupConfig config)
|
|
{
|
|
var startupConfig = new StartupConfig();
|
|
startupConfig.NameOverride = config.Name;
|
|
startupConfig.Add(config);
|
|
var pod = workflow.Start(1, new DiscordBotContainerRecipe(), startupConfig).WaitForOnline();
|
|
WaitForStartupMessage(workflow, pod);
|
|
workflow.CreateCrashWatcher(pod.Containers.Single()).Start();
|
|
return pod;
|
|
}
|
|
|
|
private RunningPod StartRewarderContainer(IStartupWorkflow workflow, RewarderBotStartupConfig config)
|
|
{
|
|
var startupConfig = new StartupConfig();
|
|
startupConfig.NameOverride = config.Name;
|
|
startupConfig.Add(config);
|
|
var pod = workflow.Start(1, new RewarderBotContainerRecipe(), startupConfig).WaitForOnline();
|
|
workflow.CreateCrashWatcher(pod.Containers.Single()).Start();
|
|
return pod;
|
|
}
|
|
|
|
private void WaitForStartupMessage(IStartupWorkflow workflow, RunningPod pod)
|
|
{
|
|
var finder = new LogLineFinder(ExpectedStartupMessage, workflow);
|
|
Time.WaitUntil(() =>
|
|
{
|
|
finder.FindLine(pod);
|
|
return finder.Found;
|
|
}, nameof(WaitForStartupMessage));
|
|
}
|
|
|
|
public class LogLineFinder : LogHandler
|
|
{
|
|
private readonly string message;
|
|
private readonly IStartupWorkflow workflow;
|
|
|
|
public LogLineFinder(string message, IStartupWorkflow workflow)
|
|
{
|
|
this.message = message;
|
|
this.workflow = workflow;
|
|
}
|
|
|
|
public void FindLine(RunningPod pod)
|
|
{
|
|
Found = false;
|
|
foreach (var c in pod.Containers)
|
|
{
|
|
workflow.DownloadContainerLog(c, this);
|
|
if (Found) return;
|
|
}
|
|
}
|
|
|
|
public bool Found { get; private set; }
|
|
|
|
protected override void ProcessLine(string line)
|
|
{
|
|
if (!Found && line.Contains(message)) Found = true;
|
|
}
|
|
}
|
|
}
|
|
}
|