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
{
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 Module Module { 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)
{
@@ -42,11 +42,11 @@ namespace Discord.Commands
_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);
if (context.Handled)
@@ -68,8 +68,8 @@ namespace Discord.Commands
if (!parseResult.IsSuccess)
return ExecuteResult.FromError(parseResult);
if (!CanExecute(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");
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");
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)

View File

@@ -16,6 +16,6 @@
//Execute
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?
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)
return ParseResult.FromError(CommandError.InvalidPermissions, "Invalid permissions");
return ParseResult.FromError(CommandError.UnmetPrecondition, "Unmet precondition");
for (int i = commands.Count - 1; i >= 0; i--)
{

View File

@@ -5,16 +5,16 @@ using System.Threading.Tasks;
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 bool Handled { get; set; }
internal PermissionsContext(Command command, IMessage message)
internal PreconditionContext(Command command, IMessage message)
{
ExecutingCommand = command;
Command = command;
Message = message;
Handled = false;