Minecraft-Console-Client/MinecraftClient/ChatBots/ScriptScheduler.cs

270 lines
11 KiB
C#
Raw Normal View History

using System;
using MinecraftClient.CommandHandler;
using MinecraftClient.Scripting;
2022-10-05 15:02:30 +08:00
using Tomlet.Attributes;
2022-10-05 17:10:10 +08:00
using static MinecraftClient.ChatBots.ScriptScheduler.Configs;
namespace MinecraftClient.ChatBots
{
/// <summary>
/// Trigger scripts on specific events
/// </summary>
public class ScriptScheduler : ChatBot
{
2022-10-05 15:02:30 +08:00
public static Configs Config = new();
[TomlDoNotInlineObject]
public class Configs
{
[NonSerialized]
private const string BotName = "ScriptScheduler";
public bool Enabled = false;
2022-10-05 20:41:37 +08:00
public TaskConfig[] TaskList = new TaskConfig[] {
new TaskConfig(
Task_Name: "Task Name 1",
Trigger_On_First_Login: false,
Trigger_On_Login: false,
Trigger_On_Times: new(true, new TimeSpan[] { new(14, 00, 00) }),
2022-10-08 17:56:32 +08:00
Trigger_On_Interval: new(true, 3.6, 4.8),
2022-10-05 20:41:37 +08:00
Action: "send /hello"
),
new TaskConfig(
Task_Name: "Task Name 2",
Trigger_On_First_Login: false,
Trigger_On_Login: true,
Trigger_On_Times: new(false, Array.Empty<TimeSpan>() ),
Trigger_On_Interval: new(false, 1, 10),
Action: "send /login pass"
),
};
2022-10-05 15:02:30 +08:00
public void OnSettingUpdate()
{
2022-10-05 17:10:10 +08:00
foreach (TaskConfig task in TaskList)
{
2022-10-08 17:56:32 +08:00
task.Trigger_On_Interval.MinTime = Math.Max(0.1, task.Trigger_On_Interval.MinTime);
task.Trigger_On_Interval.MaxTime = Math.Max(0.1, task.Trigger_On_Interval.MaxTime);
2022-10-05 17:33:21 +08:00
if (task.Trigger_On_Interval.MinTime > task.Trigger_On_Interval.MaxTime)
(task.Trigger_On_Interval.MinTime, task.Trigger_On_Interval.MaxTime) = (task.Trigger_On_Interval.MaxTime, task.Trigger_On_Interval.MinTime);
2022-10-05 17:10:10 +08:00
//Look for a valid action
if (!String.IsNullOrWhiteSpace(task.Action))
{
//Look for a valid trigger
if (task.Trigger_On_Login
|| task.Trigger_On_First_Login
|| (task.Trigger_On_Times.Enable && task.Trigger_On_Times.Times.Length > 0)
|| (task.Trigger_On_Interval.Enable && task.Trigger_On_Interval.MinTime > 0))
{
if (Settings.Config.Logging.DebugMessages)
LogToConsole(BotName, string.Format(Translations.bot_scriptScheduler_loaded_task, Task2String(task)));
2022-10-08 17:56:32 +08:00
task.Trigger_On_Interval_Countdown = Settings.DoubleToTick(task.Trigger_On_Interval.MinTime); //Init countdown for interval
2022-10-05 17:10:10 +08:00
}
else
{
if (Settings.Config.Logging.DebugMessages)
LogToConsole(BotName, string.Format(Translations.bot_scriptScheduler_no_trigger, Task2String(task)));
2022-10-05 17:10:10 +08:00
}
}
else
{
task.Action ??= string.Empty;
if (Settings.Config.Logging.DebugMessages)
LogToConsole(BotName, string.Format(Translations.bot_scriptScheduler_no_action, Task2String(task)));
2022-10-05 17:10:10 +08:00
}
}
2022-10-05 15:02:30 +08:00
2022-10-05 17:10:10 +08:00
if (Enabled && TaskList.Length == 0)
2022-10-05 15:02:30 +08:00
{
LogToConsole(BotName, Translations.general_bot_unload);
2022-10-05 15:02:30 +08:00
Enabled = false;
}
}
2022-10-05 17:10:10 +08:00
public class TaskConfig
{
public string Task_Name = "Task Name (Can be empty)";
public bool Trigger_On_First_Login = false;
public bool Trigger_On_Login = false;
public TriggerOnTimeConfig Trigger_On_Times = new(false, new TimeSpan[] { new(23, 59, 59) });
public TriggerOnIntervalConfig Trigger_On_Interval = new(false, 1, 10);
public string Action = "send /hello";
2022-10-05 17:10:10 +08:00
[NonSerialized]
public bool Trigger_On_Time_Already_Triggered = false;
2022-10-05 17:10:10 +08:00
[NonSerialized]
public int Trigger_On_Interval_Countdown = 0;
2022-10-05 20:41:37 +08:00
public TaskConfig() { }
public TaskConfig(string Task_Name, bool Trigger_On_First_Login, bool Trigger_On_Login, TriggerOnTimeConfig Trigger_On_Times, TriggerOnIntervalConfig Trigger_On_Interval, string Action)
{
this.Task_Name = Task_Name;
this.Trigger_On_First_Login = Trigger_On_First_Login;
this.Trigger_On_Login = Trigger_On_Login;
this.Trigger_On_Times = Trigger_On_Times;
this.Trigger_On_Interval = Trigger_On_Interval;
this.Action = Action;
}
2022-10-05 17:10:10 +08:00
public struct TriggerOnTimeConfig
{
2022-10-05 17:10:10 +08:00
public bool Enable = false;
public TimeSpan[] Times;
2022-10-05 17:10:10 +08:00
public TriggerOnTimeConfig(bool Enable, TimeSpan[] Time)
{
this.Enable = Enable;
this.Times = Time;
}
2022-10-05 17:10:10 +08:00
public TriggerOnTimeConfig(TimeSpan[] Time)
{
this.Enable = true;
this.Times = Time;
}
}
2022-10-05 17:10:10 +08:00
public struct TriggerOnIntervalConfig
{
2022-10-05 17:10:10 +08:00
public bool Enable = false;
2022-10-08 17:56:32 +08:00
public double MinTime, MaxTime;
2022-10-05 17:10:10 +08:00
2022-10-08 17:56:32 +08:00
public TriggerOnIntervalConfig(double value)
{
2022-10-05 17:10:10 +08:00
this.Enable = true;
MinTime = MaxTime = value;
}
2022-10-08 17:56:32 +08:00
public TriggerOnIntervalConfig(bool Enable, double value)
2022-10-05 17:10:10 +08:00
{
this.Enable = Enable;
MinTime = MaxTime = value;
}
2022-10-05 17:10:10 +08:00
2022-10-08 17:56:32 +08:00
public TriggerOnIntervalConfig(double min, double max)
{
2022-10-05 17:10:10 +08:00
this.MinTime = min;
this.MaxTime = max;
}
2022-10-08 17:56:32 +08:00
public TriggerOnIntervalConfig(bool Enable, double min, double max)
2022-10-05 17:10:10 +08:00
{
this.Enable = Enable;
this.MinTime = min;
this.MaxTime = max;
}
}
}
}
2022-10-05 17:10:10 +08:00
private Random random = new();
private static bool firstlogin_done = false;
private bool serverlogin_done = false;
private int verifytasks_timeleft = 10;
private readonly int verifytasks_delay = 10;
public override void Update()
{
if (verifytasks_timeleft <= 0)
{
verifytasks_timeleft = verifytasks_delay;
if (serverlogin_done)
{
2022-10-05 17:10:10 +08:00
foreach (TaskConfig task in Config.TaskList)
{
2022-10-05 17:10:10 +08:00
if (task.Trigger_On_Times.Enable)
{
bool matching_time_found = false;
2022-10-05 17:10:10 +08:00
foreach (TimeSpan time in task.Trigger_On_Times.Times)
{
2022-10-05 17:10:10 +08:00
if (time.Hours == DateTime.Now.Hour && time.Minutes == DateTime.Now.Minute)
{
matching_time_found = true;
2022-10-05 17:10:10 +08:00
if (!task.Trigger_On_Time_Already_Triggered)
{
2022-10-05 17:10:10 +08:00
task.Trigger_On_Time_Already_Triggered = true;
LogDebugToConsole(string.Format(Translations.bot_scriptScheduler_running_time, task.Action));
CmdResult response = new();
PerformInternalCommand(task.Action, ref response);
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
LogToConsole(response);
}
}
}
if (!matching_time_found)
2022-10-05 17:10:10 +08:00
task.Trigger_On_Time_Already_Triggered = false;
}
}
}
else
{
2022-10-05 17:10:10 +08:00
foreach (TaskConfig task in Config.TaskList)
{
2022-10-05 17:10:10 +08:00
if (task.Trigger_On_Login || (firstlogin_done == false && task.Trigger_On_First_Login))
{
LogDebugToConsole(string.Format(Translations.bot_scriptScheduler_running_login, task.Action));
CmdResult response = new();
PerformInternalCommand(task.Action, ref response);
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
LogToConsole(response);
}
}
firstlogin_done = true;
serverlogin_done = true;
}
}
else verifytasks_timeleft--;
2022-10-08 17:56:32 +08:00
foreach (TaskConfig task in Config.TaskList)
{
if (task.Trigger_On_Interval.Enable)
{
if (task.Trigger_On_Interval_Countdown == 0)
{
task.Trigger_On_Interval_Countdown = random.Next(
Settings.DoubleToTick(task.Trigger_On_Interval.MinTime), Settings.DoubleToTick(task.Trigger_On_Interval.MaxTime)
);
LogDebugToConsole(string.Format(Translations.bot_scriptScheduler_running_inverval, task.Action));
CmdResult response = new();
PerformInternalCommand(task.Action, ref response);
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
LogToConsole(response);
2022-10-08 17:56:32 +08:00
}
else task.Trigger_On_Interval_Countdown--;
}
}
}
public override bool OnDisconnect(DisconnectReason reason, string message)
{
serverlogin_done = false;
return false;
}
2022-10-05 17:10:10 +08:00
private static string Task2String(TaskConfig task)
{
return string.Format(
Translations.bot_scriptScheduler_task,
2022-10-05 17:10:10 +08:00
task.Trigger_On_First_Login,
task.Trigger_On_Login,
task.Trigger_On_Times.Enable,
task.Trigger_On_Interval.Enable,
2022-10-16 20:37:07 +08:00
string.Join(", ", Array.ConvertAll(task.Trigger_On_Times.Times, time => time.ToString())),
2022-10-05 17:10:10 +08:00
task.Trigger_On_Interval.MinTime + '-' + task.Trigger_On_Interval.MaxTime,
task.Action
);
}
}
}