Пример #1
0
 /// <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();
 }
Пример #2
0
 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);
         }
     }
 }
Пример #3
0
 /// <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;
     }
 }
Пример #4
0
 /// <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);
     }
 }
Пример #5
0
 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!");
         }
     }
 }