diff --git a/src/Discord.Net.Commands/Attributes/PermissionAttribute.cs b/src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs similarity index 51% rename from src/Discord.Net.Commands/Attributes/PermissionAttribute.cs rename to src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs index 70825aec1..38130aa76 100644 --- a/src/Discord.Net.Commands/Attributes/PermissionAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs @@ -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); } } diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireDMAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireDMAttribute.cs new file mode 100644 index 000000000..32d863a0e --- /dev/null +++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireDMAttribute.cs @@ -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; + } + } +} diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireGuildAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireGuildAttribute.cs new file mode 100644 index 000000000..d1615f299 --- /dev/null +++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireGuildAttribute.cs @@ -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; + } + } +} diff --git a/src/Discord.Net.Commands/Command.cs b/src/Discord.Net.Commands/Command.cs index 897106ac3..4c7e6e7cd 100644 --- a/src/Discord.Net.Commands/Command.cs +++ b/src/Discord.Net.Commands/Command.cs @@ -19,7 +19,7 @@ namespace Discord.Commands public string Text { get; } public Module Module { get; } public IReadOnlyList Parameters { get; } - public IReadOnlyList Permissions { get; } + public IReadOnlyList 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 BuildPermissions(MethodInfo methodInfo) + private IReadOnlyList BuildPermissions(MethodInfo methodInfo) { - return methodInfo.GetCustomAttributes().ToImmutableArray(); + return methodInfo.GetCustomAttributes().ToImmutableArray(); } private IReadOnlyList BuildParameters(MethodInfo methodInfo) diff --git a/src/Discord.Net.Commands/CommandError.cs b/src/Discord.Net.Commands/CommandError.cs index 696e5130f..31a84ea1a 100644 --- a/src/Discord.Net.Commands/CommandError.cs +++ b/src/Discord.Net.Commands/CommandError.cs @@ -16,6 +16,6 @@ //Execute Exception, - InvalidPermissions + UnmetPrecondition } } diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 07566c2c4..dbf385a5c 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -211,10 +211,10 @@ namespace Discord.Commands // TODO: this logic is for users who don't manually search/execute: should we keep it? IReadOnlyList 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--) { diff --git a/src/Discord.Net.Commands/Context/PermissionsContext.cs b/src/Discord.Net.Commands/Context/PreconditionContext.cs similarity index 60% rename from src/Discord.Net.Commands/Context/PermissionsContext.cs rename to src/Discord.Net.Commands/Context/PreconditionContext.cs index 8c9b79e22..7a1ef118e 100644 --- a/src/Discord.Net.Commands/Context/PermissionsContext.cs +++ b/src/Discord.Net.Commands/Context/PreconditionContext.cs @@ -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;