diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs index 30db1fa62..0a79f13f2 100644 --- a/src/Discord.Net.Commands/Builders/CommandBuilder.cs +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -10,6 +10,7 @@ namespace Discord.Commands.Builders { private readonly List _preconditions; private readonly List _parameters; + private readonly List _attributes; private readonly List _aliases; public ModuleBuilder Module { get; } @@ -24,6 +25,7 @@ namespace Discord.Commands.Builders public IReadOnlyList Preconditions => _preconditions; public IReadOnlyList Parameters => _parameters; + public IReadOnlyList Attributes => _attributes; public IReadOnlyList Aliases => _aliases; //Automatic @@ -33,6 +35,7 @@ namespace Discord.Commands.Builders _preconditions = new List(); _parameters = new List(); + _attributes = new List(); _aliases = new List(); } //User-defined @@ -83,6 +86,11 @@ namespace Discord.Commands.Builders } return this; } + public CommandBuilder AddAttributes(params Attribute[] attributes) + { + _attributes.AddRange(attributes); + return this; + } public CommandBuilder AddPrecondition(PreconditionAttribute precondition) { _preconditions.Add(precondition); diff --git a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs index 525907b8b..e5e688fe9 100644 --- a/src/Discord.Net.Commands/Builders/ModuleBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleBuilder.cs @@ -10,6 +10,7 @@ namespace Discord.Commands.Builders private readonly List _commands; private readonly List _submodules; private readonly List _preconditions; + private readonly List _attributes; private readonly List _aliases; public CommandService Service { get; } @@ -21,6 +22,7 @@ namespace Discord.Commands.Builders public IReadOnlyList Commands => _commands; public IReadOnlyList Modules => _submodules; public IReadOnlyList Preconditions => _preconditions; + public IReadOnlyList Attributes => _attributes; public IReadOnlyList Aliases => _aliases; //Automatic @@ -32,6 +34,7 @@ namespace Discord.Commands.Builders _commands = new List(); _submodules = new List(); _preconditions = new List(); + _attributes = new List(); _aliases = new List(); } //User-defined @@ -69,6 +72,11 @@ namespace Discord.Commands.Builders } return this; } + public ModuleBuilder AddAttributes(params Attribute[] attributes) + { + _attributes.AddRange(attributes); + return this; + } public ModuleBuilder AddPrecondition(PreconditionAttribute precondition) { _preconditions.Add(precondition); diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 401396900..2df1d805f 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -122,6 +122,9 @@ namespace Discord.Commands case PreconditionAttribute precondition: builder.AddPrecondition(precondition); break; + default: + builder.AddAttributes(attribute); + break; } } @@ -173,6 +176,9 @@ namespace Discord.Commands case PreconditionAttribute precondition: builder.AddPrecondition(precondition); break; + default: + builder.AddAttributes(attribute); + break; } } @@ -239,6 +245,9 @@ namespace Discord.Commands builder.IsRemainder = true; break; + default: + builder.AddAttributes(attribute); + break; } } @@ -289,4 +298,4 @@ namespace Discord.Commands !methodInfo.IsGenericMethod; } } -} \ No newline at end of file +} diff --git a/src/Discord.Net.Commands/Builders/ParameterBuilder.cs b/src/Discord.Net.Commands/Builders/ParameterBuilder.cs index d2bebbad0..d1782d7ea 100644 --- a/src/Discord.Net.Commands/Builders/ParameterBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ParameterBuilder.cs @@ -8,7 +8,8 @@ namespace Discord.Commands.Builders { public class ParameterBuilder { - private readonly List _preconditions; + private readonly List _preconditions; + private readonly List _attributes; public CommandBuilder Command { get; } public string Name { get; internal set; } @@ -22,11 +23,13 @@ namespace Discord.Commands.Builders public string Summary { get; set; } public IReadOnlyList Preconditions => _preconditions; + public IReadOnlyList Attributes => _attributes; //Automatic internal ParameterBuilder(CommandBuilder command) { _preconditions = new List(); + _attributes = new List(); Command = command; } @@ -84,6 +87,11 @@ namespace Discord.Commands.Builders return this; } + public ParameterBuilder AddAttributes(params Attribute[] attributes) + { + _attributes.AddRange(attributes); + return this; + } public ParameterBuilder AddPrecondition(ParameterPreconditionAttribute precondition) { _preconditions.Add(precondition); diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index a97bd4fa5..00041f22d 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -31,6 +31,7 @@ namespace Discord.Commands public IReadOnlyList Aliases { get; } public IReadOnlyList Parameters { get; } public IReadOnlyList Preconditions { get; } + public IReadOnlyList Attributes { get; } internal CommandInfo(CommandBuilder builder, ModuleInfo module, CommandService service) { @@ -57,6 +58,7 @@ namespace Discord.Commands .ToImmutableArray(); Preconditions = builder.Preconditions.ToImmutableArray(); + Attributes = builder.Attributes.ToImmutableArray(); Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray(); HasVarArgs = builder.Parameters.Count > 0 ? builder.Parameters[builder.Parameters.Count - 1].IsMultiple : false; diff --git a/src/Discord.Net.Commands/Info/ModuleInfo.cs b/src/Discord.Net.Commands/Info/ModuleInfo.cs index a2094df65..97b90bf4e 100644 --- a/src/Discord.Net.Commands/Info/ModuleInfo.cs +++ b/src/Discord.Net.Commands/Info/ModuleInfo.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using System.Collections.Generic; using System.Collections.Immutable; @@ -16,6 +17,7 @@ namespace Discord.Commands public IReadOnlyList Aliases { get; } public IReadOnlyList Commands { get; } public IReadOnlyList Preconditions { get; } + public IReadOnlyList Attributes { get; } public IReadOnlyList Submodules { get; } public ModuleInfo Parent { get; } public bool IsSubmodule => Parent != null; @@ -32,6 +34,7 @@ namespace Discord.Commands Aliases = BuildAliases(builder, service).ToImmutableArray(); Commands = builder.Commands.Select(x => x.Build(this, service)).ToImmutableArray(); Preconditions = BuildPreconditions(builder).ToImmutableArray(); + Attributes = BuildAttributes(builder).ToImmutableArray(); Submodules = BuildSubmodules(builder, service).ToImmutableArray(); } @@ -86,5 +89,19 @@ namespace Discord.Commands return result; } + + private static List BuildAttributes(ModuleBuilder builder) + { + var result = new List(); + + ModuleBuilder parent = builder; + while (parent != null) + { + result.AddRange(parent.Attributes); + parent = parent.Parent; + } + + return result; + } } } diff --git a/src/Discord.Net.Commands/Info/ParameterInfo.cs b/src/Discord.Net.Commands/Info/ParameterInfo.cs index 2b71bb90b..e417b1ab6 100644 --- a/src/Discord.Net.Commands/Info/ParameterInfo.cs +++ b/src/Discord.Net.Commands/Info/ParameterInfo.cs @@ -21,6 +21,7 @@ namespace Discord.Commands public object DefaultValue { get; } public IReadOnlyList Preconditions { get; } + public IReadOnlyList Attributes { get; } internal ParameterInfo(ParameterBuilder builder, CommandInfo command, CommandService service) { @@ -36,6 +37,7 @@ namespace Discord.Commands DefaultValue = builder.DefaultValue; Preconditions = builder.Preconditions.ToImmutableArray(); + Attributes = builder.Attributes.ToImmutableArray(); _reader = builder.TypeReader; }