2014-05-31 01:59:03 +02:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
|
|
|
|
|
|
|
namespace MinecraftClient.ChatBots
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Trigger scripts on specific events
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
|
|
|
|
public class ScriptScheduler : ChatBot
|
|
|
|
|
|
{
|
|
|
|
|
|
private class TaskDesc
|
|
|
|
|
|
{
|
|
|
|
|
|
public string script_file = null;
|
|
|
|
|
|
public bool triggerOnFirstLogin = false;
|
|
|
|
|
|
public bool triggerOnLogin = false;
|
|
|
|
|
|
public bool triggerOnTime = false;
|
2014-07-29 16:52:23 +02:00
|
|
|
|
public bool triggerOnInterval = false;
|
|
|
|
|
|
public int triggerOnInterval_Interval = 0;
|
|
|
|
|
|
public int triggerOnInterval_Interval_Countdown = 0;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
public List<DateTime> triggerOnTime_Times = new List<DateTime>();
|
2014-07-29 16:52:23 +02:00
|
|
|
|
public bool triggerOnTime_alreadyTriggered = false;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static bool firstlogin_done = false;
|
|
|
|
|
|
|
|
|
|
|
|
private string tasksfile;
|
|
|
|
|
|
private bool serverlogin_done;
|
|
|
|
|
|
private List<TaskDesc> tasks = new List<TaskDesc>();
|
|
|
|
|
|
private int verifytasks_timeleft = 10;
|
|
|
|
|
|
private int verifytasks_delay = 10;
|
|
|
|
|
|
|
|
|
|
|
|
public ScriptScheduler(string tasksfile)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.tasksfile = tasksfile;
|
|
|
|
|
|
serverlogin_done = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
//Load the given file from the startup parameters
|
|
|
|
|
|
if (System.IO.File.Exists(tasksfile))
|
|
|
|
|
|
{
|
2018-05-08 19:27:19 +02:00
|
|
|
|
if (Settings.DebugMessages)
|
|
|
|
|
|
LogToConsole("Loading tasks from '" + tasksfile + "'");
|
2014-05-31 01:59:03 +02:00
|
|
|
|
TaskDesc current_task = null;
|
|
|
|
|
|
String[] lines = System.IO.File.ReadAllLines(tasksfile);
|
|
|
|
|
|
foreach (string lineRAW in lines)
|
|
|
|
|
|
{
|
|
|
|
|
|
string line = lineRAW.Split('#')[0].Trim();
|
|
|
|
|
|
if (line.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (line[0] == '[' && line[line.Length - 1] == ']')
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (line.Substring(1, line.Length - 2).ToLower())
|
|
|
|
|
|
{
|
|
|
|
|
|
case "task":
|
|
|
|
|
|
checkAddTask(current_task);
|
|
|
|
|
|
current_task = new TaskDesc(); //Create a blank task
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (current_task != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
string argName = line.Split('=')[0];
|
|
|
|
|
|
if (line.Length > (argName.Length + 1))
|
|
|
|
|
|
{
|
|
|
|
|
|
string argValue = line.Substring(argName.Length + 1);
|
|
|
|
|
|
switch (argName.ToLower())
|
|
|
|
|
|
{
|
|
|
|
|
|
case "triggeronfirstlogin": current_task.triggerOnFirstLogin = Settings.str2bool(argValue); break;
|
|
|
|
|
|
case "triggeronlogin": current_task.triggerOnLogin = Settings.str2bool(argValue); break;
|
|
|
|
|
|
case "triggerontime": current_task.triggerOnTime = Settings.str2bool(argValue); break;
|
2014-07-29 16:52:23 +02:00
|
|
|
|
case "triggeroninterval": current_task.triggerOnInterval = Settings.str2bool(argValue); break;
|
|
|
|
|
|
case "timevalue": try { current_task.triggerOnTime_Times.Add(DateTime.ParseExact(argValue, "HH:mm", CultureInfo.InvariantCulture)); } catch { } break;
|
|
|
|
|
|
case "timeinterval": int interval = 1; int.TryParse(argValue, out interval); current_task.triggerOnInterval_Interval = interval; break;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
case "script": current_task.script_file = argValue; break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
checkAddTask(current_task);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
LogToConsole("File not found: '" + tasksfile + "'");
|
|
|
|
|
|
UnloadBot(); //No need to keep the bot active
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void checkAddTask(TaskDesc current_task)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (current_task != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//Check if we built a valid task before adding it
|
2018-05-08 19:27:19 +02:00
|
|
|
|
if (Script.LookForScript(ref current_task.script_file)) //Check if file exists
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2018-05-08 19:27:19 +02:00
|
|
|
|
if (current_task.script_file != null
|
|
|
|
|
|
&& (current_task.triggerOnLogin
|
|
|
|
|
|
|| current_task.triggerOnFirstLogin
|
|
|
|
|
|
|| (current_task.triggerOnTime && current_task.triggerOnTime_Times.Count > 0))
|
|
|
|
|
|
|| (current_task.triggerOnInterval && current_task.triggerOnInterval_Interval > 0)) //Look for a valid trigger
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Settings.DebugMessages)
|
|
|
|
|
|
LogToConsole("Loaded task:\n" + Task2String(current_task));
|
|
|
|
|
|
current_task.triggerOnInterval_Interval_Countdown = current_task.triggerOnInterval_Interval; //Init countdown for interval
|
|
|
|
|
|
tasks.Add(current_task);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (Settings.DebugMessages)
|
|
|
|
|
|
{
|
|
|
|
|
|
LogToConsole("This task will never trigger:\n" + Task2String(current_task));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (Settings.DebugMessages)
|
|
|
|
|
|
{
|
|
|
|
|
|
LogToConsole("No valid script for task:\n" + Task2String(current_task));
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void Update()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (verifytasks_timeleft <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
verifytasks_timeleft = verifytasks_delay;
|
|
|
|
|
|
if (serverlogin_done)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (TaskDesc task in tasks)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (task.triggerOnTime)
|
|
|
|
|
|
{
|
2014-07-29 16:52:23 +02:00
|
|
|
|
bool matching_time_found = false;
|
|
|
|
|
|
|
2014-05-31 01:59:03 +02:00
|
|
|
|
foreach (DateTime time in task.triggerOnTime_Times)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (time.Hour == DateTime.Now.Hour && time.Minute == DateTime.Now.Minute)
|
|
|
|
|
|
{
|
2014-07-29 16:52:23 +02:00
|
|
|
|
matching_time_found = true;
|
|
|
|
|
|
if (!task.triggerOnTime_alreadyTriggered)
|
2014-05-31 01:59:03 +02:00
|
|
|
|
{
|
2014-07-29 16:52:23 +02:00
|
|
|
|
task.triggerOnTime_alreadyTriggered = true;
|
2018-05-08 19:27:19 +02:00
|
|
|
|
if (Settings.DebugMessages)
|
|
|
|
|
|
LogToConsole("Time / Running script: " + task.script_file);
|
2014-05-31 01:59:03 +02:00
|
|
|
|
RunScript(task.script_file);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2014-07-29 16:52:23 +02:00
|
|
|
|
|
|
|
|
|
|
if (!matching_time_found)
|
|
|
|
|
|
task.triggerOnTime_alreadyTriggered = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (task.triggerOnInterval)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (task.triggerOnInterval_Interval_Countdown == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
task.triggerOnInterval_Interval_Countdown = task.triggerOnInterval_Interval;
|
2018-05-08 19:27:19 +02:00
|
|
|
|
if (Settings.DebugMessages)
|
|
|
|
|
|
LogToConsole("Interval / Running script: " + task.script_file);
|
2014-07-29 16:52:23 +02:00
|
|
|
|
RunScript(task.script_file);
|
|
|
|
|
|
}
|
|
|
|
|
|
else task.triggerOnInterval_Interval_Countdown--;
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (TaskDesc task in tasks)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (task.triggerOnLogin || (firstlogin_done == false && task.triggerOnFirstLogin))
|
2018-05-08 19:27:19 +02:00
|
|
|
|
{
|
|
|
|
|
|
if (Settings.DebugMessages)
|
|
|
|
|
|
LogToConsole("Login / Running script: " + task.script_file);
|
2014-05-31 01:59:03 +02:00
|
|
|
|
RunScript(task.script_file);
|
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
|
|
|
|
|
|
|
|
|
|
private static string Task2String(TaskDesc task)
|
|
|
|
|
|
{
|
|
|
|
|
|
return String.Format(
|
2018-05-23 19:07:31 +02:00
|
|
|
|
" triggeronfirstlogin = {0}\n triggeronlogin = {1}\n triggerontime = {2}\n "
|
2018-05-08 19:27:19 +02:00
|
|
|
|
+ "triggeroninterval = {3}\n timevalue = {4}\n timeinterval = {5}\n script = {6}",
|
|
|
|
|
|
task.triggerOnFirstLogin,
|
|
|
|
|
|
task.triggerOnLogin,
|
|
|
|
|
|
task.triggerOnTime,
|
|
|
|
|
|
task.triggerOnInterval,
|
|
|
|
|
|
String.Join(", ", task.triggerOnTime_Times),
|
|
|
|
|
|
task.triggerOnInterval_Interval,
|
|
|
|
|
|
task.script_file
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2014-05-31 01:59:03 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|