2014-05-31 01:59:03 +02:00
|
|
|
|
using System;
|
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;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
|
|
|
|
|
|
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) }),
|
|
|
|
|
|
Trigger_On_Interval: new(true, 10, 20),
|
|
|
|
|
|
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-05 17:33:21 +08:00
|
|
|
|
task.Trigger_On_Interval.MinTime = Math.Max(1, task.Trigger_On_Interval.MinTime);
|
|
|
|
|
|
task.Trigger_On_Interval.MaxTime = Math.Max(1, task.Trigger_On_Interval.MaxTime);
|
|
|
|
|
|
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, Translations.TryGet("bot.scriptScheduler.loaded_task", Task2String(task)));
|
|
|
|
|
|
task.Trigger_On_Interval_Countdown = task.Trigger_On_Interval.MinTime; //Init countdown for interval
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Settings.Config.Logging.DebugMessages)
|
|
|
|
|
|
LogToConsole(BotName, Translations.TryGet("bot.scriptScheduler.no_trigger", Task2String(task)));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
task.Action ??= string.Empty;
|
|
|
|
|
|
if (Settings.Config.Logging.DebugMessages)
|
|
|
|
|
|
LogToConsole(BotName, Translations.TryGet("bot.scriptScheduler.no_action", Task2String(task)));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
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.TryGet("general.bot_unload"));
|
|
|
|
|
|
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";
|
2014-05-31 01:59:03 +02:00
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
[NonSerialized]
|
|
|
|
|
|
public bool Trigger_On_Time_Already_Triggered = false;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
[NonSerialized]
|
|
|
|
|
|
public int Trigger_On_Interval_Countdown = 0;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
|
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
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
public bool Enable = false;
|
|
|
|
|
|
public TimeSpan[] Times;
|
2022-09-26 00:28:29 +02:00
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
public TriggerOnTimeConfig(bool Enable, TimeSpan[] Time)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.Enable = Enable;
|
|
|
|
|
|
this.Times = Time;
|
|
|
|
|
|
}
|
2022-09-26 00:28:29 +02:00
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
public TriggerOnTimeConfig(TimeSpan[] Time)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.Enable = true;
|
|
|
|
|
|
this.Times = Time;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
public struct TriggerOnIntervalConfig
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
public bool Enable = false;
|
|
|
|
|
|
public int MinTime, MaxTime;
|
|
|
|
|
|
|
|
|
|
|
|
public TriggerOnIntervalConfig(int value)
|
2018-05-08 19:27:19 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
this.Enable = true;
|
|
|
|
|
|
MinTime = MaxTime = value;
|
|
|
|
|
|
}
|
2022-09-26 00:28:29 +02:00
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
public TriggerOnIntervalConfig(bool Enable, int value)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.Enable = Enable;
|
|
|
|
|
|
MinTime = MaxTime = value;
|
2018-05-08 19:27:19 +02:00
|
|
|
|
}
|
2022-10-05 17:10:10 +08:00
|
|
|
|
|
|
|
|
|
|
public TriggerOnIntervalConfig(int min, int max)
|
2018-05-08 19:27:19 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
this.MinTime = min;
|
|
|
|
|
|
this.MaxTime = max;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public TriggerOnIntervalConfig(bool Enable, int min, int max)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.Enable = Enable;
|
|
|
|
|
|
this.MinTime = min;
|
|
|
|
|
|
this.MaxTime = max;
|
2018-05-08 19:27:19 +02:00
|
|
|
|
}
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
2014-05-31 01:59:03 +02:00
|
|
|
|
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)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
if (task.Trigger_On_Times.Enable)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2014-07-29 16:52:23 +02:00
|
|
|
|
bool matching_time_found = false;
|
2022-09-26 00:28:29 +02:00
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
foreach (TimeSpan time in task.Trigger_On_Times.Times)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
if (time.Hours == DateTime.Now.Hour && time.Minutes == DateTime.Now.Minute)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2014-07-29 16:52:23 +02:00
|
|
|
|
matching_time_found = true;
|
2022-10-05 17:10:10 +08:00
|
|
|
|
if (!task.Trigger_On_Time_Already_Triggered)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
task.Trigger_On_Time_Already_Triggered = true;
|
|
|
|
|
|
LogDebugToConsoleTranslated("bot.scriptScheduler.running_time", task.Action);
|
|
|
|
|
|
PerformInternalCommand(task.Action);
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2014-07-29 16:52:23 +02:00
|
|
|
|
|
|
|
|
|
|
if (!matching_time_found)
|
2022-10-05 17:10:10 +08:00
|
|
|
|
task.Trigger_On_Time_Already_Triggered = false;
|
2014-07-29 16:52:23 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-05 17:10:10 +08:00
|
|
|
|
if (task.Trigger_On_Interval.Enable)
|
2014-07-29 16:52:23 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
if (task.Trigger_On_Interval_Countdown == 0)
|
2014-07-29 16:52:23 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
task.Trigger_On_Interval_Countdown = random.Next(task.Trigger_On_Interval.MinTime, task.Trigger_On_Interval.MaxTime);
|
|
|
|
|
|
LogDebugToConsoleTranslated("bot.scriptScheduler.running_inverval", task.Action);
|
|
|
|
|
|
PerformInternalCommand(task.Action);
|
2014-07-29 16:52:23 +02:00
|
|
|
|
}
|
2022-10-05 17:10:10 +08:00
|
|
|
|
else task.Trigger_On_Interval_Countdown--;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
foreach (TaskConfig task in Config.TaskList)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
if (task.Trigger_On_Login || (firstlogin_done == false && task.Trigger_On_First_Login))
|
2018-05-08 19:27:19 +02:00
|
|
|
|
{
|
2022-10-05 17:10:10 +08:00
|
|
|
|
LogDebugToConsoleTranslated("bot.scriptScheduler.running_login", task.Action);
|
|
|
|
|
|
PerformInternalCommand(task.Action);
|
2018-05-08 19:27:19 +02:00
|
|
|
|
}
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
firstlogin_done = true;
|
|
|
|
|
|
serverlogin_done = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else verifytasks_timeleft--;
|
|
|
|
|
|
}
|
2018-05-08 19:27:19 +02:00
|
|
|
|
|
2019-08-04 15:52:41 +02:00
|
|
|
|
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)
|
2018-05-08 19:27:19 +02:00
|
|
|
|
{
|
2020-10-17 19:41:31 +08:00
|
|
|
|
return Translations.Get(
|
|
|
|
|
|
"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,
|
|
|
|
|
|
task.Trigger_On_Times.Times,
|
|
|
|
|
|
task.Trigger_On_Interval.MinTime + '-' + task.Trigger_On_Interval.MaxTime,
|
|
|
|
|
|
task.Action
|
2018-05-08 19:27:19 +02:00
|
|
|
|
);
|
|
|
|
|
|
}
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|