Browse Source

Allow arbitrary attributes to be added to commands (#458)

* 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 used
tags/1.0
Finite Reality RogueException 8 years ago
parent
commit
b96748f9c3
7 changed files with 56 additions and 2 deletions
  1. +8
    -0
      src/Discord.Net.Commands/Builders/CommandBuilder.cs
  2. +8
    -0
      src/Discord.Net.Commands/Builders/ModuleBuilder.cs
  3. +10
    -1
      src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs
  4. +9
    -1
      src/Discord.Net.Commands/Builders/ParameterBuilder.cs
  5. +2
    -0
      src/Discord.Net.Commands/Info/CommandInfo.cs
  6. +17
    -0
      src/Discord.Net.Commands/Info/ModuleInfo.cs
  7. +2
    -0
      src/Discord.Net.Commands/Info/ParameterInfo.cs

+ 8
- 0
src/Discord.Net.Commands/Builders/CommandBuilder.cs View File

@@ -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);


+ 8
- 0
src/Discord.Net.Commands/Builders/ModuleBuilder.cs View File

@@ -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);


+ 10
- 1
src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs View File

@@ -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;
} }
} }
}
}

+ 9
- 1
src/Discord.Net.Commands/Builders/ParameterBuilder.cs View File

@@ -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);


+ 2
- 0
src/Discord.Net.Commands/Info/CommandInfo.cs View File

@@ -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;


+ 17
- 0
src/Discord.Net.Commands/Info/ModuleInfo.cs View File

@@ -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;
}
} }
} }

+ 2
- 0
src/Discord.Net.Commands/Info/ParameterInfo.cs View File

@@ -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;
} }


Loading…
Cancel
Save