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;
+ }
+ }
+}