/// <summary>Executes the command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">Entry to be executed.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { if (entry.IsCallback) { return; } string id = entry.GetArgument(queue, 0).ToLowerFast(); if (queue.Engine.OnceBlocks.Add(id)) { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Once block has not yet ran, continuing."); } return; } string errorMode = entry.Arguments.Length > 1 ? entry.GetArgument(queue, 1).ToLowerFast() : "error"; if (errorMode == "quiet") { if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Once block repeated, ignoring: " + TextStyle.Separate + id); } queue.CurrentRunnable.Index = entry.BlockEnd + 1; } else if (errorMode == "warning") { entry.BadOutput(queue, "Once block repeated: " + TextStyle.Separate + id); queue.CurrentRunnable.Index = entry.BlockEnd + 1; } else { queue.HandleError(entry, "Once block repeated: " + id); } }
/// <summary>Executes the run command.</summary> /// <param name="queue">The command queue involved.</param> /// <param name="entry">The command details to be ran.</param> public static void Execute(CommandQueue queue, CommandEntry entry) { string fname = entry.GetArgument(queue, 0).ToLowerFast(); ScriptRanPreEventArgs args = new() { ScriptName = fname }; RunfileCommand rcmd = entry.Command as RunfileCommand; if (rcmd.OnScriptRanPreEvent != null) { rcmd.OnScriptRanPreEvent.Fire(args); } if (args.Cancelled) { entry.BadOutput(queue, "Script running cancelled via the ScriptRanPreEvent."); if (entry.WaitFor && queue.WaitingOn == entry) { queue.WaitingOn = null; } return; } CommandScript script = queue.Engine.GetScriptFile(args.ScriptName, out string status); if (script != null) { ScriptRanEventArgs args2 = new() { Script = script }; if (rcmd.OnScriptRanEvent != null) { rcmd.OnScriptRanEvent.Fire(args2); } if (args2.Cancelled) { entry.BadOutput(queue, "Script running cancelled via the ScriptRanEvent."); if (entry.WaitFor && queue.WaitingOn == entry) { queue.WaitingOn = null; } return; } if (script == null) { entry.BadOutput(queue, "Script running nullified via the ScriptRanEvent."); if (entry.WaitFor && queue.WaitingOn == entry) { queue.WaitingOn = null; } return; } script = args2.Script; if (entry.ShouldShowGood(queue)) { entry.GoodOutput(queue, "Running '" + TextStyle.Separate + fname + TextStyle.Base + "'..."); } Dictionary <string, TemplateObject> vars = new(); queue.Engine.ExecuteScript(script, ref vars, out CommandQueue nqueue); if (entry.WaitFor && queue.WaitingOn == entry) { if (!nqueue.Running) { queue.WaitingOn = null; } else { EntryFinisher fin = new() { Entry = entry, Queue = queue }; nqueue.Complete += fin.Complete; } } ScriptRanPostEventArgs args4 = new() { Script = script }; if (rcmd.OnScriptRanPostEvent != null) { rcmd.OnScriptRanPostEvent.Fire(args4); } // TODO: queue.SetVariable("run_variables", new MapTag(nqueue.LowestVariables)); // TODO: use the ^= syntax here. } else { queue.HandleError(entry, "Cannot run script '" + TextStyle.Separate + fname + TextStyle.Base + "': " + status + "!"); if (entry.WaitFor && queue.WaitingOn == entry) { queue.WaitingOn = null; } } } }