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