diff options
Diffstat (limited to 'StardewModdingAPI/Command.cs')
-rw-r--r-- | StardewModdingAPI/Command.cs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/StardewModdingAPI/Command.cs b/StardewModdingAPI/Command.cs new file mode 100644 index 00000000..1659b1e9 --- /dev/null +++ b/StardewModdingAPI/Command.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StardewModdingAPI +{ + public class Command + { + internal static List<Command> RegisteredCommands = new List<Command>(); + + public String CommandName; + public String CommandDesc; + public String[] CommandArgs; + public String[] CalledArgs; + public delegate void CommandFireHandler(Command cmd); + public event CommandFireHandler CommandFired; + + /// <summary> + /// Calls the specified command. (It runs the command) + /// </summary> + /// <param name="input">The command to run</param> + public static void CallCommand(string input) + { + input = input.TrimEnd(new[] {' '}); + string[] args = new string[0]; + Command fnd; + if (input.Contains(" ")) + { + args = input.Split(new[] {" "}, 2, StringSplitOptions.RemoveEmptyEntries); + fnd = FindCommand(args[0]); + args = args[1].Split(new[] { " " }, 2, StringSplitOptions.RemoveEmptyEntries); + } + else + { + fnd = FindCommand(input); + } + + if (fnd != null) + { + fnd.CalledArgs = args; + fnd.Fire(); + } + else + { + Program.LogError("Unknown Command"); + } + } + + /// <summary> + /// Registers a command to the list of commands properly + /// </summary> + /// <param name="command">Name of the command to register</param> + /// <param name="cdesc">Description</param> + /// <param name="args">Arguments (these are purely for viewing so that a user can see what an argument needs to be)</param> + /// <returns></returns> + public static Command RegisterCommand(string command, string cdesc, string[] args = null) + { + Command c = new Command(command, cdesc, args); + if (RegisteredCommands.Contains(c)) + { + Program.LogError("Command already registered! [{0}]", c.CommandName); + return RegisteredCommands.Find(x => x.Equals(c)); + } + + RegisteredCommands.Add(c); + Program.LogColour(ConsoleColor.Cyan, "Registered command: " + command); + + return c; + } + + /// <summary> + /// Looks up a command in the list of registered commands. Returns null if it doesn't exist (I think) + /// </summary> + /// <param name="name">Name of command to find</param> + /// <returns></returns> + public static Command FindCommand(string name) + { + return RegisteredCommands.Find(x => x.CommandName.Equals(name)); + } + + /// <summary> + /// Creates a Command from a Name, Description, and Arguments + /// </summary> + /// <param name="cname">Name</param> + /// <param name="cdesc">Description</param> + /// <param name="args">Arguments</param> + public Command(String cname, String cdesc, String[] args = null) + { + CommandName = cname; + CommandDesc = cdesc; + if (args == null) + args = new string[0]; + CommandArgs = args; + } + + /// <summary> + /// Runs a command. Fires it. Calls it. Any of those. + /// </summary> + public void Fire() + { + if (CommandFired == null) + { + Program.LogError("Command failed to fire because it's fire event is null: " + CommandName); + return; + } + CommandFired.Invoke(this); + } + } +} |