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)