Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <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;
                }
            }
        }
    }