Command Handling为Slash Command Permissions时如何集成斜杠命令权限
实现Slash Command权限配置的两种常用方案
方案1:注册命令时配置默认成员权限
这种方式是在命令构造阶段直接指定默认可用的权限组,服务器管理员后续也可以在服务器设置中自行调整每个命令的可用范围。
- 首先从
discord.js包中引入PermissionFlagsBits权限枚举 - 在
SlashCommandBuilder链式调用末尾添加setDefaultMemberPermissions方法,传入对应权限位即可。
修改后的命令示例代码:
const { SlashCommandBuilder } = require('@discordjs/builders'); const { PermissionFlagsBits } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('avatar') .setDescription('Get the avatar URL of the selected user, or your own avatar.') .addUserOption(option => option.setName('target').setDescription('The user\'s avatar to show')) // 示例:仅拥有「踢成员」权限的用户默认可以使用该命令 .setDefaultMemberPermissions(PermissionFlagsBits.KickMembers), async execute(interaction) { const user = interaction.options.getUser('target'); if (user) return interaction.reply(`${user.username}'s avatar: ${user.displayAvatarURL({ dynamic: true })}`); return interaction.reply(`Your avatar: ${interaction.user.displayAvatarURL({ dynamic: true })}`); }, };
方案2:命令执行时动态校验权限
这种方式更灵活,适合需要根据场景动态判断权限、或者需要自定义权限提示文案的场景,直接在execute逻辑最前面加权限校验即可。
示例代码:
const { SlashCommandBuilder } = require('@discordjs/builders'); const { PermissionFlagsBits } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('avatar') .setDescription('Get the avatar URL of the selected user, or your own avatar.') .addUserOption(option => option.setName('target').setDescription('The user\'s avatar to show')), async execute(interaction) { // 权限校验逻辑:判断调用者是否有管理服务器权限 if (!interaction.member.permissions.has(PermissionFlagsBits.ManageGuild)) { return interaction.reply({ content: '你没有权限使用该命令', ephemeral: true }); } const user = interaction.options.getUser('target'); if (user) return interaction.reply(`${user.username}'s avatar: ${user.displayAvatarURL({ dynamic: true })}`); return interaction.reply(`Your avatar: ${interaction.user.displayAvatarURL({ dynamic: true })}`); }, };
上面代码里的ephemeral: true表示只有调用命令的用户自己能看到无权限提示,不会公开刷屏。
注意事项
- 以上逻辑适配discord.js v14及以上版本,更低版本的权限API实现不同,需要单独调整
- 方案1的默认权限配置,全局命令更新后最多需要1小时生效,服务器专属命令更新即时生效
- 两种方案都不会限制服务器所有者的使用,服务器所有者默认拥有所有斜杠命令的使用权限
内容的提问来源于stack exchange,提问作者Justman10000
相关产品推荐
相关产品推荐

