@@ -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()); | |||