@@ -19,7 +19,7 @@ namespace Discord.Commands
public string Text { get; }
public Module Module { get; }
public IReadOnlyList<CommandParameter> Parameters { get; }
public IReadOnlyList<PreconditionAttribute> Permiss ions { get; }
public IReadOnlyList<PreconditionAttribute> Precondit ions { get; }
internal Command(Module module, object instance, CommandAttribute attribute, MethodInfo methodInfo, string groupPrefix)
{
@@ -38,22 +38,20 @@ namespace Discord.Commands
Synopsis = synopsis.Text;
Parameters = BuildParameters(methodInfo);
Permissions = BuildPermiss ions(methodInfo);
Preconditions = BuildPrecondit ions(methodInfo);
_action = BuildAction(methodInfo);
}
public bool MeetsPreconditions(IMessage message )
public async Task<PreconditionResult> CheckPreconditions(IMessage context )
{
var context = new PreconditionContext(this, message);
foreach (PreconditionAttribute permission in Permissions)
foreach (PreconditionAttribute permission in Preconditions)
{
permission.CheckPermissions(context);
if (context.Handled )
return false ;
var result = await permission.CheckPermissions(context).ConfigureAwait(false);
if (!result.IsSuccess )
return result ;
}
return true;
return Precondi tionResult.F romS ucc ess() ;
}
public async Task<ParseResult> Parse(IMessage msg, SearchResult searchResult)
@@ -68,8 +66,9 @@ namespace Discord.Commands
if (!parseResult.IsSuccess)
return ExecuteResult.FromError(parseResult);
if (!MeetsPreconditions(msg)) // TODO: should we have to check this here, or leave it entirely to the bot dev?
return ExecuteResult.FromError(CommandError.UnmetPrecondition, "Permissions check failed");
var precondition = await CheckPreconditions(msg).ConfigureAwait(false);
if (!precondition.IsSuccess) // TODO: should we have to check this here, or leave it entirely to the bot dev?
return ExecuteResult.FromError(precondition);
try
{
@@ -82,7 +81,7 @@ namespace Discord.Commands
}
}
private IReadOnlyList<PreconditionAttribute> BuildPermiss ions(MethodInfo methodInfo)
private IReadOnlyList<PreconditionAttribute> BuildPrecondit ions(MethodInfo methodInfo)
{
return methodInfo.GetCustomAttributes<PreconditionAttribute>().ToImmutableArray();
}