diff --git a/src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs b/src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs
index 367adebf0..479b13136 100644
--- a/src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs
+++ b/src/Discord.Net.Commands/Attributes/PreconditionAttribute.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Threading.Tasks;
namespace Discord.Commands
@@ -13,6 +13,14 @@ namespace Discord.Commands
///
public string Group { get; set; } = null;
+ ///
+ /// When overridden in a derived class, uses the supplied string
+ /// as the error message if the precondition doesn't pass.
+ /// Setting this for a class that doesn't override
+ /// this property is a no-op.
+ ///
+ public virtual string ErrorMessage { get { return null; } set { } }
+
public abstract Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services);
}
}
diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireBotPermissionAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireBotPermissionAttribute.cs
index 104252799..050b3c0a6 100644
--- a/src/Discord.Net.Commands/Attributes/Preconditions/RequireBotPermissionAttribute.cs
+++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireBotPermissionAttribute.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Threading.Tasks;
namespace Discord.Commands
@@ -11,6 +11,7 @@ namespace Discord.Commands
{
public GuildPermission? GuildPermission { get; }
public ChannelPermission? ChannelPermission { get; }
+ public override string ErrorMessage { get; set; }
///
/// Require that the bot account has a specified GuildPermission
@@ -52,7 +53,7 @@ namespace Discord.Commands
if (guildUser == null)
return PreconditionResult.FromError("Command must be used in a guild channel");
if (!guildUser.GuildPermissions.Has(GuildPermission.Value))
- return PreconditionResult.FromError($"Bot requires guild permission {GuildPermission.Value}");
+ return PreconditionResult.FromError(ErrorMessage ?? $"Bot requires guild permission {GuildPermission.Value}");
}
if (ChannelPermission.HasValue)
@@ -64,7 +65,7 @@ namespace Discord.Commands
perms = ChannelPermissions.All(context.Channel);
if (!perms.Has(ChannelPermission.Value))
- return PreconditionResult.FromError($"Bot requires channel permission {ChannelPermission.Value}");
+ return PreconditionResult.FromError(ErrorMessage ?? $"Bot requires channel permission {ChannelPermission.Value}");
}
return PreconditionResult.FromSuccess();
diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireContextAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireContextAttribute.cs
index 90af035e4..c9f448576 100644
--- a/src/Discord.Net.Commands/Attributes/Preconditions/RequireContextAttribute.cs
+++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireContextAttribute.cs
@@ -19,6 +19,7 @@ namespace Discord.Commands
public class RequireContextAttribute : PreconditionAttribute
{
public ContextType Contexts { get; }
+ public override string ErrorMessage { get; set; }
///
/// Require that the command be invoked in a specified context.
@@ -52,7 +53,7 @@ namespace Discord.Commands
if (isValid)
return Task.FromResult(PreconditionResult.FromSuccess());
else
- return Task.FromResult(PreconditionResult.FromError($"Invalid context for command; accepted contexts: {Contexts}"));
+ return Task.FromResult(PreconditionResult.FromError(ErrorMessage ?? $"Invalid context for command; accepted contexts: {Contexts}"));
}
}
}
diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireNsfwAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireNsfwAttribute.cs
index 273c764bd..2f628b021 100644
--- a/src/Discord.Net.Commands/Attributes/Preconditions/RequireNsfwAttribute.cs
+++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireNsfwAttribute.cs
@@ -9,12 +9,14 @@ namespace Discord.Commands
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RequireNsfwAttribute : PreconditionAttribute
{
+ public override string ErrorMessage { get; set; }
+
public override Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services)
{
if (context.Channel is ITextChannel text && text.IsNsfw)
return Task.FromResult(PreconditionResult.FromSuccess());
else
- return Task.FromResult(PreconditionResult.FromError("This command may only be invoked in an NSFW channel."));
+ return Task.FromResult(PreconditionResult.FromError(ErrorMessage ?? "This command may only be invoked in an NSFW channel."));
}
}
}
diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireOwnerAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireOwnerAttribute.cs
index 93e3cbe18..4ad82579d 100644
--- a/src/Discord.Net.Commands/Attributes/Preconditions/RequireOwnerAttribute.cs
+++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireOwnerAttribute.cs
@@ -1,5 +1,7 @@
+#pragma warning disable CS0618
using System;
using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
namespace Discord.Commands
{
@@ -10,6 +12,8 @@ namespace Discord.Commands
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RequireOwnerAttribute : PreconditionAttribute
{
+ public override string ErrorMessage { get; set; }
+
public override async Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services)
{
switch (context.Client.TokenType)
@@ -17,10 +21,10 @@ namespace Discord.Commands
case TokenType.Bot:
var application = await context.Client.GetApplicationInfoAsync();
if (context.User.Id != application.Owner.Id)
- return PreconditionResult.FromError("Command can only be run by the owner of the bot");
+ return PreconditionResult.FromError(ErrorMessage ?? "Command can only be run by the owner of the bot");
return PreconditionResult.FromSuccess();
default:
- return PreconditionResult.FromError($"{nameof(RequireOwnerAttribute)} is not supported by this {nameof(TokenType)}.");
+ return PreconditionResult.FromError($"{nameof(RequireOwnerAttribute)} is not supported by this {nameof(TokenType)}.");
}
}
}
diff --git a/src/Discord.Net.Commands/Attributes/Preconditions/RequireUserPermissionAttribute.cs b/src/Discord.Net.Commands/Attributes/Preconditions/RequireUserPermissionAttribute.cs
index 14121f35b..7a7f6e4d0 100644
--- a/src/Discord.Net.Commands/Attributes/Preconditions/RequireUserPermissionAttribute.cs
+++ b/src/Discord.Net.Commands/Attributes/Preconditions/RequireUserPermissionAttribute.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Threading.Tasks;
namespace Discord.Commands
@@ -11,6 +11,7 @@ namespace Discord.Commands
{
public GuildPermission? GuildPermission { get; }
public ChannelPermission? ChannelPermission { get; }
+ public override string ErrorMessage { get; set; }
///
/// Require that the user invoking the command has a specified GuildPermission
@@ -51,7 +52,7 @@ namespace Discord.Commands
if (guildUser == null)
return Task.FromResult(PreconditionResult.FromError("Command must be used in a guild channel"));
if (!guildUser.GuildPermissions.Has(GuildPermission.Value))
- return Task.FromResult(PreconditionResult.FromError($"User requires guild permission {GuildPermission.Value}"));
+ return Task.FromResult(PreconditionResult.FromError(ErrorMessage ?? $"User requires guild permission {GuildPermission.Value}"));
}
if (ChannelPermission.HasValue)
@@ -63,7 +64,7 @@ namespace Discord.Commands
perms = ChannelPermissions.All(context.Channel);
if (!perms.Has(ChannelPermission.Value))
- return Task.FromResult(PreconditionResult.FromError($"User requires channel permission {ChannelPermission.Value}"));
+ return Task.FromResult(PreconditionResult.FromError(ErrorMessage ?? $"User requires channel permission {ChannelPermission.Value}"));
}
return Task.FromResult(PreconditionResult.FromSuccess());