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

Discord Bot无法检测成员是否已拥有Muted角色问题求助

问题分析与解决方案

嘿,我一眼就看出你代码里的问题啦!你当前的判断逻辑完全搞反了方向——你现在检查的是服务器中是否存在Muted角色,而不是目标成员是否拥有这个角色。

看这段代码:

let Mute = message.guild.roles.cache.find(role => role.id === 'MutedIdGoesHere');
// ...
if (Mute) {
  message.reply("That member is muted already!")
}

这里的Mute变量是从服务器的角色缓存里获取的角色对象,只要你的服务器里存在这个角色,Mute就永远是一个真值,所以不管目标成员有没有这个角色,代码都会走进“已静音”的分支。


修复方案

你需要把判断逻辑改成检查目标成员的角色列表中是否包含Muted角色,推荐用roles.cache.has()方法(更高效),也可以用roles.cache.find():

修改后的核心判断部分应该是这样的:

// 先确保Muted角色存在(可选但能避免后续报错)
if (!Mute) {
  return message.reply("服务器中不存在Muted角色,请检查角色ID!");
}
// 检查目标成员是否拥有Muted角色
if (memberTarget.roles.cache.has(Mute.id)) {
  message.reply("That member is muted already!")
} else {
  memberTarget.roles.add(Mute);
  memberTarget.roles.remove(Member);
  message.reply(`<@${memberTarget.user.id}> has been muted!`).then(msg => {
    msg.delete({ timeout: 5000 });
  })
}

完整修改后的代码

module.exports = { 
  name: 'mute', 
  description: "Mute members", 
  execute(message, args, Discord, client) { 
    const Admin = message.member.roles.cache.find(role => role.id === 'AdminIDGoesHere'); 
    const Mod = message.member.roles.cache.find(role => role.id === 'ModIdGoesHere'); 

    if (Admin || Mod) { 
      const target = message.mentions.users.first(); 
      let memberTarget = message.guild.members.cache.get(target.id); 
      let Mute = message.guild.roles.cache.find(role => role.id === 'MutedIdGoesHere'); 
      let Member = message.guild.roles.cache.find(role => role.id === 'MemberIdGoesHere'); 

      if (target) { 
        // 先检查Muted角色是否存在于服务器
        if (!Mute) {
          return message.reply("服务器中未找到Muted角色,请确认角色ID是否正确!").then(msg => {
            msg.delete({ timeout: 5000 });
          });
        }
        // 检查目标成员是否已拥有Muted角色
        if (memberTarget.roles.cache.has(Mute.id)) { 
          message.reply("That member is muted already!") 
        } else { 
          memberTarget.roles.add(Mute); 
          memberTarget.roles.remove(Member); 
          message.reply(`<@${memberTarget.user.id}> has been muted!`).then(msg => { 
            msg.delete({ timeout: 5000 }); 
          }) 
        } 
      } else { 
        message.reply("Couldn't find that member!").then(msg => { 
          msg.delete({ timeout: 5000 }); 
        }) 
      } 
    } else { 
      message.reply("You don't have permission to do that!").then(msg => { 
        msg.delete({ timeout: 5000 }) 
      }) 
    } 
  } 
}

额外小提示

  • 建议把角色ID抽成常量或者放在配置文件里,避免硬编码在代码中,后续修改会更方便。
  • 可以增加memberTarget不存在时的错误处理(比如成员已退出服务器),避免代码抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:54:37