Discord.js开发:如何检查特定用户是否使用指定emoji添加反应?
问题原因说明
你之前的两段代码存在以下问题:
- 第一版逻辑的问题:
messageReactionAdd事件触发时,用户刚提交的反应已经被写入缓存,直接判断当前反应的用户列表是否包含该用户,一定会返回真,所以每次都会移除刚添加的反应。 - 第二版逻辑的问题:仅判断了消息下是否存在对应emoji的反应,没有进一步校验该反应的添加者是否为目标用户,只要机器人或其他用户加过对应emoji,就会返回真。
方案1:实现单用户对单条消息仅能添加1次任意表情反应
直接用以下事件监听逻辑即可:
client.on('messageReactionAdd', async (reaction, user) => { // 过滤机器人操作,避免误删机器人的反应 if (user.bot) return; // 缓存缺失时先拉取所有反应的用户列表 for (const r of reaction.message.reactions.cache.values()) { await r.users.fetch().catch(() => {}); } // 排除本次刚触发的反应,检查用户是否已经添加过其他反应 const hasReacted = reaction.message.reactions.cache.some(r => { if (r === reaction) return false; return r.users.cache.has(user.id); }); if (hasReacted) { // 已添加过其他反应,移除本次提交的反应 reaction.users.remove(user.id).catch(() => {}); } });
方案2:单独检查特定用户是否添加了指定emoji的反应
如果仅需要做独立校验,用以下封装方法即可:
async function checkUserHasSpecificReaction(message, targetEmojiName, userId) { // 匹配目标emoji的反应实例 const targetReaction = message.reactions.cache.find(r => r.emoji.name === targetEmojiName); if (!targetReaction) return false; // 拉取反应的用户列表,避免缓存不全 await targetReaction.users.fetch().catch(() => {}); return targetReaction.users.cache.has(userId); }
调用示例:
const isReacted = await checkUserHasSpecificReaction(message, 'my_emoji', '目标用户ID');
内容的提问来源于stack exchange,提问作者MrMythical
相关产品推荐
相关产品推荐

