如何使用discord.js检测特定用户是否对消息添加了反应
discord.js 检测特定用户指定反应实现方案
前置配置
首先需要在客户端初始化时开启GuildMessageReactions意图,否则无法接收反应相关事件、拉取反应数据,v14版本示例代码如下:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMessageReactions ] });
场景1:实时监听新添加的反应
如果你需要在用户添加反应的瞬间触发逻辑,监听messageReactionAdd事件即可,同时需要处理partial反应的拉取逻辑:
// 按需替换以下常量 const TARGET_MSG_ID = '你的目标消息ID'; const TARGET_USER_ID = '待检测的用户ID'; const TARGET_EMOJI = '✅'; // 自定义emoji可直接填emoji ID,如'123456789012345678' client.on('messageReactionAdd', async (reaction, user) => { // 拉取部分加载的反应完整数据 if (reaction.partial) { try { await reaction.fetch(); } catch (err) { return; } } // 同时满足三个匹配条件则触发逻辑 if ( reaction.message.id === TARGET_MSG_ID && user.id === TARGET_USER_ID && (reaction.emoji.name === TARGET_EMOJI || reaction.emoji.id === TARGET_EMOJI) ) { // 此处添加自定义业务逻辑 console.log(`用户${user.tag}已添加指定反应`); } });
场景2:查询历史消息的已存在反应
如果你需要检测程序启动前就已经存在的反应,主动拉取消息的反应数据校验即可:
async function checkReactionStatus() { // 按需替换以下常量 const GUILD_ID = '目标服务器ID'; const CHANNEL_ID = '目标消息所在频道ID'; const TARGET_MSG_ID = '目标消息ID'; const TARGET_USER_ID = '待检测的用户ID'; const TARGET_EMOJI = '✅'; const guild = await client.guilds.fetch(GUILD_ID); const channel = await guild.channels.fetch(CHANNEL_ID); const targetMsg = await channel.messages.fetch(TARGET_MSG_ID); // 匹配目标emoji的反应 const matchedReaction = targetMsg.reactions.cache.find(r => r.emoji.name === TARGET_EMOJI || r.emoji.id === TARGET_EMOJI ); if (!matchedReaction) return false; // 校验目标用户是否在反应用户列表中 return await matchedReaction.users.fetch().then(users => users.has(TARGET_USER_ID)); } // 调用函数即可获取检测结果 const hasReaction = await checkReactionStatus(); console.log('用户是否添加指定反应:', hasReaction);
注意事项
- v13及更低版本的discord.js意图命名存在差异,核心判断逻辑保持不变
- 自定义emoji检测优先使用emoji ID,避免同名称不同emoji的误判
内容的提问来源于stack exchange,提问作者TheC0mpu1er
相关产品推荐
相关产品推荐

