* 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 | |||||