Implement Command Aliasestags/1.0-rc
@@ -0,0 +1,18 @@ | |||
using System; | |||
namespace Discord.Commands | |||
{ | |||
/// <summary> Provides aliases for a command. </summary> | |||
[AttributeUsage(AttributeTargets.Method)] | |||
public class AliasAttribute : Attribute | |||
{ | |||
/// <summary> The aliases which have been defined for the command. </summary> | |||
public string[] Aliases { get; } | |||
/// <summary> Creates a new <see cref="AliasAttribute"/> with the given aliases. </summary> | |||
public AliasAttribute(params string[] aliases) | |||
{ | |||
Aliases = aliases; | |||
} | |||
} | |||
} |
@@ -25,6 +25,7 @@ namespace Discord.Commands | |||
public string Summary { get; } | |||
public string Text { get; } | |||
public bool HasVarArgs { get; } | |||
public IReadOnlyList<string> Aliases { get; } | |||
public IReadOnlyList<CommandParameter> Parameters { get; } | |||
public IReadOnlyList<PreconditionAttribute> Preconditions { get; } | |||
@@ -37,6 +38,16 @@ namespace Discord.Commands | |||
Name = source.Name; | |||
Text = groupPrefix + attribute.Text; | |||
var aliasesBuilder = ImmutableArray.CreateBuilder<string>(); | |||
aliasesBuilder.Add(Text); | |||
var aliasesAttr = source.GetCustomAttribute<AliasAttribute>(); | |||
if (aliasesAttr != null) | |||
aliasesBuilder.AddRange(aliasesAttr.Aliases.Select(x => groupPrefix + x)); | |||
Aliases = aliasesBuilder.ToImmutable(); | |||
var nameAttr = source.GetCustomAttribute<NameAttribute>(); | |||
if (nameAttr != null) | |||
Name = nameAttr.Text; | |||
@@ -81,7 +92,19 @@ namespace Discord.Commands | |||
if (preconditionResult != null && !preconditionResult.Value.IsSuccess) | |||
return ParseResult.FromError(preconditionResult.Value); | |||
return await CommandParser.ParseArgs(this, msg, searchResult.Text.Substring(Text.Length), 0).ConfigureAwait(false); | |||
string input = searchResult.Text; | |||
var matchingAliases = Aliases.Where(alias => input.StartsWith(alias)); | |||
string matchingAlias = ""; | |||
foreach (string alias in matchingAliases) | |||
{ | |||
if (alias.Length > matchingAlias.Length) | |||
matchingAlias = alias; | |||
} | |||
input = input.Substring(matchingAlias.Length); | |||
return await CommandParser.ParseArgs(this, msg, input, 0).ConfigureAwait(false); | |||
} | |||
public Task<ExecuteResult> Execute(IMessage msg, ParseResult parseResult) | |||
{ | |||
@@ -17,40 +17,44 @@ namespace Discord.Commands | |||
public void AddCommand(Command command) | |||
{ | |||
string text = command.Text; | |||
int nextSpace = NextWhitespace(text); | |||
string name; | |||
foreach (string text in command.Aliases) | |||
{ | |||
int nextSpace = NextWhitespace(text); | |||
string name; | |||
if (nextSpace == -1) | |||
name = command.Text; | |||
else | |||
name = command.Text.Substring(0, nextSpace); | |||
if (nextSpace == -1) | |||
name = command.Text; | |||
else | |||
name = command.Text.Substring(0, nextSpace); | |||
lock (this) | |||
{ | |||
var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(x)); | |||
nextNode.AddCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command); | |||
lock (this) | |||
{ | |||
var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(x)); | |||
nextNode.AddCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command); | |||
} | |||
} | |||
} | |||
public void RemoveCommand(Command command) | |||
{ | |||
string text = command.Text; | |||
int nextSpace = NextWhitespace(text); | |||
string name; | |||
foreach (string text in command.Aliases) | |||
{ | |||
int nextSpace = NextWhitespace(text); | |||
string name; | |||
if (nextSpace == -1) | |||
name = command.Text; | |||
else | |||
name = command.Text.Substring(0, nextSpace); | |||
if (nextSpace == -1) | |||
name = command.Text; | |||
else | |||
name = command.Text.Substring(0, nextSpace); | |||
lock (this) | |||
{ | |||
CommandMapNode nextNode; | |||
if (_nodes.TryGetValue(name, out nextNode)) | |||
lock (this) | |||
{ | |||
nextNode.AddCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command); | |||
if (nextNode.IsEmpty) | |||
_nodes.TryRemove(name, out nextNode); | |||
CommandMapNode nextNode; | |||
if (_nodes.TryGetValue(name, out nextNode)) | |||
{ | |||
nextNode.RemoveCommand(nextSpace == -1 ? "" : text, nextSpace + 1, command); | |||
if (nextNode.IsEmpty) | |||
_nodes.TryRemove(name, out nextNode); | |||
} | |||
} | |||
} | |||
} | |||