From 299195649690e117d3723671c385ff48e093d8f7 Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 18 Nov 2015 23:26:05 -0400 Subject: [PATCH] Added GenericPermissionChecker, PublicChecker and PrivateChecker --- .../Discord.Net.Commands.csproj | 15 +++++++++++++ src/Discord.Net.Commands/CommandBuilder.cs | 13 ++++++++++-- .../Permissions/GenericPermissionChecker.cs | 20 ++++++++++++++++++ .../Permissions/Visibility/PrivateChecker.cs | 21 +++++++++++++++++++ .../Visibility/PrivateExtensions.cs | 21 +++++++++++++++++++ .../Permissions/Visibility/PublicChecker.cs | 21 +++++++++++++++++++ .../Visibility/PublicExtensions.cs | 21 +++++++++++++++++++ 7 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 src/Discord.Net.Commands/Permissions/GenericPermissionChecker.cs create mode 100644 src/Discord.Net.Commands/Permissions/Visibility/PrivateChecker.cs create mode 100644 src/Discord.Net.Commands/Permissions/Visibility/PrivateExtensions.cs create mode 100644 src/Discord.Net.Commands/Permissions/Visibility/PublicChecker.cs create mode 100644 src/Discord.Net.Commands/Permissions/Visibility/PublicExtensions.cs diff --git a/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj b/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj index b2c6076de..59185a172 100644 --- a/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj @@ -61,6 +61,9 @@ CommandServiceConfig.cs + + Permissions\GenericPermissionChecker.cs + Permissions\IPermissionChecker.cs @@ -94,6 +97,18 @@ Permissions\Userlist\WhitelistService.cs + + Permissions\Visibility\PrivateChecker.cs + + + Permissions\Visibility\PrivateExtensions.cs + + + Permissions\Visibility\PublicChecker.cs + + + Permissions\Visibility\PublicExtensions.cs + diff --git a/src/Discord.Net.Commands/CommandBuilder.cs b/src/Discord.Net.Commands/CommandBuilder.cs index 4d8ebd603..79dac4916 100644 --- a/src/Discord.Net.Commands/CommandBuilder.cs +++ b/src/Discord.Net.Commands/CommandBuilder.cs @@ -74,6 +74,11 @@ namespace Discord.Commands _checks.Add(check); return this; } + public CommandBuilder AddCheck(Func checkFunc) + { + _checks.Add(new GenericPermissionChecker(checkFunc)); + return this; + } public void Do(Func func) { @@ -129,9 +134,13 @@ namespace Discord.Commands _category = category; return this; } - public void AddCheck(IPermissionChecker check) + public void AddCheck(IPermissionChecker checker) { - _checks.Add(check); + _checks.Add(checker); + } + public void AddCheck(Func checkFunc) + { + _checks.Add(new GenericPermissionChecker(checkFunc)); } public CommandGroupBuilder CreateGroup(string cmd, Action config = null) diff --git a/src/Discord.Net.Commands/Permissions/GenericPermissionChecker.cs b/src/Discord.Net.Commands/Permissions/GenericPermissionChecker.cs new file mode 100644 index 000000000..203eac528 --- /dev/null +++ b/src/Discord.Net.Commands/Permissions/GenericPermissionChecker.cs @@ -0,0 +1,20 @@ +using System; + +namespace Discord.Commands.Permissions +{ + internal class GenericPermissionChecker : IPermissionChecker + { + private readonly Func _checkFunc; + + public GenericPermissionChecker(Func checkFunc) + { + _checkFunc = checkFunc; + } + + public bool CanRun(Command command, User user, Channel channel, out string error) + { + error = null; //Use default error text. + return _checkFunc(command, user, channel); + } + } +} diff --git a/src/Discord.Net.Commands/Permissions/Visibility/PrivateChecker.cs b/src/Discord.Net.Commands/Permissions/Visibility/PrivateChecker.cs new file mode 100644 index 000000000..1a6a91e7d --- /dev/null +++ b/src/Discord.Net.Commands/Permissions/Visibility/PrivateChecker.cs @@ -0,0 +1,21 @@ +namespace Discord.Commands.Permissions.Visibility +{ + public class PrivateChecker : IPermissionChecker + { + internal PrivateChecker() { } + + public bool CanRun(Command command, User user, Channel channel, out string error) + { + if (!user.IsPrivate) + { + error = "This command may only be run in a private chat."; + return false; + } + else + { + error = null; + return true; + } + } + } +} diff --git a/src/Discord.Net.Commands/Permissions/Visibility/PrivateExtensions.cs b/src/Discord.Net.Commands/Permissions/Visibility/PrivateExtensions.cs new file mode 100644 index 000000000..35e25b601 --- /dev/null +++ b/src/Discord.Net.Commands/Permissions/Visibility/PrivateExtensions.cs @@ -0,0 +1,21 @@ +namespace Discord.Commands.Permissions.Visibility +{ + public static class PrivateExtensions + { + public static CommandBuilder PrivateOnly(this CommandBuilder builder) + { + builder.AddCheck(new PrivateChecker()); + return builder; + } + public static CommandGroupBuilder PrivateOnly(this CommandGroupBuilder builder) + { + builder.AddCheck(new PrivateChecker()); + return builder; + } + public static CommandService PrivateOnly(this CommandService service) + { + service.Root.AddCheck(new PrivateChecker()); + return service; + } + } +} diff --git a/src/Discord.Net.Commands/Permissions/Visibility/PublicChecker.cs b/src/Discord.Net.Commands/Permissions/Visibility/PublicChecker.cs new file mode 100644 index 000000000..32e7fbb1f --- /dev/null +++ b/src/Discord.Net.Commands/Permissions/Visibility/PublicChecker.cs @@ -0,0 +1,21 @@ +namespace Discord.Commands.Permissions.Visibility +{ + public class PublicChecker : IPermissionChecker + { + internal PublicChecker() { } + + public bool CanRun(Command command, User user, Channel channel, out string error) + { + if (user.IsPrivate) + { + error = "This command can't be run in n a private chat."; + return false; + } + else + { + error = null; + return true; + } + } + } +} diff --git a/src/Discord.Net.Commands/Permissions/Visibility/PublicExtensions.cs b/src/Discord.Net.Commands/Permissions/Visibility/PublicExtensions.cs new file mode 100644 index 000000000..8cd78a4fe --- /dev/null +++ b/src/Discord.Net.Commands/Permissions/Visibility/PublicExtensions.cs @@ -0,0 +1,21 @@ +namespace Discord.Commands.Permissions.Visibility +{ + public static class PublicExtensions + { + public static CommandBuilder PublicOnly(this CommandBuilder builder) + { + builder.AddCheck(new PublicChecker()); + return builder; + } + public static CommandGroupBuilder PublicOnly(this CommandGroupBuilder builder) + { + builder.AddCheck(new PublicChecker()); + return builder; + } + public static CommandService PublicOnly(this CommandService service) + { + service.Root.AddCheck(new PublicChecker()); + return service; + } + } +}