using System; using System.Collections.Generic; using StardewModdingAPI.Events; namespace StardewModdingAPI { /// A command that can be submitted through the SMAPI console to interact with SMAPI. public class Command { /********* ** Properties *********/ /**** ** SMAPI ****/ /// The commands registered with SMAPI. internal static List RegisteredCommands = new List(); /// The event raised when this command is submitted through the console. public event EventHandler CommandFired; /**** ** Command ****/ /// The name of the command. public string CommandName; /// A human-readable description of what the command does. public string CommandDesc; /// A human-readable list of accepted arguments. public string[] CommandArgs; /// The actual submitted argument values. public string[] CalledArgs; /********* ** Public methods *********/ /**** ** Command ****/ /// Construct an instance. /// The name of the command. /// A human-readable description of what the command does. /// A human-readable list of accepted arguments. public Command(string name, string description, string[] args = null) { this.CommandName = name; this.CommandDesc = description; if (args == null) args = new string[0]; this.CommandArgs = args; } /// Trigger this command. public void Fire() { if (this.CommandFired == null) { Log.AsyncR($"Command failed to fire because it's fire event is null: {this.CommandName}"); return; } this.CommandFired.Invoke(this, new EventArgsCommand(this)); } /**** ** SMAPI ****/ /// Invoke the specified command. /// The command to run, including the command name and any arguments. public static void CallCommand(string input) { input = input.TrimEnd(' '); string[] args = new string[0]; Command command; if (input.Contains(" ")) { args = input.Split(new[] { " " }, 2, StringSplitOptions.RemoveEmptyEntries); command = Command.FindCommand(args[0]); args = args[1].Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); } else command = Command.FindCommand(input); if (command != null) { command.CalledArgs = args; command.Fire(); } else Log.AsyncR("Unknown command"); } /// Register a command with SMAPI. /// The name of the command. /// A human-readable description of what the command does. /// A human-readable list of accepted arguments. public static Command RegisterCommand(string name, string description, string[] args = null) { var command = new Command(name, description, args); if (Command.RegisteredCommands.Contains(command)) { Log.AsyncR($"Command already registered! [{command.CommandName}]"); return Command.RegisteredCommands.Find(x => x.Equals(command)); } Command.RegisteredCommands.Add(command); return command; } /// Find a command with the given name. /// The command name to find. public static Command FindCommand(string name) { return Command.RegisteredCommands.Find(x => x.CommandName.Equals(name)); } } }