cs-codex-dist-tests/ProjectPlugins/CodexDiscordBotPlugin/CodexDiscordBotPlugin.cs

107 lines
3.4 KiB
C#
Raw Normal View History

2023-10-24 07:51:29 +00:00
using Core;
using KubernetesWorkflow;
using KubernetesWorkflow.Types;
using Utils;
2023-10-24 07:51:29 +00:00
namespace CodexDiscordBotPlugin
{
public class CodexDiscordBotPlugin : IProjectPlugin, IHasLogPrefix, IHasMetadata
{
private const string ExpectedStartupMessage = "Debug option is set. Discord connection disabled!";
2023-10-24 07:51:29 +00:00
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);
2023-10-24 07:51:29 +00:00
}
public void Decommission()
{
}
2024-04-13 14:09:17 +00:00
public RunningPod Deploy(DiscordBotStartupConfig config)
2023-10-24 07:51:29 +00:00
{
2023-10-24 08:06:07 +00:00
var workflow = tools.CreateWorkflow();
return StartContainer(workflow, config);
}
2024-04-13 14:09:17 +00:00
public RunningPod DeployRewarder(RewarderBotStartupConfig config)
2024-01-31 16:52:02 +00:00
{
var workflow = tools.CreateWorkflow();
return StartRewarderContainer(workflow, config);
}
2024-04-13 14:09:17 +00:00
private RunningPod StartContainer(IStartupWorkflow workflow, DiscordBotStartupConfig config)
{
2023-10-24 08:06:07 +00:00
var startupConfig = new StartupConfig();
startupConfig.NameOverride = config.Name;
startupConfig.Add(config);
var pod = workflow.Start(1, new DiscordBotContainerRecipe(), startupConfig).WaitForOnline();
WaitForStartupMessage(workflow, pod);
2024-06-21 07:18:00 +00:00
workflow.CreateCrashWatcher(pod.Containers.Single()).Start();
return pod;
}
2024-01-31 16:52:02 +00:00
2024-04-13 14:09:17 +00:00
private RunningPod StartRewarderContainer(IStartupWorkflow workflow, RewarderBotStartupConfig config)
2024-01-31 16:52:02 +00:00
{
var startupConfig = new StartupConfig();
startupConfig.NameOverride = config.Name;
2024-01-31 16:52:02 +00:00
startupConfig.Add(config);
2024-06-21 07:18:00 +00:00
var pod = workflow.Start(1, new RewarderBotContainerRecipe(), startupConfig).WaitForOnline();
workflow.CreateCrashWatcher(pod.Containers.Single()).Start();
return pod;
2024-01-31 16:52:02 +00:00
}
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;
}
}
2023-10-24 07:51:29 +00:00
}
}