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

Discord.js如何判断用户有MANAGE_MESSAGES权限以避免误分配禁言角色

问题原因

你当前的代码没有添加发送者的权限校验逻辑,所以无论用户持有什么权限,只要触发了违规消息规则都会被添加禁言角色。此外原代码还存在两个隐性问题:

  • 首次创建Muted角色时没有做异步等待,角色创建成功后不会给本次触发规则的用户添加禁言角色
  • Muted角色创建后默认没有配置频道权限覆写,可能无法生效禁言效果

解决方法

在检测到违规消息后、执行禁言操作前,添加权限校验逻辑,豁免持有MANAGE_MESSAGES权限的用户即可,修正后代码如下:

client.on('message', async (message) => {
  let data = await antilinks.findOne({ Guild: message.guild.id });
  if (data.run === 'off') return;
  if (data.run === 'on') {
    if (links(message.content) === true) {
      message.delete()
      try {
        // 新增权限校验:持有管理消息权限的用户直接跳过禁言
        if (message.member.permissions.has('MANAGE_MESSAGES')) return;

        let muterole = message.guild.roles.cache.find(ro => ro.name === 'Muted');
        if (!muterole) {
          // 新增await等待角色创建完成
          muterole = await message.guild.roles.create({
            data: {
              name: 'Muted',
              color: 'RANDOM',
              permissions: []
            }
          });
          // 可选:给所有频道添加Muted角色的权限覆写,禁止发消息
          message.guild.channels.cache.forEach(async (channel) => {
            await channel.permissionOverwrites.create(muterole, {
              SEND_MESSAGES: false,
              ADD_REACTIONS: false,
              SPEAK: false
            });
          });
        }
        // 把添加角色逻辑移到else外面,保证首次创建角色也能生效
        await message.member.roles.add(muterole);
      } catch (err) {
        console.log(err);
      }
    }
  }
})

注意事项

  • 如果你使用的是Discord.js v14及以上版本,权限枚举值需要改为PermissionFlagsBits.ManageMessages,同时引入对应的枚举类
  • 如果你需要只豁免全局持有该权限的用户、不豁免仅在当前频道持有该权限的用户,可以把权限判断改为message.member.permissionsIn(message.guild).has('MANAGE_MESSAGES')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:03