From fd5e237b41427ba530bfbddd6b422deb183dde66 Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Sun, 20 Nov 2016 13:40:40 +0000 Subject: [PATCH 1/4] Fix commands from being created with invalid aliases --- .../Builders/ModuleClassBuilder.cs | 8 +++++++- src/Discord.Net.Commands/Info/CommandInfo.cs | 14 +++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 9884f18db..31694d1d1 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -116,6 +116,9 @@ namespace Discord.Commands { var attributes = method.GetCustomAttributes(); + builder.Name = method.Name; + + var setName = false; foreach (var attribute in attributes) { // TODO: C#7 type switch @@ -124,10 +127,13 @@ namespace Discord.Commands var cmdAttr = attribute as CommandAttribute; builder.AddAliases(cmdAttr.Text); builder.RunMode = cmdAttr.RunMode; - builder.Name = builder.Name ?? cmdAttr.Text; + builder.Name = setName ? builder.Name ?? cmdAttr.Text : cmdAttr.Text ?? builder.Name; } else if (attribute is NameAttribute) + { builder.Name = (attribute as NameAttribute).Text; + setName = true; + } else if (attribute is PriorityAttribute) builder.Priority = (attribute as PriorityAttribute).Priority; else if (attribute is SummaryAttribute) diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 4d546b6fa..06b0f25a3 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -39,11 +39,19 @@ namespace Discord.Commands RunMode = builder.RunMode; Priority = builder.Priority; - - if (module.Aliases.Count != 0) + + // both command and module provide aliases + if (module.Aliases.Count > 0 && builder.Aliases.Count > 0) Aliases = module.Aliases.Permutate(builder.Aliases, (first, second) => first + " " + second).ToImmutableArray(); - else + // only module provides aliases + else if (module.Aliases.Count > 0) + Aliases = module.Aliases.ToImmutableArray(); + // only command provides aliases + else if (builder.Aliases.Count > 0) Aliases = builder.Aliases.ToImmutableArray(); + // neither provide aliases + else + throw new InvalidOperationException("Cannot build a command without any aliases"); Preconditions = builder.Preconditions.ToImmutableArray(); From 05fb81c6176eb361e66a6db9946873fc26401417 Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Sun, 20 Nov 2016 20:20:23 +0000 Subject: [PATCH 2/4] Fix a bunch of issues with aliases --- src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs | 7 ++++--- src/Discord.Net.Commands/CommandService.cs | 4 ++-- src/Discord.Net.Commands/Info/CommandInfo.cs | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 31694d1d1..57b40b6b3 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -118,7 +118,6 @@ namespace Discord.Commands builder.Name = method.Name; - var setName = false; foreach (var attribute in attributes) { // TODO: C#7 type switch @@ -127,12 +126,11 @@ namespace Discord.Commands var cmdAttr = attribute as CommandAttribute; builder.AddAliases(cmdAttr.Text); builder.RunMode = cmdAttr.RunMode; - builder.Name = setName ? builder.Name ?? cmdAttr.Text : cmdAttr.Text ?? builder.Name; + builder.Name = builder.Name ?? cmdAttr.Text; } else if (attribute is NameAttribute) { builder.Name = (attribute as NameAttribute).Text; - setName = true; } else if (attribute is PriorityAttribute) builder.Priority = (attribute as PriorityAttribute).Priority; @@ -146,6 +144,9 @@ namespace Discord.Commands builder.AddPrecondition(attribute as PreconditionAttribute); } + if (builder.Name == null) + builder.Name = method.Name; + var parameters = method.GetParameters(); int pos = 0, count = parameters.Length; foreach (var paramInfo in parameters) diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 3c3760908..993dc7ebd 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -19,8 +19,8 @@ namespace Discord.Commands private readonly ConcurrentBag _moduleDefs; private readonly CommandMap _map; - public IEnumerable Modules => _typedModuleDefs.Select(x => x.Value); - public IEnumerable Commands => _typedModuleDefs.SelectMany(x => x.Value.Commands); + public IEnumerable Modules => _moduleDefs.Select(x => x); + public IEnumerable Commands => _moduleDefs.SelectMany(x => x.Commands); public CommandService() { diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 06b0f25a3..55fdf0d90 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -42,7 +42,7 @@ namespace Discord.Commands // both command and module provide aliases if (module.Aliases.Count > 0 && builder.Aliases.Count > 0) - Aliases = module.Aliases.Permutate(builder.Aliases, (first, second) => first + " " + second).ToImmutableArray(); + Aliases = module.Aliases.Permutate(builder.Aliases, (first, second) => second != null ? first + " " + second : first).ToImmutableArray(); // only module provides aliases else if (module.Aliases.Count > 0) Aliases = module.Aliases.ToImmutableArray(); From bc76e38ce54a1d273f52e04c3ce78fe89e5a28bd Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Fri, 25 Nov 2016 21:15:39 +0000 Subject: [PATCH 3/4] Fix additional issue with aliases building incorrectly --- src/Discord.Net.Commands/Info/ModuleInfo.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Commands/Info/ModuleInfo.cs b/src/Discord.Net.Commands/Info/ModuleInfo.cs index 64fa29ea2..3baa2d34f 100644 --- a/src/Discord.Net.Commands/Info/ModuleInfo.cs +++ b/src/Discord.Net.Commands/Info/ModuleInfo.cs @@ -49,15 +49,21 @@ namespace Discord.Commands while (builderStack.Count() > 0) { - ModuleBuilder level = builderStack.Pop(); // get the topmost builder + ModuleBuilder level = builderStack.Pop(); //get the topmost builder if (result == null) - result = level.Aliases.ToList(); // create a shallow copy so we don't overwrite the builder unexpectedly + { + if (level.Aliases.Count > 0) + result = level.Aliases.ToList(); //create a shallow copy so we don't overwrite the builder unexpectedly + } else if (result.Count() > level.Aliases.Count) result = result.Permutate(level.Aliases, (first, second) => first + " " + second); else result = level.Aliases.Permutate(result, (second, first) => first + " " + second); } + if (result == null) //there were no aliases; default to an empty list + result = new List(); + return result; } From 5cdda592c19a6855ef761420235cd200f0164051 Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Fri, 25 Nov 2016 21:19:41 +0000 Subject: [PATCH 4/4] Add requested changes --- src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 57b40b6b3..aaec43161 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -115,9 +115,7 @@ namespace Discord.Commands private static void BuildCommand(CommandBuilder builder, TypeInfo typeInfo, MethodInfo method, CommandService service) { var attributes = method.GetCustomAttributes(); - - builder.Name = method.Name; - + foreach (var attribute in attributes) { // TODO: C#7 type switch @@ -129,9 +127,7 @@ namespace Discord.Commands builder.Name = builder.Name ?? cmdAttr.Text; } else if (attribute is NameAttribute) - { builder.Name = (attribute as NameAttribute).Text; - } else if (attribute is PriorityAttribute) builder.Priority = (attribute as PriorityAttribute).Priority; else if (attribute is SummaryAttribute)