Skip to content

Commit 861084d

Browse files
authored
bugfix: Fixed inventory sync and Script Scheduler dupliating instances of bots on reconnects
bugfix: Fixed inventory sync and Script Scheduler dupliating instances of bots on reconnects
2 parents 654d9d4 + 71f935e commit 861084d

8 files changed

Lines changed: 250 additions & 65 deletions

File tree

MinecraftClient/ChatBots/Script.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class Script : ChatBot
2525
private bool csharp;
2626
private Thread? thread;
2727
private readonly Dictionary<string, object>? localVars;
28+
private readonly string? scriptOwnerKey;
2829

2930
public Script(string filename)
3031
{
@@ -38,6 +39,13 @@ public Script(string filename, string? ownername, Dictionary<string, object>? lo
3839
this.localVars = localVars;
3940
}
4041

42+
internal Script(string filename, string? ownername, Dictionary<string, object>? localVars, string? scriptOwnerKey)
43+
: this(filename, ownername, localVars)
44+
{
45+
this.scriptOwnerKey = scriptOwnerKey;
46+
SetScriptOwnerKey(scriptOwnerKey);
47+
}
48+
4149
private void ParseArguments(string argstr)
4250
{
4351
List<string> args = new();
@@ -166,7 +174,7 @@ public override void Update()
166174
{
167175
try
168176
{
169-
CSharpRunner.Run(this, lines, args, localVars, scriptName: file!);
177+
CSharpRunner.Run(this, lines, args, localVars, scriptName: file!, scriptOwnerKey: scriptOwnerKey);
170178
}
171179
catch (CSharpException e)
172180
{

MinecraftClient/ChatBots/ScriptScheduler.cs

Lines changed: 81 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -183,76 +183,62 @@ public TriggerOnIntervalConfig(bool Enable, double min, double max)
183183
private int verifytasks_timeleft = Settings.ClientTicksPerSecond;
184184
private readonly int verifytasks_delay = Settings.ClientTicksPerSecond;
185185

186+
public override void AfterGameJoined()
187+
{
188+
if (serverlogin_done)
189+
return;
190+
191+
serverlogin_done = true;
192+
verifytasks_timeleft = verifytasks_delay;
193+
RunLoginTasks();
194+
}
195+
186196
public override void Update()
187197
{
198+
if (!serverlogin_done)
199+
return;
200+
188201
if (verifytasks_timeleft <= 0)
189202
{
190203
verifytasks_timeleft = verifytasks_delay;
191-
if (serverlogin_done)
204+
for (int taskIndex = 0; taskIndex < Config.TaskList.Length; taskIndex++)
192205
{
193-
foreach (TaskConfig task in Config.TaskList)
206+
TaskConfig task = Config.TaskList[taskIndex];
207+
if (task.Trigger_On_Times.Enable)
194208
{
195-
if (task.Trigger_On_Times.Enable)
196-
{
197-
bool matching_time_found = false;
209+
bool matching_time_found = false;
198210

199-
foreach (TimeSpan time in task.Trigger_On_Times.Times)
211+
foreach (TimeSpan time in task.Trigger_On_Times.Times)
212+
{
213+
if (time.Hours == DateTime.Now.Hour && time.Minutes == DateTime.Now.Minute)
200214
{
201-
if (time.Hours == DateTime.Now.Hour && time.Minutes == DateTime.Now.Minute)
215+
matching_time_found = true;
216+
if (!task.Trigger_On_Time_Already_Triggered)
202217
{
203-
matching_time_found = true;
204-
if (!task.Trigger_On_Time_Already_Triggered)
205-
{
206-
task.Trigger_On_Time_Already_Triggered = true;
207-
LogDebugToConsole(string.Format(Translations.bot_scriptScheduler_running_time, task.Action));
208-
CmdResult response = new();
209-
PerformInternalCommand(task.Action, ref response);
210-
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
211-
LogToConsole(response);
212-
}
218+
task.Trigger_On_Time_Already_Triggered = true;
219+
RunTaskAction(task, taskIndex, string.Format(Translations.bot_scriptScheduler_running_time, task.Action));
213220
}
214221
}
215-
216-
if (!matching_time_found)
217-
task.Trigger_On_Time_Already_Triggered = false;
218222
}
219223

224+
if (!matching_time_found)
225+
task.Trigger_On_Time_Already_Triggered = false;
220226
}
221227
}
222-
else
223-
{
224-
foreach (TaskConfig task in Config.TaskList)
225-
{
226-
if (task.Trigger_On_Login || (firstlogin_done == false && task.Trigger_On_First_Login))
227-
{
228-
LogDebugToConsole(string.Format(Translations.bot_scriptScheduler_running_login, task.Action));
229-
CmdResult response = new();
230-
PerformInternalCommand(task.Action, ref response);
231-
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
232-
LogToConsole(response);
233-
}
234-
}
235-
236-
firstlogin_done = true;
237-
serverlogin_done = true;
238-
}
239228
}
240229
else verifytasks_timeleft--;
241230

242-
foreach (TaskConfig task in Config.TaskList)
231+
for (int taskIndex = 0; taskIndex < Config.TaskList.Length; taskIndex++)
243232
{
233+
TaskConfig task = Config.TaskList[taskIndex];
244234
if (task.Trigger_On_Interval.Enable)
245235
{
246236
if (task.Trigger_On_Interval_Countdown == 0)
247237
{
248238
task.Trigger_On_Interval_Countdown = random.Next(
249239
Settings.DoubleToTick(task.Trigger_On_Interval.MinTime), Settings.DoubleToTick(task.Trigger_On_Interval.MaxTime)
250240
);
251-
LogDebugToConsole(string.Format(Translations.bot_scriptScheduler_running_inverval, task.Action));
252-
CmdResult response = new();
253-
PerformInternalCommand(task.Action, ref response);
254-
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
255-
LogToConsole(response);
241+
RunTaskAction(task, taskIndex, string.Format(Translations.bot_scriptScheduler_running_inverval, task.Action));
256242
}
257243
else task.Trigger_On_Interval_Countdown--;
258244
}
@@ -265,6 +251,58 @@ public override bool OnDisconnect(DisconnectReason reason, string message)
265251
return false;
266252
}
267253

254+
private void RunLoginTasks()
255+
{
256+
bool isFirstLogin = !firstlogin_done;
257+
258+
for (int taskIndex = 0; taskIndex < Config.TaskList.Length; taskIndex++)
259+
{
260+
TaskConfig task = Config.TaskList[taskIndex];
261+
if (task.Trigger_On_Login || (isFirstLogin && task.Trigger_On_First_Login))
262+
RunTaskAction(task, taskIndex, string.Format(Translations.bot_scriptScheduler_running_login, task.Action));
263+
}
264+
265+
firstlogin_done = true;
266+
}
267+
268+
private void RunTaskAction(TaskConfig task, int taskIndex, string debugMessage)
269+
{
270+
LogDebugToConsole(debugMessage);
271+
272+
if (TryRunOwnedScript(task, taskIndex))
273+
return;
274+
275+
CmdResult response = new();
276+
PerformInternalCommand(task.Action, ref response);
277+
if (response.status != CmdResult.Status.Done || !string.IsNullOrWhiteSpace(response.result))
278+
LogToConsole(response);
279+
}
280+
281+
private bool TryRunOwnedScript(TaskConfig task, int taskIndex)
282+
{
283+
string action = task.Action.Trim();
284+
const string scriptCommand = "script";
285+
if (!action.StartsWith(scriptCommand, StringComparison.OrdinalIgnoreCase))
286+
return false;
287+
288+
if (action.Length == scriptCommand.Length || !char.IsWhiteSpace(action[scriptCommand.Length]))
289+
return false;
290+
291+
string scriptArgs = action[scriptCommand.Length..].Trim();
292+
if (string.IsNullOrWhiteSpace(scriptArgs))
293+
return false;
294+
295+
string scriptOwnerKey = BuildScriptOwnerKey(task, taskIndex);
296+
Handler.UnloadBotsByScriptOwnerKey(scriptOwnerKey);
297+
Handler.BotLoad(new Script(scriptArgs, null, null, scriptOwnerKey));
298+
return true;
299+
}
300+
301+
private static string BuildScriptOwnerKey(TaskConfig task, int taskIndex)
302+
{
303+
return $"{nameof(ScriptScheduler)}:{taskIndex}:{task.Task_Name}:{task.Action.Trim()}";
304+
}
305+
268306
private static string Task2String(TaskConfig task)
269307
{
270308
return string.Format(

0 commit comments

Comments
 (0)