| @@ -8,7 +8,7 @@ remarks: *content | |||
| This precondition attribute can be applied on module-level or | |||
| method-level for a command. | |||
| [!include[Remarks(PreconditionAttribute.Remarks.Inclusion.md)]] | |||
| [!include[Additional Remarks](PreconditionAttribute.Remarks.Inclusion.md)] | |||
| --- | |||
| uid: Discord.Commands.ParameterPreconditionAttribute | |||
| @@ -20,11 +20,88 @@ remarks: *content | |||
| This precondition attribute can be applied on parameter-level for a | |||
| command. | |||
| [!include[Remarks(PreconditionAttribute.Remarks.Inclusion.md)]] | |||
| [!include[Additional Remarks](PreconditionAttribute.Remarks.Inclusion.md)] | |||
| --- | |||
| uid: Discord.Commands.PreconditionAttribute | |||
| example: [*content] | |||
| --- | |||
| // todo: add example | |||
| The following example creates a precondition to see if the user has | |||
| sufficient role required to access the command. | |||
| ```cs | |||
| public class RequireRoleAtribute : PreconditionAttribute | |||
| { | |||
| private readonly ulong _roleId; | |||
| public RequireRoleAtribute(ulong roleId) | |||
| { | |||
| _roleId = roleId; | |||
| } | |||
| public override async Task<PreconditionResult> 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<PreconditionResult> 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(); | |||
| } | |||
| } | |||
| ``` | |||