Browse Source

[Docs] Adding permission docs for interaction framework (#2265)

* Get rid of mediatrsample sln

* Add framework perms doc

* Append suggestion

Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

* Append suggestion

Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
tags/3.6.0
Armano den Boef GitHub 3 years ago
parent
commit
9bd088f9b9
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 94 additions and 16 deletions
  1. +59
    -0
      docs/guides/int_framework/permissions.md
  2. +6
    -0
      docs/guides/int_framework/samples/permissions/guild-only.cs
  3. +7
    -0
      docs/guides/int_framework/samples/permissions/guild-perms.cs
  4. +16
    -0
      docs/guides/int_framework/samples/permissions/perm-nesting.cs
  5. +4
    -0
      docs/guides/int_framework/samples/permissions/perm-stacking.cs
  6. +2
    -0
      docs/guides/toc.yml
  7. +0
    -16
      samples/MediatRSample/MediatRSample.sln

+ 59
- 0
docs/guides/int_framework/permissions.md View File

@@ -0,0 +1,59 @@
---
uid: Guides.IntFw.Perms
title: How to handle permissions.
---

# Permissions

This page covers everything to know about setting up permissions for Slash & context commands.

Application command (Slash, User & Message) permissions are set up at creation.
When you add your commands to a guild or globally, the permissions will be set up from the attributes you defined.

Commands that are added will only show up for members that meet the required permissions.
There is no further internal handling, as Discord deals with this on its own.

> [!WARNING]
> Permissions can only be configured at top level commands. Not in subcommands.

## Disallowing commands in DM

Commands can be blocked from being executed in DM if a guild is required to execute them in as followed:

[!code-csharp[no-DM permission](samples/permissions/guild-only.cs)]

> [!TIP]
> This attribute only works on global-level commands. Commands that are registered in guilds alone do not have a need for it.

## Server permissions

As previously shown, a command like ban can be blocked from being executed inside DMs,
as there are no members to ban inside of a DM. However, for a command like this,
we'll also want to make block it from being used by members that do not have the [permissions].
To do this, we can use the `DefaultMemberPermissions` attribute:

[!code-csharp[Server permissions](samples/permissions/guild-perms.cs)]

### Stacking permissions

If you want a user to have multiple [permissions] in order to execute a command, you can use the `|` operator, just like with setting up intents:

[!code-csharp[Permission stacking](samples/permissions/perm-stacking.cs)]

### Nesting permissions

Alternatively, permissions can also be nested.
It will look for all uses of `DefaultMemberPermissions` up until the highest level class.
The `EnabledInDm` attribute can be defined at top level as well,
and will be set up for all of the commands & nested modules inside this class.

[!code-csharp[Permission stacking](samples/permissions/perm-nesting.cs)]

The amount of nesting you can do is realistically endless.

> [!NOTE]
> If the nested class is marked with `Group`, as required for setting up subcommands, this example will not work.
> As mentioned before, subcommands cannot have seperate permissions from the top level command.

[permissions]: xref:Discord.GuildPermission


+ 6
- 0
docs/guides/int_framework/samples/permissions/guild-only.cs View File

@@ -0,0 +1,6 @@
[EnabledInDm(false)]
[SlashCommand("ban", "Bans a user in this guild")]
public async Task BanAsync(...)
{
...
}

+ 7
- 0
docs/guides/int_framework/samples/permissions/guild-perms.cs View File

@@ -0,0 +1,7 @@
[EnabledInDm(false)]
[DefaultMemberPermissions(GuildPermission.BanMembers)]
[SlashCommand("ban", "Bans a user in this guild")]
public async Task BanAsync(...)
{
...
}

+ 16
- 0
docs/guides/int_framework/samples/permissions/perm-nesting.cs View File

@@ -0,0 +1,16 @@
[EnabledInDm(true)]
[DefaultMemberPermissions(GuildPermission.ViewChannels)]
public class Module : InteractionModuleBase<SocketInteractionContext>
{
[DefaultMemberPermissions(GuildPermission.SendMessages)]
public class NestedModule : InteractionModuleBase<SocketInteractionContext>
{
// While looking for more permissions, it has found 'ViewChannels' and 'SendMessages'. The result of this lookup will be:
// ViewChannels + SendMessages + ManageMessages.
// If these together are not found for target user, the command will not show up for them.
[DefaultMemberPermissions(GuildPermission.ManageMessages)]
[SlashCommand("ping", "Pong!")]
public async Task Ping()
=> await RespondAsync("pong");
}
}

+ 4
- 0
docs/guides/int_framework/samples/permissions/perm-stacking.cs View File

@@ -0,0 +1,4 @@
[DefaultMemberPermissions(GuildPermission.SendMessages | GuildPermission.ViewChannels)]
[SlashCommand("ping", "Pong!")]
public async Task Ping()
=> await RespondAsync("pong");

+ 2
- 0
docs/guides/toc.yml View File

@@ -57,6 +57,8 @@
topicUid: Guides.IntFw.DI topicUid: Guides.IntFw.DI
- name: Post-execution Handling - name: Post-execution Handling
topicUid: Guides.IntFw.PostExecution topicUid: Guides.IntFw.PostExecution
- name: Permissions
topicUid: Guides.IntFw.Perms
- name: Slash Command Basics - name: Slash Command Basics
items: items:
- name: Introduction - name: Introduction


+ 0
- 16
samples/MediatRSample/MediatRSample.sln View File

@@ -1,16 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediatRSample", "MediatRSample\MediatRSample.csproj", "{CE066EE5-7ED1-42A0-8DB2-862D44F40EA7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CE066EE5-7ED1-42A0-8DB2-862D44F40EA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE066EE5-7ED1-42A0-8DB2-862D44F40EA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CE066EE5-7ED1-42A0-8DB2-862D44F40EA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE066EE5-7ED1-42A0-8DB2-862D44F40EA7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

Loading…
Cancel
Save