You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js中如何获取触发命令用户的角色并校验指定角色权限

Discord.js 斜杠命令角色校验实现方案

核心实现逻辑

  • 优先排除私聊场景:私聊环境无法获取用户的服务器角色信息,直接返回无权限提示
  • 从交互实例中获取发起用户的服务器成员对象 interaction.member
  • 调用角色缓存的 some() 方法匹配允许的角色列表,只要命中任意一个角色即通过校验

完整代码示例

将以下逻辑添加到你现有的 interactionCreate 事件中即可:

client.on('interactionCreate', async interaction => {
  if (!interaction.isCommand()) return;
  // 排除私聊场景
  if (!interaction.inGuild()) {
    return interaction.reply({ content: '该命令仅能在服务器内使用', ephemeral: true });
  }

  const username = interaction.user.username;

  // 原有ping命令逻辑
  if (interaction.commandName === 'ping') {
    await interaction.reply('Pong!');
  }

  // whotohelp命令逻辑
  if (interaction.commandName === 'whotohelp') {
    // 配置允许使用命令的角色列表
    const allowedRoles = ["Lab Demonstrator", "lab demonstrator", "staff", "teaching-assistant", "lecturers", "admin", "Admin"];
    // 校验用户是否持有任意允许角色,此处统一转小写匹配,兼容大小写不同的角色名
    const hasPermission = interaction.member.roles.cache.some(role => {
      return allowedRoles.map(item => item.toLowerCase()).includes(role.name.toLowerCase())
    });

    // 无权限时直接返回提示,ephemeral为true表示仅发起命令的用户可见该回复
    if (!hasPermission) {
      return interaction.reply({ content: '你没有权限使用该命令', ephemeral: true });
    }

    // 权限校验通过后编写你的业务逻辑即可
    await interaction.reply('命令执行成功');
  }
});

优化建议

如果想要更稳定的校验效果,推荐使用角色ID而非角色名进行匹配,角色ID不会随角色重命名发生变化,修改逻辑如下:

// 替换为你服务器内对应角色的实际ID
const allowedRoleIds = ["角色ID1", "角色ID2", "角色ID3"];
const hasPermission = interaction.member.roles.cache.some(role => allowedRoleIds.includes(role.id));

内容的提问来源于stack exchange,提问作者Osian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:57:03