RequireRole permission for commands. (#2923)
* Create RequireRoleAttribute.cs * Apply suggestions from code review --------- Co-authored-by: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Discord.Commands
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Requires the user invoking the command to have a specified role.
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
|
||||||
|
public class RequireRoleAttribute : PreconditionAttribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the specified Role name of the precondition.
|
||||||
|
/// </summary>
|
||||||
|
public string RoleName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the specified Role ID of the precondition.
|
||||||
|
/// </summary>
|
||||||
|
public ulong? RoleId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the error message if the precondition
|
||||||
|
/// fails due to being run outside of a Guild channel.
|
||||||
|
/// </summary>
|
||||||
|
public string NotAGuildErrorMessage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Requires that the user invoking the command to have a specific Role.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="roleId">Id of the role that the user must have.</param>
|
||||||
|
public RequireRoleAttribute(ulong roleId)
|
||||||
|
{
|
||||||
|
RoleId = roleId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Requires that the user invoking the command to have a specific Role.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="roleName">Name of the role that the user must have.</param>
|
||||||
|
public RequireRoleAttribute(string roleName)
|
||||||
|
{
|
||||||
|
RoleName = roleName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override Task<PreconditionResult> CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services)
|
||||||
|
{
|
||||||
|
if (context.User is not IGuildUser guildUser)
|
||||||
|
return Task.FromResult(PreconditionResult.FromError(NotAGuildErrorMessage ?? "Command must be used in a guild channel."));
|
||||||
|
|
||||||
|
if (RoleId.HasValue)
|
||||||
|
{
|
||||||
|
if (guildUser.RoleIds.Contains(RoleId.Value))
|
||||||
|
return Task.FromResult(PreconditionResult.FromSuccess());
|
||||||
|
else
|
||||||
|
return Task.FromResult(PreconditionResult.FromError(ErrorMessage ?? $"User requires guild role {context.Guild.GetRole(RoleId.Value).Name}."));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(RoleName))
|
||||||
|
{
|
||||||
|
var roleNames = guildUser.RoleIds.Select(x => guildUser.Guild.GetRole(x).Name);
|
||||||
|
|
||||||
|
if (roleNames.Contains(RoleName))
|
||||||
|
return Task.FromResult(PreconditionResult.FromSuccess());
|
||||||
|
else
|
||||||
|
return Task.FromResult(PreconditionResult.FromError(ErrorMessage ?? $"User requires guild role {RoleName}."));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.FromResult(PreconditionResult.FromSuccess());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user