103 lines
3.4 KiB
Markdown
103 lines
3.4 KiB
Markdown
|
---
|
||
|
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<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();
|
||
|
}
|
||
|
}
|
||
|
```
|