Browse Source

Allow Preconditions on parameters.

pull/312/head
Joe4evr 8 years ago
parent
commit
15da93b44a
3 changed files with 40 additions and 0 deletions
  1. +11
    -0
      src/Discord.Net.Commands/Attributes/ParameterPreconditionAttribute.cs
  2. +7
    -0
      src/Discord.Net.Commands/CommandInfo.cs
  3. +22
    -0
      src/Discord.Net.Commands/CommandParameter.cs

+ 11
- 0
src/Discord.Net.Commands/Attributes/ParameterPreconditionAttribute.cs View File

@@ -0,0 +1,11 @@
using System;
using System.Threading.Tasks;

namespace Discord.Commands.Attributes
{
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true, Inherited = true)]
public abstract class ParameterPreconditionAttribute : Attribute
{
public abstract Task<PreconditionResult> CheckPermissions(CommandContext context, CommandParameter parameter, IDependencyMap map);
}
}

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

@@ -101,6 +101,13 @@ namespace Discord.Commands
return result;
}

foreach (CommandParameter parameter in Parameters)
{
var result = await parameter.CheckPreconditions(context, map).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
}

return PreconditionResult.FromSuccess();
}



+ 22
- 0
src/Discord.Net.Commands/CommandParameter.cs View File

@@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Reflection;
using System.Threading.Tasks;
using Discord.Commands.Attributes;

namespace Discord.Commands
{
@@ -18,6 +21,7 @@ namespace Discord.Commands
public bool IsMultiple { get; }
public Type ElementType { get; }
public object DefaultValue { get; }
public IReadOnlyList<ParameterPreconditionAttribute> Preconditions { get; }

public CommandParameter(ParameterInfo source, string name, string summary, Type type, TypeReader reader, bool isOptional, bool isRemainder, bool isMultiple, object defaultValue)
{
@@ -30,6 +34,7 @@ namespace Discord.Commands
IsRemainder = isRemainder;
IsMultiple = isMultiple;
DefaultValue = defaultValue;
Preconditions = BuildPreconditions(source);
}

public async Task<TypeReaderResult> Parse(CommandContext context, string input)
@@ -37,6 +42,23 @@ namespace Discord.Commands
return await _reader.Read(context, input).ConfigureAwait(false);
}

public async Task<PreconditionResult> CheckPreconditions(CommandContext context, IDependencyMap map = null)
{
foreach (ParameterPreconditionAttribute precondition in Preconditions)
{
var result = await precondition.CheckPermissions(context, this, map).ConfigureAwait(false);
if (!result.IsSuccess)
return result;
}

return PreconditionResult.FromSuccess();
}

private IReadOnlyList<ParameterPreconditionAttribute> BuildPreconditions(ParameterInfo paramInfo)
{
return paramInfo.GetCustomAttributes<ParameterPreconditionAttribute>().ToImmutableArray();
}

public override string ToString() => Name;
private string DebuggerDisplay => $"{Name}{(IsOptional ? " (Optional)" : "")}{(IsRemainder ? " (Remainder)" : "")}";
}


Loading…
Cancel
Save