Rename Permission to Precondition

This commit is contained in:
Finite Reality
2016-08-03 16:50:51 +01:00
parent 023703c996
commit a5393dc937
7 changed files with 49 additions and 17 deletions

View File

@@ -5,8 +5,8 @@ using System.Threading.Tasks;
namespace Discord.Commands namespace Discord.Commands
{ {
public abstract class PermissionAttribute : Attribute public abstract class PreconditionAttribute : Attribute
{ {
public abstract void CheckPermissions(PermissionsContext context); public abstract void CheckPermissions(PreconditionContext context);
} }
} }

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Discord.Commands
{
public class RequireDMAttribute : PreconditionAttribute
{
public override void CheckPermissions(PreconditionContext context)
{
if (context.Message.Channel is IGuildChannel)
context.Handled = true;
}
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Discord.Commands
{
public class RequireGuildAttribute : PreconditionAttribute
{
public override void CheckPermissions(PreconditionContext context)
{
if (!(context.Message.Channel is IGuildChannel))
context.Handled = true;
}
}
}

View File

@@ -19,7 +19,7 @@ namespace Discord.Commands
public string Text { get; } public string Text { get; }
public Module Module { get; } public Module Module { get; }
public IReadOnlyList<CommandParameter> Parameters { get; } public IReadOnlyList<CommandParameter> Parameters { get; }
public IReadOnlyList<PermissionAttribute> Permissions { get; } public IReadOnlyList<PreconditionAttribute> Permissions { get; }
internal Command(Module module, object instance, CommandAttribute attribute, MethodInfo methodInfo, string groupPrefix) internal Command(Module module, object instance, CommandAttribute attribute, MethodInfo methodInfo, string groupPrefix)
{ {
@@ -42,11 +42,11 @@ namespace Discord.Commands
_action = BuildAction(methodInfo); _action = BuildAction(methodInfo);
} }
public bool CanExecute(IMessage message) public bool MeetsPreconditions(IMessage message)
{ {
var context = new PermissionsContext(this, message); var context = new PreconditionContext(this, message);
foreach (PermissionAttribute permission in Permissions) foreach (PreconditionAttribute permission in Permissions)
{ {
permission.CheckPermissions(context); permission.CheckPermissions(context);
if (context.Handled) if (context.Handled)
@@ -68,8 +68,8 @@ namespace Discord.Commands
if (!parseResult.IsSuccess) if (!parseResult.IsSuccess)
return ExecuteResult.FromError(parseResult); return ExecuteResult.FromError(parseResult);
if (!CanExecute(msg)) // TODO: should we have to check this here, or leave it entirely to the bot dev? if (!MeetsPreconditions(msg)) // TODO: should we have to check this here, or leave it entirely to the bot dev?
return ExecuteResult.FromError(CommandError.InvalidPermissions, "Permissions check failed"); return ExecuteResult.FromError(CommandError.UnmetPrecondition, "Permissions check failed");
try try
{ {
@@ -82,9 +82,9 @@ namespace Discord.Commands
} }
} }
private IReadOnlyList<PermissionAttribute> BuildPermissions(MethodInfo methodInfo) private IReadOnlyList<PreconditionAttribute> BuildPermissions(MethodInfo methodInfo)
{ {
return methodInfo.GetCustomAttributes<PermissionAttribute>().ToImmutableArray(); return methodInfo.GetCustomAttributes<PreconditionAttribute>().ToImmutableArray();
} }
private IReadOnlyList<CommandParameter> BuildParameters(MethodInfo methodInfo) private IReadOnlyList<CommandParameter> BuildParameters(MethodInfo methodInfo)

View File

@@ -16,6 +16,6 @@
//Execute //Execute
Exception, Exception,
InvalidPermissions UnmetPrecondition
} }
} }

View File

@@ -211,10 +211,10 @@ namespace Discord.Commands
// TODO: this logic is for users who don't manually search/execute: should we keep it? // TODO: this logic is for users who don't manually search/execute: should we keep it?
IReadOnlyList<Command> commands = searchResult.Commands IReadOnlyList<Command> commands = searchResult.Commands
.Where(x => x.CanExecute(message)).ToImmutableArray(); .Where(x => x.MeetsPreconditions(message)).ToImmutableArray();
if (commands.Count == 0 && searchResult.Commands.Count > 0) if (commands.Count == 0 && searchResult.Commands.Count > 0)
return ParseResult.FromError(CommandError.InvalidPermissions, "Invalid permissions"); return ParseResult.FromError(CommandError.UnmetPrecondition, "Unmet precondition");
for (int i = commands.Count - 1; i >= 0; i--) for (int i = commands.Count - 1; i >= 0; i--)
{ {

View File

@@ -5,16 +5,16 @@ using System.Threading.Tasks;
namespace Discord.Commands namespace Discord.Commands
{ {
public class PermissionsContext public class PreconditionContext
{ {
public Command ExecutingCommand { get; internal set; } public Command Command { get; internal set; }
public IMessage Message { get; internal set; } public IMessage Message { get; internal set; }
public bool Handled { get; set; } public bool Handled { get; set; }
internal PermissionsContext(Command command, IMessage message) internal PreconditionContext(Command command, IMessage message)
{ {
ExecutingCommand = command; Command = command;
Message = message; Message = message;
Handled = false; Handled = false;