/// <summary> /// Returns a human-readable list of flags. /// </summary> /// <returns>The flag list.</returns> public string FlagInfo() { if (Flags == CVarFlag.None) { return "None"; } ListTag list = new ListTag(); foreach (CVarFlag flag in Enum.GetValues(typeof(CVarFlag))) { if (flag != CVarFlag.None && Flags.HasFlag(flag)) { list.ListEntries.Add(new TextTag(flag.ToString())); } } return list.Formatted(); }
public override void Execute(CommandEntry entry) { if (entry.Arguments.Count < 1) { ShowUsage(entry); } else { string type = entry.GetArgument(0); if (type == "\0CALLBACK") { if (entry.BlockOwner.Command.Name == "foreach" || entry.BlockOwner.Block == null || entry.BlockOwner.Block.Count == 0 || entry.BlockOwner.Block[entry.BlockOwner.Block.Count - 1] != entry) { ForeachCommandData data = (ForeachCommandData)entry.BlockOwner.Data; data.Index++; if (data.Index > data.List.Count) { entry.Good("Foreach loop ending, reached target."); } else { entry.Good("Foreach loop continuing at index <{color.emphasis}>" + data.Index + "/" + data.List.Count + "<{color.base}>..."); entry.Queue.SetVariable("foreach_index", new TextTag(data.Index.ToString())); entry.Queue.SetVariable("foreach_total", new TextTag(data.List.Count.ToString())); entry.Queue.SetVariable("foreach_value", data.List[data.Index - 1]); entry.Queue.SetVariable("foreach_list", new ListTag(data.List)); entry.Queue.AddCommandsNow(entry.BlockOwner.Block); } } else { entry.Bad("Foreach CALLBACK invalid: not a real callback!"); } } else if (type.ToLower() == "stop") { bool hasnext = false; for (int i = 0; i < entry.Queue.CommandList.Length; i++) { if (entry.Queue.GetCommand(i).Command is ForeachCommand && entry.Queue.GetCommand(i).Arguments[0] == "\0CALLBACK") { hasnext = true; break; } } if (hasnext) { entry.Good("Stopping foreach loop."); while (entry.Queue.CommandList.Length > 0) { if (entry.Queue.GetCommand(0).Command is ForeachCommand && entry.Queue.GetCommand(0).Arguments[0] == "\0CALLBACK") { entry.Queue.RemoveCommand(0); break; } entry.Queue.RemoveCommand(0); } } else { entry.Bad("Cannot stop foreach: not in one!"); } } else if (type.ToLower() == "next") { bool hasnext = false; for (int i = 0; i < entry.Queue.CommandList.Length; i++) { if (entry.Queue.GetCommand(0).Command is ForeachCommand && entry.Queue.GetCommand(0).Arguments[0] == "\0CALLBACK") { hasnext = true; break; } } if (hasnext) { entry.Good("Skipping to next foreach entry..."); while (entry.Queue.CommandList.Length > 0) { if (entry.Queue.GetCommand(0).Command is ForeachCommand && entry.Queue.GetCommand(0).Arguments[0] == "\0CALLBACK") { break; } entry.Queue.RemoveCommand(0); } } else { entry.Bad("Cannot stop foreach: not in one!"); } } else if (type.ToLower() == "start" && entry.Arguments.Count > 1) { ListTag list = new ListTag(entry.GetArgument(1)); int target = list.ListEntries.Count; if (target <= 0) { entry.Good("Not looping."); return; } ForeachCommandData data = new ForeachCommandData(); data.Index = 1; data.List = list.ListEntries; entry.Data = data; if (entry.Block != null) { entry.Good("Foreach looping <{color.emphasis}>" + target + "<{color.base}> times..."); CommandEntry callback = new CommandEntry("foreach \0CALLBACK", null, entry, this, new List<string> { "\0CALLBACK" }, "foreach", 0); entry.Block.Add(callback); entry.Queue.SetVariable("foreach_index", new TextTag("1")); entry.Queue.SetVariable("foreach_total", new TextTag(target.ToString())); entry.Queue.SetVariable("foreach_value", list.ListEntries[0]); entry.Queue.SetVariable("foreach_list", list); entry.Queue.AddCommandsNow(entry.Block); } else { entry.Bad("Foreach invalid: No block follows!"); } } else { ShowUsage(entry); } } }
/// <summary> /// Executes the run command. /// </summary> /// <param name="entry">The command details to be ran.</param> public override void Execute(CommandEntry entry) { if (entry.Arguments.Count < 1) { ShowUsage(entry); entry.Finished = true; return; } string fname = entry.GetArgument(0).ToLower(); ScriptRanPreEventArgs args = new ScriptRanPreEventArgs(); args.ScriptName = fname; if (OnScriptRanPreEvent != null) { OnScriptRanPreEvent.Fire(args); } if (args.Cancelled) { entry.Bad("Script running cancelled via the ScriptRanPreEvent."); return; } CommandScript script = entry.Queue.CommandSystem.GetScript(args.ScriptName); if (script != null) { ScriptRanEventArgs args2 = new ScriptRanEventArgs(); args2.Script = script; if (OnScriptRanEvent != null) { OnScriptRanEvent.Fire(args2); } if (args2.Cancelled) { entry.Bad("Script running cancelled via the ScriptRanEvent."); return; } if (script == null) { entry.Bad("Script running nullified via the ScriptRanEvent."); return; } script = args2.Script; entry.Good("Running '<{color.emphasis}>" + TagParser.Escape(fname) + "<{color.base}>'..."); CommandQueue queue; entry.Queue.CommandSystem.ExecuteScript(script, null, out queue); if (!queue.Running) { entry.Finished = true; } else { EntryFinisher fin = new EntryFinisher() { Entry = entry }; queue.Complete += fin.Complete; } ScriptRanPostEventArgs args4 = new ScriptRanPostEventArgs(); args4.Script = script; args4.Determinations = new List<string>(queue.Determinations); if (OnScriptRanPostEvent != null) { OnScriptRanPostEvent.Fire(args4); } ListTag list = new ListTag(queue.Determinations); entry.Queue.SetVariable("run_determinations", list); } else { entry.Bad("Cannot run script '<{color.emphasis}>" + TagParser.Escape(fname) + "<{color.base}>': file does not exist!"); entry.Finished = true; } }
/// <summary> /// Parse any direct tag input values. /// </summary> /// <param name="data">The input tag data.</param> public override string Handle(TagData data) { if (data.Input.Count == 0) { return ToString(); } switch (data.Input[0]) { // <--[tag] // @Name ListTag.size // @Group List Attributes // @ReturnType TextTag // @Returns the number of entries in the list. // @Example "one|two|three" .size returns "3". // --> case "size": return new TextTag(ListEntries.Count.ToString()).Handle(data.Shrink()); // <--[tag] // @Name ListTag.comma_separated // @Group List Attributes // @ReturnType TextTag // @Returns the list in a user-friendly comma-separated format. // @Example "one|two|three" .comma_separated returns "one, two, three". // --> case "comma_separated": return new TextTag(ToCSString()).Handle(data.Shrink()); // <--[tag] // @Name ListTag.space_separated // @Group List Attributes // @ReturnType TextTag // @Returns the list in a space-separated format. // @Example "one|two|three" .space_separated returns "one two three". // --> case "space_separated": return new TextTag(ToSpaceString()).Handle(data.Shrink()); // <--[tag] // @Name ListTag.unseparated // @Group List Attributes // @ReturnType TextTag // @Returns the list as an unseparated string. // @Example "one|two|three" .unseparated returns "onetwothree". // --> case "unseparated": return new TextTag(ToFlatString()).Handle(data.Shrink()); // <--[tag] // @Name ListTag.formatted // @Group List Attributes // @ReturnType TextTag // @Returns the list in a user-friendly format. // @Example "one|two|three" .formatted returns "one, two, and three", // @Example "one|two" .formatted returns "one and two". // --> case "formatted": return new TextTag(Formatted()).Handle(data.Shrink()); // <--[tag] // @Name ListTag.reversed // @Group List Attributes // @ReturnType ListTag // @Returns the list entirely backwards. // @Example "one|two|three" .reversed returns "three|two|one". // --> case "reversed": { ListTag newlist = new ListTag(ListEntries); newlist.ListEntries.Reverse(); return newlist.Handle(data.Shrink()); } // <--[tag] // @Name ListTag.first // @Group List Attributes // @ReturnType Dynamic // @Returns the first entry in the list. // @Example "one|two|three" .first returns "one". // --> case "first": if (ListEntries.Count == 0) { return new TextTag("&null").Handle(data.Shrink()); } return ListEntries[0].Handle(data.Shrink()); // <--[tag] // @Name ListTag.random // @Group List Attributes // @ReturnType Dynamic // @Returns a random entry from the list // @Example "one|two|three" .random returns "one", "two", or "three". // --> case "random": if (ListEntries.Count == 0) { return new TextTag("&null").Handle(data.Shrink()); } return ListEntries[data.TagSystem.CommandSystem.random.Next(ListEntries.Count)].Handle(data.Shrink()); // <--[tag] // @Name ListTag.last // @Group List Attributes // @ReturnType Dynamic // @Returns the last entry in the list. // @Example "one|two|three" .last returns "three". // --> case "last": if (ListEntries.Count == 0) { return new TextTag("&null").Handle(data.Shrink()); } return ListEntries[ListEntries.Count - 1].Handle(data.Shrink()); // <--[tag] // @Name ListTag.get[<TextTag>] // @Group List Attributes // @ReturnType Dynamic // @Returns the specified entry in the list. // @Other note that indices are one-based. // @Example "one|two|three" .get[2] returns "two". // --> case "get": { int number = FreneticUtilities.StringToInt(data.GetModifier(0)) - 1; if (ListEntries.Count == 0) { return new TextTag("&null").Handle(data.Shrink()); } if (number < 0) { number = 0; } if (number >= ListEntries.Count) { number = ListEntries.Count - 1; } return ListEntries[number].Handle(data.Shrink()); } // <--[tag] // @Name ListTag.range[<TextTag>,<TextTag>] // @Group List Attributes // @ReturnType ListTag<Dynamic> // @Returns the specified set of entries in the list. // @Other note that indices are one-based. // @Example "one|two|three|four" .range[2,3] returns "two|three". // @Example "one|two|three" .range[2,1] returns an empty list. // @Example "one|two|three" .range[2,2] returns "two". // --> case "range": { string[] split = data.GetModifier(0).Split(','); if (split.Length != 2) { return new TextTag("&null").Handle(data.Shrink()); } if (ListEntries.Count == 0) { return new TextTag("&null").Handle(data.Shrink()); } int number = FreneticUtilities.StringToInt(split[0]) - 1; int number2 = FreneticUtilities.StringToInt(split[1]) - 1; if (number < 0) { number = 0; } if (number2 < 0) { number2 = 0; } if (number >= ListEntries.Count) { number = ListEntries.Count - 1; } if (number2 >= ListEntries.Count) { number2 = ListEntries.Count - 1; } if (number2 < number) { return new ListTag("").Handle(data.Shrink()); } List<TemplateObject> Entries = new List<TemplateObject>(); for (int i = number; i <= number2; i++) { Entries.Add(ListEntries[i]); } return new ListTag(Entries).Handle(data.Shrink()); } default: return new TextTag(ToString()).Handle(data); } }
public override void Execute(CommandEntry entry) { if (entry.Arguments.Count < 2) { ShowUsage(entry); } else { string type = entry.GetArgument(0).ToLower(); bool run = false; if (type == "run") { run = true; } else if (type == "inject") { run = false; } else { ShowUsage(entry); return; } string fname = entry.GetArgument(1); if (fname == "\0CALLBACK") { return; } fname = fname.ToLower(); CommandScript script = entry.Queue.CommandSystem.GetFunction(fname); if (script != null) { entry.Good("Calling '<{color.emphasis}>" + TagParser.Escape(fname) + "<{color.base}>' (" + (run ? "run": "inject") + ")..."); List<CommandEntry> block = script.GetEntries(); block.Add(new CommandEntry("call \0CALLBACK", null, entry, this, new List<string> { "\0CALLBACK" }, "call", 0)); if (run) { CommandQueue queue; entry.Queue.CommandSystem.ExecuteScript(script, null, out queue); if (!queue.Running) { entry.Finished = true; } else { EntryFinisher fin = new EntryFinisher() { Entry = entry }; queue.Complete += new EventHandler<CommandQueueEventArgs>(fin.Complete); } ListTag list = new ListTag(queue.Determinations); entry.Queue.SetVariable("call_determinations", list); } else { entry.Queue.AddCommandsNow(block); } } else { entry.Bad("Cannot call function '<{color.emphasis}>" + TagParser.Escape(fname) + "<{color.base}>': it does not exist!"); } } }