From 993e26d2be03f22739ecbfc37079d08d5edd0fe4 Mon Sep 17 00:00:00 2001 From: RogueException Date: Mon, 27 Mar 2017 08:30:43 -0300 Subject: [PATCH] Added alias types --- .../Attributes/AliasAttribute.cs | 11 +++++++- src/Discord.Net.Commands/Attributes/AliasType.cs | 8 ++++++ .../Attributes/DontInjectAttribute.cs | 12 ++++----- .../Builders/CommandBuilder.cs | 27 +++++++++++++------ src/Discord.Net.Commands/Builders/ModuleBuilder.cs | 27 +++++++++++++------ .../Builders/ModuleClassBuilder.cs | 18 ++++++++----- src/Discord.Net.Commands/Info/CommandInfo.cs | 3 ++- src/Discord.Net.Commands/Info/ModuleInfo.cs | 31 +++++++++++++--------- .../Entities/Users/SocketSimpleUser.cs | 1 - 9 files changed, 94 insertions(+), 44 deletions(-) create mode 100644 src/Discord.Net.Commands/Attributes/AliasType.cs diff --git a/src/Discord.Net.Commands/Attributes/AliasAttribute.cs b/src/Discord.Net.Commands/Attributes/AliasAttribute.cs index 6e115bd60..c601efaff 100644 --- a/src/Discord.Net.Commands/Attributes/AliasAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/AliasAttribute.cs @@ -3,15 +3,24 @@ using System; namespace Discord.Commands { /// Provides aliases for a command. - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=true)] public class AliasAttribute : Attribute { + /// The type to be applied to this alias group + public AliasType Type { get; } /// The aliases which have been defined for the command. public string[] Aliases { get; } /// Creates a new with the given aliases. public AliasAttribute(params string[] aliases) { + Type = AliasType.Relative; + Aliases = aliases; + } + /// Creates a new with the given aliases. + public AliasAttribute(AliasType type, params string[] aliases) + { + Type = type; Aliases = aliases; } } diff --git a/src/Discord.Net.Commands/Attributes/AliasType.cs b/src/Discord.Net.Commands/Attributes/AliasType.cs new file mode 100644 index 000000000..d26d18fc3 --- /dev/null +++ b/src/Discord.Net.Commands/Attributes/AliasType.cs @@ -0,0 +1,8 @@ +namespace Discord.Commands +{ + public enum AliasType + { + Relative, + Absolute + } +} \ No newline at end of file diff --git a/src/Discord.Net.Commands/Attributes/DontInjectAttribute.cs b/src/Discord.Net.Commands/Attributes/DontInjectAttribute.cs index bd966e129..ab6138708 100644 --- a/src/Discord.Net.Commands/Attributes/DontInjectAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/DontInjectAttribute.cs @@ -1,9 +1,9 @@ using System; -namespace Discord.Commands { - - [AttributeUsage(AttributeTargets.Property)] - public class DontInjectAttribute : Attribute { - } - +namespace Discord.Commands +{ + [AttributeUsage(AttributeTargets.Property)] + public class DontInjectAttribute : Attribute + { + } } diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs index 27f991b16..b40bf8c49 100644 --- a/src/Discord.Net.Commands/Builders/CommandBuilder.cs +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -9,7 +9,7 @@ namespace Discord.Commands.Builders { private readonly List _preconditions; private readonly List _parameters; - private readonly List _aliases; + private readonly List _relativeAliases, _absoluteAliases; public ModuleBuilder Module { get; } internal Func Callback { get; set; } @@ -22,7 +22,8 @@ namespace Discord.Commands.Builders public IReadOnlyList Preconditions => _preconditions; public IReadOnlyList Parameters => _parameters; - public IReadOnlyList Aliases => _aliases; + public IReadOnlyList RelativeAliases => _relativeAliases; + public IReadOnlyList AbsoluteAliases => _absoluteAliases; //Automatic internal CommandBuilder(ModuleBuilder module) @@ -31,7 +32,8 @@ namespace Discord.Commands.Builders _preconditions = new List(); _parameters = new List(); - _aliases = new List(); + _relativeAliases = new List(); + _absoluteAliases = new List(); } //User-defined internal CommandBuilder(ModuleBuilder module, string primaryAlias, Func callback) @@ -41,7 +43,7 @@ namespace Discord.Commands.Builders Discord.Preconditions.NotNull(callback, nameof(callback)); Callback = callback; - _aliases.Add(primaryAlias); + _relativeAliases.Add(primaryAlias); } public CommandBuilder WithName(string name) @@ -70,13 +72,22 @@ namespace Discord.Commands.Builders return this; } - public CommandBuilder AddAliases(params string[] aliases) + public CommandBuilder AddAliases(AliasType type, params string[] aliases) { for (int i = 0; i < aliases.Length; i++) { var alias = aliases[i] ?? ""; - if (!_aliases.Contains(alias)) - _aliases.Add(alias); + switch (type) + { + case AliasType.Relative: + if (!_relativeAliases.Contains(alias)) + _relativeAliases.Add(alias); + break; + case AliasType.Absolute: + if (!_absoluteAliases.Contains(alias)) + _absoluteAliases.Add(alias); + break; + } } return this; } @@ -111,7 +122,7 @@ namespace Discord.Commands.Builders { //Default name to first alias if (Name == null) - Name = _aliases[0]; + Name = _relativeAliases[0]; if (_parameters.Count > 0) { diff --git a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs index 45c0034f2..2fd1c868f 100644 --- a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs @@ -9,7 +9,7 @@ namespace Discord.Commands.Builders private readonly List _commands; private readonly List _submodules; private readonly List _preconditions; - private readonly List _aliases; + private readonly List _relativeAliases, _absoluteAliases; public CommandService Service { get; } public ModuleBuilder Parent { get; } @@ -20,7 +20,8 @@ namespace Discord.Commands.Builders public IReadOnlyList Commands => _commands; public IReadOnlyList Modules => _submodules; public IReadOnlyList Preconditions => _preconditions; - public IReadOnlyList Aliases => _aliases; + public IReadOnlyList RelativeAliases => _relativeAliases; + public IReadOnlyList AbsoluteAliases => _absoluteAliases; //Automatic internal ModuleBuilder(CommandService service, ModuleBuilder parent) @@ -31,7 +32,8 @@ namespace Discord.Commands.Builders _commands = new List(); _submodules = new List(); _preconditions = new List(); - _aliases = new List(); + _relativeAliases = new List(); + _absoluteAliases = new List(); } //User-defined internal ModuleBuilder(CommandService service, ModuleBuilder parent, string primaryAlias) @@ -39,7 +41,7 @@ namespace Discord.Commands.Builders { Discord.Preconditions.NotNull(primaryAlias, nameof(primaryAlias)); - _aliases = new List { primaryAlias }; + _relativeAliases = new List { primaryAlias }; } public ModuleBuilder WithName(string name) @@ -58,13 +60,22 @@ namespace Discord.Commands.Builders return this; } - public ModuleBuilder AddAliases(params string[] aliases) + public ModuleBuilder AddAliases(AliasType type, params string[] aliases) { for (int i = 0; i < aliases.Length; i++) { var alias = aliases[i] ?? ""; - if (!_aliases.Contains(alias)) - _aliases.Add(alias); + switch (type) + { + case AliasType.Relative: + if (!_relativeAliases.Contains(alias)) + _relativeAliases.Add(alias); + break; + case AliasType.Absolute: + if (!_absoluteAliases.Contains(alias)) + _absoluteAliases.Add(alias); + break; + } } return this; } @@ -106,7 +117,7 @@ namespace Discord.Commands.Builders { //Default name to first alias if (Name == null) - Name = _aliases[0]; + Name = _relativeAliases[0]; return new ModuleInfo(this, service, parent); } diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 82850b091..15d216330 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -89,20 +89,23 @@ namespace Discord.Commands else if (attribute is RemarksAttribute) builder.Remarks = (attribute as RemarksAttribute).Text; else if (attribute is AliasAttribute) - builder.AddAliases((attribute as AliasAttribute).Aliases); + { + var aliasAttr = attribute as AliasAttribute; + builder.AddAliases(aliasAttr.Type, aliasAttr.Aliases); + } else if (attribute is GroupAttribute) { var groupAttr = attribute as GroupAttribute; builder.Name = builder.Name ?? groupAttr.Prefix; - builder.AddAliases(groupAttr.Prefix); + builder.AddAliases(AliasType.Relative, groupAttr.Prefix); } else if (attribute is PreconditionAttribute) builder.AddPrecondition(attribute as PreconditionAttribute); } //Check for unspecified info - if (builder.Aliases.Count == 0) - builder.AddAliases(""); + if (builder.RelativeAliases.Count == 0) + builder.AddAliases(AliasType.Relative, ""); if (builder.Name == null) builder.Name = typeInfo.Name; @@ -127,7 +130,7 @@ namespace Discord.Commands if (attribute is CommandAttribute) { var cmdAttr = attribute as CommandAttribute; - builder.AddAliases(cmdAttr.Text); + builder.AddAliases(AliasType.Relative, cmdAttr.Text); builder.RunMode = cmdAttr.RunMode; builder.Name = builder.Name ?? cmdAttr.Text; } @@ -140,7 +143,10 @@ namespace Discord.Commands else if (attribute is RemarksAttribute) builder.Remarks = (attribute as RemarksAttribute).Text; else if (attribute is AliasAttribute) - builder.AddAliases((attribute as AliasAttribute).Aliases); + { + var aliasAttr = attribute as AliasAttribute; + builder.AddAliases(aliasAttr.Type, aliasAttr.Aliases); + } else if (attribute is PreconditionAttribute) builder.AddPrecondition(attribute as PreconditionAttribute); } diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index d0bf25a4b..ba519436d 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -43,7 +43,7 @@ namespace Discord.Commands Priority = builder.Priority; Aliases = module.Aliases - .Permutate(builder.Aliases, (first, second) => + .Permutate(builder.RelativeAliases, (first, second) => { if (first == "") return second; @@ -52,6 +52,7 @@ namespace Discord.Commands else return first + service._separatorChar + second; }) + .Concat(builder.AbsoluteAliases) .Select(x => service._caseSensitive ? x : x.ToLowerInvariant()) .ToImmutableArray(); diff --git a/src/Discord.Net.Commands/Info/ModuleInfo.cs b/src/Discord.Net.Commands/Info/ModuleInfo.cs index a2094df65..a1c1965b6 100644 --- a/src/Discord.Net.Commands/Info/ModuleInfo.cs +++ b/src/Discord.Net.Commands/Info/ModuleInfo.cs @@ -38,28 +38,33 @@ namespace Discord.Commands private static IEnumerable BuildAliases(ModuleBuilder builder, CommandService service) { - var result = builder.Aliases.ToList(); - var builderQueue = new Queue(); + var result = builder.RelativeAliases.ToList(); + var builderQueue = new Stack(); var parent = builder; while ((parent = parent.Parent) != null) - builderQueue.Enqueue(parent); + builderQueue.Push(parent); while (builderQueue.Count > 0) { - var level = builderQueue.Dequeue(); + var level = builderQueue.Pop(); // permute in reverse because we want to *prefix* our aliases - result = level.Aliases.Permutate(result, (first, second) => - { - if (first == "") - return second; - else if (second == "") - return first; - else - return first + service._separatorChar + second; - }).ToList(); + result = result + .Permutate(level.RelativeAliases, (first, second) => + { + if (first == "") + return second; + else if (second == "") + return first; + else + return first + service._separatorChar + second; + }) + .Concat(level.AbsoluteAliases) + .ToList(); } + result = result.Concat(builder.AbsoluteAliases).ToList(); + return result; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs index 0d2198888..ccc15a687 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs @@ -13,7 +13,6 @@ namespace Discord.WebSocket public override ushort DiscriminatorValue { get; internal set; } public override string AvatarId { get; internal set; } internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null); } set { } } - internal override SocketGlobalUser GlobalUser { get { throw new NotSupportedException(); } } internal SocketSimpleUser(DiscordSocketClient discord, ulong id)