diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 9ca2b200..e9853157 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -93,89 +93,7 @@ namespace TShockAPI } public static class Commands { - public static List ChatCommands = new List(); - - /// - /// Parses a string of parameters into a list. Handles quotes. - /// - /// - /// - public static List ParseParameters(string str) - { - var ret = new List(); - var sb = new StringBuilder(); - bool instr = false; - for (int i = 0; i < str.Length; i++) - { - char c = str[i]; - - if (instr) - { - if (c == '\\') - { - if (i + 1 >= str.Length) - break; - c = GetEscape(str[++i]); - } - else if (c == '"') - { - ret.Add(sb.ToString()); - sb.Clear(); - instr = false; - continue; - } - sb.Append(c); - } - else - { - if (IsWhiteSpace(c)) - { - if (sb.Length > 0) - { - ret.Add(sb.ToString()); - sb.Clear(); - } - } - else if (c == '"') - { - if (sb.Length > 0) - { - ret.Add(sb.ToString()); - sb.Clear(); - } - instr = true; - } - else - { - sb.Append(c); - } - } - } - if (sb.Length > 0) - ret.Add(sb.ToString()); - - return ret; - } - - static char GetEscape(char c) - { - switch (c) - { - case '\\': - return '\\'; - case '"': - return '"'; - case 't': - return '\t'; - default: - return c; - } - } - - static bool IsWhiteSpace(char c) - { - return c == ' ' || c == '\t' || c == '\n'; - } + private static List ChatCommands = new List(); public static void InitCommands() { @@ -235,6 +153,128 @@ namespace TShockAPI Commands.ChatCommands.Add(new Command("updatenow", "maintenance", Commands.UpdateNow)); } + public static bool HandleCommand(TSPlayer player, string text) + { + string cmdText = text.Remove(0, 1); + + var args = Commands.ParseParameters(cmdText); + if (args.Count < 1) + return false; + + string cmdName = args[0]; + args.RemoveAt(0); + + Command cmd = null; + foreach (Command command in Commands.ChatCommands) + { + if (command.Name.Equals(cmdName)) + { + cmd = command; + } + } + + if (cmd == null) + { + player.SendMessage("That command does not exist, try /help", Color.Red); + } + else + { + if (!cmd.CanRun(player)) + { + Tools.SendLogs(string.Format("{0} tried to execute {1}", player.Name, cmd.Name), Color.Red); + player.SendMessage("You do not have access to that command.", Color.Red); + } + else + { + Tools.SendLogs(string.Format("{0} executed: /{1}", player.Name, cmdText), Color.Red); + cmd.Run(cmdText, player, args); + } + } + return true; + } + + /// + /// Parses a string of parameters into a list. Handles quotes. + /// + /// + /// + private static List ParseParameters(string str) + { + var ret = new List(); + var sb = new StringBuilder(); + bool instr = false; + for (int i = 0; i < str.Length; i++) + { + char c = str[i]; + + if (instr) + { + if (c == '\\') + { + if (i + 1 >= str.Length) + break; + c = GetEscape(str[++i]); + } + else if (c == '"') + { + ret.Add(sb.ToString()); + sb.Clear(); + instr = false; + continue; + } + sb.Append(c); + } + else + { + if (IsWhiteSpace(c)) + { + if (sb.Length > 0) + { + ret.Add(sb.ToString()); + sb.Clear(); + } + } + else if (c == '"') + { + if (sb.Length > 0) + { + ret.Add(sb.ToString()); + sb.Clear(); + } + instr = true; + } + else + { + sb.Append(c); + } + } + } + if (sb.Length > 0) + ret.Add(sb.ToString()); + + return ret; + } + + private static char GetEscape(char c) + { + switch (c) + { + case '\\': + return '\\'; + case '"': + return '"'; + case 't': + return '\t'; + default: + return c; + } + } + + private static bool IsWhiteSpace(char c) + { + return c == ' ' || c == '\t' || c == '\n'; + } + #region Player Management Commands private static void Kick(CommandArgs args) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index a1bbcae4..1e726df4 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -249,33 +249,8 @@ namespace TShockAPI } else if (text.StartsWith("/")) { - string cmdStr = text.Remove(0, 1); - var args = Commands.ParseParameters(cmdStr); - if (args.Count < 1) - return; - - string scmd = args[0]; - args.RemoveAt(0); - - Command cmd = null; - for (int i = 0; i < Commands.ChatCommands.Count; i++) - { - if (Commands.ChatCommands[i].Name.Equals(scmd)) - { - cmd = Commands.ChatCommands[i]; - } - } - - if (cmd == null) - { - TSPlayer.Server.SendMessage("That command does not exist, try /help"); - } - else - { - Tools.SendLogs(string.Format("{0} executed: /{1}", TSPlayer.Server.Name, cmdStr), Color.Red); - cmd.Run(cmdStr, TSPlayer.Server, args); - } - e.Handled = true; + if (Commands.HandleCommand(TSPlayer.Server, text)) + e.Handled = true; } } @@ -685,42 +660,8 @@ namespace TShockAPI if (text.StartsWith("/")) { - text = text.Remove(0, 1); - - var args = Commands.ParseParameters(text); - if (args.Count < 1) - return; - - string scmd = args[0]; - args.RemoveAt(0); - - Command cmd = null; - for (int i = 0; i < Commands.ChatCommands.Count; i++) - { - if (Commands.ChatCommands[i].Name.Equals(scmd)) - { - cmd = Commands.ChatCommands[i]; - } - } - - if (cmd == null) - { - tsplr.SendMessage("That command does not exist, try /help", Color.Red); - } - else - { - if (!cmd.CanRun(tsplr)) - { - Tools.SendLogs(string.Format("{0} tried to execute {1}", tsplr.Name, cmd.Name), Color.Red); - tsplr.SendMessage("You do not have access to that command.", Color.Red); - } - else - { - Tools.SendLogs(string.Format("{0} executed: /{1}", tsplr.Name, text), Color.Red); - cmd.Run(text, tsplr, args); - } - } - e.Handled = true; + if (Commands.HandleCommand(tsplr, text)) + e.Handled = true; } else {