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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:06:05