Discord.js机器人awaitReactions无法识别持指定角色用户的反应
错误原因
你的过滤器逻辑存在核心问题:reaction 对象本身不存在 member 属性,直接访问 reaction.member.roles 会返回 undefined,导致普通用户的反应始终无法通过校验,只有机器人自身的反应能匹配上你填写的机器人角色ID,所以才会出现你描述的现象。同时你没有过滤机器人自己的初始反应,会导致逻辑提前被机器人的表情触发。
修复后的代码
client.channels.cache.get("771101528386961428").send(embed).then(async function (message) { await message.react("👍") await message.react("👎") const filter2 = async (reaction, user) => { // 过滤机器人自身的反应 if (user.bot) return false // 校验反应表情是否符合要求 if (!['👍', '👎'].includes(reaction.emoji.name)) return false // 拉取反应用户的服务器成员实例 const member = await message.guild.members.fetch(user.id).catch(() => null) if (!member) return false // 校验是否持有指定角色 return member.roles.cache.has("873477291445985330") }; message.awaitReactions({ filter: filter2, max: 1, time: 60000, errors: ['time'] }) .then(collected => { const reaction = collected.first(); if (reaction.emoji.name === '👍') { client.channels.cache.get("868298545269182495").send(Aembed) } else { message.author.send("Your request has been denied"); } }) .catch(collected => { console.log(`After a minute, only ${collected.size} reacted.`); message.reply('you didn\'t react with neither a thumbs up, nor a thumbs down.'); }); });
额外注意事项
- 如果你使用Discord.js v13及以上版本,需要在开发者后台开启机器人的
GUILD_MESSAGE_REACTIONS特权意图,同时初始化客户端时声明该意图,否则无法接收用户反应事件。 - 用
roles.cache.has(角色ID)比roles.cache.find()判断角色权限的效率更高,更推荐使用。
内容的提问来源于stack exchange,提问作者Dandy
相关产品推荐
相关产品推荐

