--- uid: Discord.Commands.PreconditionAttribute remarks: *content --- This precondition attribute can be applied on module-level or method-level for a command. [!include[Additional Remarks](PreconditionAttribute.Remarks.Inclusion.md)] --- uid: Discord.Commands.ParameterPreconditionAttribute remarks: *content --- This precondition attribute can be applied on parameter-level for a command. [!include[Additional Remarks](PreconditionAttribute.Remarks.Inclusion.md)] --- uid: Discord.Commands.PreconditionAttribute example: [*content] --- The following example creates a precondition to see if the user has sufficient role required to access the command. ```cs public class RequireRoleAttribute : PreconditionAttribute { private readonly ulong _roleId; public RequireRoleAttribute(ulong roleId) { _roleId = roleId; } public override async Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services) { var guildUser = context.User as IGuildUser; if (guildUser == null) return PreconditionResult.FromError("This command cannot be executed outside of a guild."); var guild = guildUser.Guild; if (guild.Roles.All(r => r.Id != _roleId)) return PreconditionResult.FromError( $"The guild does not have the role ({_roleId}) required to access this command."); return guildUser.RoleIds.Any(rId => rId == _roleId) ? PreconditionResult.FromSuccess() : PreconditionResult.FromError("You do not have the sufficient role required to access this command."); } } ``` --- uid: Discord.Commands.ParameterPreconditionAttribute example: [*content] --- The following example creates a precondition on a parameter-level to see if the targeted user has a lower hierarchy than the user who executed the command. ```cs public class RequireHierarchyAttribute : ParameterPreconditionAttribute { public override async Task CheckPermissionsAsync(ICommandContext context, ParameterInfo parameter, object value, IServiceProvider services) { // Hierarchy is only available under the socket variant of the user. if (!(context.User is SocketGuildUser guildUser)) return PreconditionResult.FromError("This command cannot be used outside of a guild."); SocketGuildUser targetUser; switch (value) { case SocketGuildUser targetGuildUser: targetUser = targetGuildUser; break; case ulong userId: targetUser = await context.Guild.GetUserAsync(userId).ConfigureAwait(false) as SocketGuildUser; break; default: throw new ArgumentOutOfRangeException(); } if (targetUser == null) return PreconditionResult.FromError("Target user not found."); if (guildUser.Hierarchy < targetUser.Hierarchy) return PreconditionResult.FromError("You cannot target anyone else whose roles are higher than yours."); var currentUser = await context.Guild.GetCurrentUserAsync().ConfigureAwait(false) as SocketGuildUser; if (currentUser?.Hierarchy < targetUser.Hierarchy) return PreconditionResult.FromError("The bot's role is lower than the targeted user."); return PreconditionResult.FromSuccess(); } } ```