@@ -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