* Allow arbitrary attributes to be added to commands I still don't approve adding type info back into commands, so I decided to use this solution for allowing arbitrary attributes to be added to commands. Add attributes property to ParameterBuilder Add Attributes properties to info types * Why on earth git * Add using for system so that Attribute can be usedtags/1.0
@@ -10,6 +10,7 @@ namespace Discord.Commands.Builders | |||||
{ | { | ||||
private readonly List<PreconditionAttribute> _preconditions; | private readonly List<PreconditionAttribute> _preconditions; | ||||
private readonly List<ParameterBuilder> _parameters; | private readonly List<ParameterBuilder> _parameters; | ||||
private readonly List<Attribute> _attributes; | |||||
private readonly List<string> _aliases; | private readonly List<string> _aliases; | ||||
public ModuleBuilder Module { get; } | public ModuleBuilder Module { get; } | ||||
@@ -24,6 +25,7 @@ namespace Discord.Commands.Builders | |||||
public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions; | public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions; | ||||
public IReadOnlyList<ParameterBuilder> Parameters => _parameters; | public IReadOnlyList<ParameterBuilder> Parameters => _parameters; | ||||
public IReadOnlyList<Attribute> Attributes => _attributes; | |||||
public IReadOnlyList<string> Aliases => _aliases; | public IReadOnlyList<string> Aliases => _aliases; | ||||
//Automatic | //Automatic | ||||
@@ -33,6 +35,7 @@ namespace Discord.Commands.Builders | |||||
_preconditions = new List<PreconditionAttribute>(); | _preconditions = new List<PreconditionAttribute>(); | ||||
_parameters = new List<ParameterBuilder>(); | _parameters = new List<ParameterBuilder>(); | ||||
_attributes = new List<Attribute>(); | |||||
_aliases = new List<string>(); | _aliases = new List<string>(); | ||||
} | } | ||||
//User-defined | //User-defined | ||||
@@ -83,6 +86,11 @@ namespace Discord.Commands.Builders | |||||
} | } | ||||
return this; | return this; | ||||
} | } | ||||
public CommandBuilder AddAttributes(params Attribute[] attributes) | |||||
{ | |||||
_attributes.AddRange(attributes); | |||||
return this; | |||||
} | |||||
public CommandBuilder AddPrecondition(PreconditionAttribute precondition) | public CommandBuilder AddPrecondition(PreconditionAttribute precondition) | ||||
{ | { | ||||
_preconditions.Add(precondition); | _preconditions.Add(precondition); | ||||
@@ -10,6 +10,7 @@ namespace Discord.Commands.Builders | |||||
private readonly List<CommandBuilder> _commands; | private readonly List<CommandBuilder> _commands; | ||||
private readonly List<ModuleBuilder> _submodules; | private readonly List<ModuleBuilder> _submodules; | ||||
private readonly List<PreconditionAttribute> _preconditions; | private readonly List<PreconditionAttribute> _preconditions; | ||||
private readonly List<Attribute> _attributes; | |||||
private readonly List<string> _aliases; | private readonly List<string> _aliases; | ||||
public CommandService Service { get; } | public CommandService Service { get; } | ||||
@@ -21,6 +22,7 @@ namespace Discord.Commands.Builders | |||||
public IReadOnlyList<CommandBuilder> Commands => _commands; | public IReadOnlyList<CommandBuilder> Commands => _commands; | ||||
public IReadOnlyList<ModuleBuilder> Modules => _submodules; | public IReadOnlyList<ModuleBuilder> Modules => _submodules; | ||||
public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions; | public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions; | ||||
public IReadOnlyList<Attribute> Attributes => _attributes; | |||||
public IReadOnlyList<string> Aliases => _aliases; | public IReadOnlyList<string> Aliases => _aliases; | ||||
//Automatic | //Automatic | ||||
@@ -32,6 +34,7 @@ namespace Discord.Commands.Builders | |||||
_commands = new List<CommandBuilder>(); | _commands = new List<CommandBuilder>(); | ||||
_submodules = new List<ModuleBuilder>(); | _submodules = new List<ModuleBuilder>(); | ||||
_preconditions = new List<PreconditionAttribute>(); | _preconditions = new List<PreconditionAttribute>(); | ||||
_attributes = new List<Attribute>(); | |||||
_aliases = new List<string>(); | _aliases = new List<string>(); | ||||
} | } | ||||
//User-defined | //User-defined | ||||
@@ -69,6 +72,11 @@ namespace Discord.Commands.Builders | |||||
} | } | ||||
return this; | return this; | ||||
} | } | ||||
public ModuleBuilder AddAttributes(params Attribute[] attributes) | |||||
{ | |||||
_attributes.AddRange(attributes); | |||||
return this; | |||||
} | |||||
public ModuleBuilder AddPrecondition(PreconditionAttribute precondition) | public ModuleBuilder AddPrecondition(PreconditionAttribute precondition) | ||||
{ | { | ||||
_preconditions.Add(precondition); | _preconditions.Add(precondition); | ||||
@@ -122,6 +122,9 @@ namespace Discord.Commands | |||||
case PreconditionAttribute precondition: | case PreconditionAttribute precondition: | ||||
builder.AddPrecondition(precondition); | builder.AddPrecondition(precondition); | ||||
break; | break; | ||||
default: | |||||
builder.AddAttributes(attribute); | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -173,6 +176,9 @@ namespace Discord.Commands | |||||
case PreconditionAttribute precondition: | case PreconditionAttribute precondition: | ||||
builder.AddPrecondition(precondition); | builder.AddPrecondition(precondition); | ||||
break; | break; | ||||
default: | |||||
builder.AddAttributes(attribute); | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -239,6 +245,9 @@ namespace Discord.Commands | |||||
builder.IsRemainder = true; | builder.IsRemainder = true; | ||||
break; | break; | ||||
default: | |||||
builder.AddAttributes(attribute); | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -289,4 +298,4 @@ namespace Discord.Commands | |||||
!methodInfo.IsGenericMethod; | !methodInfo.IsGenericMethod; | ||||
} | } | ||||
} | } | ||||
} | |||||
} |
@@ -8,7 +8,8 @@ namespace Discord.Commands.Builders | |||||
{ | { | ||||
public class ParameterBuilder | public class ParameterBuilder | ||||
{ | { | ||||
private readonly List<ParameterPreconditionAttribute> _preconditions; | |||||
private readonly List<ParameterPreconditionAttribute> _preconditions; | |||||
private readonly List<Attribute> _attributes; | |||||
public CommandBuilder Command { get; } | public CommandBuilder Command { get; } | ||||
public string Name { get; internal set; } | public string Name { get; internal set; } | ||||
@@ -22,11 +23,13 @@ namespace Discord.Commands.Builders | |||||
public string Summary { get; set; } | public string Summary { get; set; } | ||||
public IReadOnlyList<ParameterPreconditionAttribute> Preconditions => _preconditions; | public IReadOnlyList<ParameterPreconditionAttribute> Preconditions => _preconditions; | ||||
public IReadOnlyList<Attribute> Attributes => _attributes; | |||||
//Automatic | //Automatic | ||||
internal ParameterBuilder(CommandBuilder command) | internal ParameterBuilder(CommandBuilder command) | ||||
{ | { | ||||
_preconditions = new List<ParameterPreconditionAttribute>(); | _preconditions = new List<ParameterPreconditionAttribute>(); | ||||
_attributes = new List<Attribute>(); | |||||
Command = command; | Command = command; | ||||
} | } | ||||
@@ -84,6 +87,11 @@ namespace Discord.Commands.Builders | |||||
return this; | return this; | ||||
} | } | ||||
public ParameterBuilder AddAttributes(params Attribute[] attributes) | |||||
{ | |||||
_attributes.AddRange(attributes); | |||||
return this; | |||||
} | |||||
public ParameterBuilder AddPrecondition(ParameterPreconditionAttribute precondition) | public ParameterBuilder AddPrecondition(ParameterPreconditionAttribute precondition) | ||||
{ | { | ||||
_preconditions.Add(precondition); | _preconditions.Add(precondition); | ||||
@@ -31,6 +31,7 @@ namespace Discord.Commands | |||||
public IReadOnlyList<string> Aliases { get; } | public IReadOnlyList<string> Aliases { get; } | ||||
public IReadOnlyList<ParameterInfo> Parameters { get; } | public IReadOnlyList<ParameterInfo> Parameters { get; } | ||||
public IReadOnlyList<PreconditionAttribute> Preconditions { get; } | public IReadOnlyList<PreconditionAttribute> Preconditions { get; } | ||||
public IReadOnlyList<Attribute> Attributes { get; } | |||||
internal CommandInfo(CommandBuilder builder, ModuleInfo module, CommandService service) | internal CommandInfo(CommandBuilder builder, ModuleInfo module, CommandService service) | ||||
{ | { | ||||
@@ -57,6 +58,7 @@ namespace Discord.Commands | |||||
.ToImmutableArray(); | .ToImmutableArray(); | ||||
Preconditions = builder.Preconditions.ToImmutableArray(); | Preconditions = builder.Preconditions.ToImmutableArray(); | ||||
Attributes = builder.Attributes.ToImmutableArray(); | |||||
Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray(); | Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray(); | ||||
HasVarArgs = builder.Parameters.Count > 0 ? builder.Parameters[builder.Parameters.Count - 1].IsMultiple : false; | HasVarArgs = builder.Parameters.Count > 0 ? builder.Parameters[builder.Parameters.Count - 1].IsMultiple : false; | ||||
@@ -1,3 +1,4 @@ | |||||
using System; | |||||
using System.Linq; | using System.Linq; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Collections.Immutable; | using System.Collections.Immutable; | ||||
@@ -16,6 +17,7 @@ namespace Discord.Commands | |||||
public IReadOnlyList<string> Aliases { get; } | public IReadOnlyList<string> Aliases { get; } | ||||
public IReadOnlyList<CommandInfo> Commands { get; } | public IReadOnlyList<CommandInfo> Commands { get; } | ||||
public IReadOnlyList<PreconditionAttribute> Preconditions { get; } | public IReadOnlyList<PreconditionAttribute> Preconditions { get; } | ||||
public IReadOnlyList<Attribute> Attributes { get; } | |||||
public IReadOnlyList<ModuleInfo> Submodules { get; } | public IReadOnlyList<ModuleInfo> Submodules { get; } | ||||
public ModuleInfo Parent { get; } | public ModuleInfo Parent { get; } | ||||
public bool IsSubmodule => Parent != null; | public bool IsSubmodule => Parent != null; | ||||
@@ -32,6 +34,7 @@ namespace Discord.Commands | |||||
Aliases = BuildAliases(builder, service).ToImmutableArray(); | Aliases = BuildAliases(builder, service).ToImmutableArray(); | ||||
Commands = builder.Commands.Select(x => x.Build(this, service)).ToImmutableArray(); | Commands = builder.Commands.Select(x => x.Build(this, service)).ToImmutableArray(); | ||||
Preconditions = BuildPreconditions(builder).ToImmutableArray(); | Preconditions = BuildPreconditions(builder).ToImmutableArray(); | ||||
Attributes = BuildAttributes(builder).ToImmutableArray(); | |||||
Submodules = BuildSubmodules(builder, service).ToImmutableArray(); | Submodules = BuildSubmodules(builder, service).ToImmutableArray(); | ||||
} | } | ||||
@@ -86,5 +89,19 @@ namespace Discord.Commands | |||||
return result; | return result; | ||||
} | } | ||||
private static List<Attribute> BuildAttributes(ModuleBuilder builder) | |||||
{ | |||||
var result = new List<Attribute>(); | |||||
ModuleBuilder parent = builder; | |||||
while (parent != null) | |||||
{ | |||||
result.AddRange(parent.Attributes); | |||||
parent = parent.Parent; | |||||
} | |||||
return result; | |||||
} | |||||
} | } | ||||
} | } |
@@ -21,6 +21,7 @@ namespace Discord.Commands | |||||
public object DefaultValue { get; } | public object DefaultValue { get; } | ||||
public IReadOnlyList<ParameterPreconditionAttribute> Preconditions { get; } | public IReadOnlyList<ParameterPreconditionAttribute> Preconditions { get; } | ||||
public IReadOnlyList<Attribute> Attributes { get; } | |||||
internal ParameterInfo(ParameterBuilder builder, CommandInfo command, CommandService service) | internal ParameterInfo(ParameterBuilder builder, CommandInfo command, CommandService service) | ||||
{ | { | ||||
@@ -36,6 +37,7 @@ namespace Discord.Commands | |||||
DefaultValue = builder.DefaultValue; | DefaultValue = builder.DefaultValue; | ||||
Preconditions = builder.Preconditions.ToImmutableArray(); | Preconditions = builder.Preconditions.ToImmutableArray(); | ||||
Attributes = builder.Attributes.ToImmutableArray(); | |||||
_reader = builder.TypeReader; | _reader = builder.TypeReader; | ||||
} | } | ||||