| @@ -2,6 +2,18 @@ | |||
| namespace Discord.Commands | |||
| { | |||
| public class CommandPart | |||
| { | |||
| public string Value { get; } | |||
| public int Index { get; } | |||
| internal CommandPart(string value, int index) | |||
| { | |||
| Value = value; | |||
| Index = index; | |||
| } | |||
| } | |||
| //TODO: Check support for escaping | |||
| public static class CommandParser | |||
| { | |||
| @@ -14,24 +26,24 @@ namespace Discord.Commands | |||
| DoubleQuotedParameter | |||
| } | |||
| public static bool Parse(string input, out string command, out string[] args) | |||
| public static bool Parse(string input, out string command, out CommandPart[] args) | |||
| { | |||
| return Parse(input, out command, out args, true); | |||
| } | |||
| public static bool ParseArgs(string input, out string[] args) | |||
| public static bool ParseArgs(string input, out CommandPart[] args) | |||
| { | |||
| string ignored; | |||
| return Parse(input, out ignored, out args, false); | |||
| } | |||
| private static bool Parse(string input, out string command, out string[] args, bool parseCommand) | |||
| private static bool Parse(string input, out string command, out CommandPart[] args, bool parseCommand) | |||
| { | |||
| CommandParserPart currentPart = parseCommand ? CommandParserPart.CommandName : CommandParserPart.None; | |||
| int startPosition = 0; | |||
| int endPosition = 0; | |||
| int inputLength = input.Length; | |||
| bool isEscaped = false; | |||
| List<string> argList = new List<string>(); | |||
| List<CommandPart> argList = new List<CommandPart>(); | |||
| command = null; | |||
| args = null; | |||
| @@ -84,7 +96,7 @@ namespace Discord.Commands | |||
| else | |||
| { | |||
| currentPart = CommandParserPart.None; | |||
| argList.Add(temp); | |||
| argList.Add(new CommandPart(temp, startPosition)); | |||
| startPosition = endPosition; | |||
| } | |||
| } | |||
| @@ -94,7 +106,7 @@ namespace Discord.Commands | |||
| { | |||
| string temp = input.Substring(startPosition, endPosition - startPosition - 1); | |||
| currentPart = CommandParserPart.None; | |||
| argList.Add(temp); | |||
| argList.Add(new CommandPart(temp, startPosition)); | |||
| startPosition = endPosition; | |||
| } | |||
| else if (endPosition >= inputLength) | |||
| @@ -105,7 +117,7 @@ namespace Discord.Commands | |||
| { | |||
| string temp = input.Substring(startPosition, endPosition - startPosition - 1); | |||
| currentPart = CommandParserPart.None; | |||
| argList.Add(temp); | |||
| argList.Add(new CommandPart(temp, startPosition)); | |||
| startPosition = endPosition; | |||
| } | |||
| else if (endPosition >= inputLength) | |||
| @@ -8,6 +8,7 @@ namespace Discord.Commands | |||
| public Message Message { get; } | |||
| public Command Command { get; } | |||
| public string CommandText { get; } | |||
| public string ArgText { get; } | |||
| public int? Permissions { get; } | |||
| public string[] Args { get; } | |||
| @@ -19,11 +20,12 @@ namespace Discord.Commands | |||
| public Server Server => Message.Channel.Server; | |||
| public string ServerId => Message.Channel.ServerId; | |||
| public CommandEventArgs(Message message, Command command, string commandText, int? permissions, string[] args) | |||
| public CommandEventArgs(Message message, Command command, string commandText, string argText, int? permissions, string[] args) | |||
| { | |||
| Message = message; | |||
| Command = command; | |||
| CommandText = commandText; | |||
| ArgText = argText; | |||
| Permissions = permissions; | |||
| Args = args; | |||
| } | |||
| @@ -33,7 +35,7 @@ namespace Discord.Commands | |||
| public Exception Exception { get; } | |||
| public CommandErrorEventArgs(CommandEventArgs baseArgs, Exception ex) | |||
| : base(baseArgs.Message, baseArgs.Command, baseArgs.CommandText, baseArgs.Permissions, baseArgs.Args) | |||
| : base(baseArgs.Message, baseArgs.Command, baseArgs.CommandText, baseArgs.ArgText, baseArgs.Permissions, baseArgs.Args) | |||
| { | |||
| Exception = ex; | |||
| } | |||
| @@ -54,7 +54,7 @@ namespace Discord.Commands | |||
| return; | |||
| } | |||
| string[] args; | |||
| CommandPart[] args; | |||
| if (!CommandParser.ParseArgs(msg, out args)) | |||
| return; | |||
| @@ -69,7 +69,7 @@ namespace Discord.Commands | |||
| bool isValid = true; | |||
| for (int j = 0; j < cmd.Parts.Length; j++) | |||
| { | |||
| if (!string.Equals(args[j], cmd.Parts[j], StringComparison.OrdinalIgnoreCase)) | |||
| if (!string.Equals(args[j].Value, cmd.Parts[j], StringComparison.OrdinalIgnoreCase)) | |||
| { | |||
| isValid = false; | |||
| break; | |||
| @@ -86,11 +86,18 @@ namespace Discord.Commands | |||
| //Clean Args | |||
| string[] newArgs = new string[argCount]; | |||
| for (int j = 0; j < newArgs.Length; j++) | |||
| newArgs[j] = args[j + cmd.Parts.Length]; | |||
| newArgs[j] = args[j + cmd.Parts.Length].Value; | |||
| //Get ArgText | |||
| string argText; | |||
| if (argCount == 0) | |||
| argText = ""; | |||
| else | |||
| argText = msg.Substring(args[cmd.Parts.Length].Index); | |||
| //Check Permissions | |||
| int permissions = _getPermissions != null ? _getPermissions(e.Message.User, e.Message.Channel?.Server) : 0; | |||
| var eventArgs = new CommandEventArgs(e.Message, cmd, msg, permissions, newArgs); | |||
| int permissions = _getPermissions != null ? _getPermissions(e.Message.User, e.Message.Channel?.Server) : 0; | |||
| var eventArgs = new CommandEventArgs(e.Message, cmd, msg, argText, permissions, newArgs); | |||
| if (permissions < cmd.MinPerms) | |||
| { | |||
| RaiseCommandError(eventArgs, new PermissionException()); | |||