Discord Bot无法检测成员是否已拥有Muted角色问题求助
解决Discord Bot无法检测成员Muted角色的问题
嘿,我一眼就看到你代码里的问题啦——这是个很容易犯的逻辑小错误,别着急,咱们一步步来修正:
问题核心
你现在写的if (Mute)判断的是你的服务器里是否存在Muted这个角色,而不是目标成员是否拥有这个角色。只要服务器里创建了这个角色,Mute变量就会是一个有效的角色对象(也就是truthy值),所以不管目标成员有没有这个角色,这个条件都会成立,自然每次都会回复"That member is muted already!"。
修正方案
你需要检查的是目标成员的角色列表里是否包含Muted角色,可以用Discord.js提供的roles.cache.has()方法来判断(用角色ID判断最可靠)。同时,我们最好先确认Mute和Member角色确实存在,避免因为ID写错导致后续操作报错。
修正后的完整代码
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(); if (target) { 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'); // 先检查Mute和Member角色是否存在 if (!Mute || !Member) { return message.reply("服务器中缺少必要的角色,请检查角色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 }) }) } } }
关键修改点说明
- 把
if (Mute)替换为if (memberTarget.roles.cache.has(Mute.id)):现在会准确检查目标成员的角色缓存中是否包含Muted角色 - 新增了角色存在性检查:如果Mute或Member角色不存在(比如ID填错了),会直接提示错误,避免后续执行
roles.add()/roles.remove()时抛出异常 - 调整了代码结构:把
memberTarget的定义移到target存在的判断分支里,避免target为undefined时出现Cannot read property 'id' of undefined的错误
这样修改后,你的Bot就能正确识别成员是否已被静音啦!
内容的提问来源于stack exchange,提问作者Ashley
相关产品推荐
相关产品推荐

