* 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
@@ -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 | |||||
@@ -0,0 +1,6 @@ | |||||
[EnabledInDm(false)] | |||||
[SlashCommand("ban", "Bans a user in this guild")] | |||||
public async Task BanAsync(...) | |||||
{ | |||||
... | |||||
} |
@@ -0,0 +1,7 @@ | |||||
[EnabledInDm(false)] | |||||
[DefaultMemberPermissions(GuildPermission.BanMembers)] | |||||
[SlashCommand("ban", "Bans a user in this guild")] | |||||
public async Task BanAsync(...) | |||||
{ | |||||
... | |||||
} |
@@ -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"); | |||||
} | |||||
} |
@@ -0,0 +1,4 @@ | |||||
[DefaultMemberPermissions(GuildPermission.SendMessages | GuildPermission.ViewChannels)] | |||||
[SlashCommand("ping", "Pong!")] | |||||
public async Task Ping() | |||||
=> await RespondAsync("pong"); |
@@ -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 | ||||
@@ -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 |