Browse Source

Add examples for precondition attributes

pull/988/head
Hsu Still 7 years ago
parent
commit
96b95796a1
No known key found for this signature in database GPG Key ID: 8601A145FDA95209
1 changed files with 80 additions and 3 deletions
  1. +80
    -3
      docs/_overwrites/Commands/PreconditionAttribute.Overwrites.md

+ 80
- 3
docs/_overwrites/Commands/PreconditionAttribute.Overwrites.md View File

@@ -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();
}
}
```

Loading…
Cancel
Save