Discord.js v12 如何实现用户对embed消息添加反应时发送用户名到频道
解决方法
你当前使用的awaitReactions方法默认会等收集满2个符合过滤条件的反应/超时后才会触发then回调,如果直接在回调里处理是一次性返回所有收集到的反应。根据你的需求,以下是两种可直接使用的实现方案:
方案1:实时触发(每次用户加反应就立刻发送用户名)
需要先给目标消息绑定messageReactionAdd事件监听,收集结束后销毁监听避免内存泄漏,完整修改后的代码如下:
async function fun_2p() { const reactionMessage2p = await message.channel.send(embed2p); const filter2p = (reaction, user) => user.id !== bot; await reactionMessage2p.react('🍻') // 绑定反应添加事件,实时处理新增反应 const handleReactionAdd = (reaction, user) => { // 过滤机器人自己的反应,仅处理目标表情 if (user.id !== bot && reaction.emoji.name === '🍻') { message.channel.send(`用户 ${user.username} 添加了反应`); } } reactionMessage2p.on('messageReactionAdd', handleReactionAdd); reactionMessage2p.awaitReactions( filter2p, {max: 2, time: 20000, errors: ['time'] }) .then(collected => { // 收集完成后销毁事件监听,避免内存泄漏 reactionMessage2p.off('messageReactionAdd', handleReactionAdd); // 此处可添加收集完成后的其他业务逻辑 }) .catch(err => { // 超时场景同样销毁监听,避免内存泄漏 reactionMessage2p.off('messageReactionAdd', handleReactionAdd); }) }
方案2:收集满2个反应后统一发送所有参与用户
如果你不需要实时触发,只是收集完所有符合条件的反应后统一输出用户名,直接在then回调里遍历收集到的反应即可,代码如下:
async function fun_2p() { const reactionMessage2p = await message.channel.send(embed2p); const filter2p = (reaction, user) => user.id !== bot; await reactionMessage2p.react('🍻') reactionMessage2p.awaitReactions( filter2p, {max: 2, time: 20000, errors: ['time'] }).then(collected => { // 遍历收集到的反应,取出所有参与的用户 collected.first().users.cache.forEach(user => { if (user.id !== bot) { message.channel.send(`参与用户:${user.username}`); } }) }) .catch(err => { message.channel.send('等待反应超时,已结束收集'); }) }
注意事项
- discord.js v12的
awaitReactions返回的collected是Collection类型,如果你只监听单个表情,用collected.first()就能拿到对应表情的反应对象 - 记得补充超时的
catch分支处理,避免未捕获的报错导致机器人崩溃
内容的提问来源于stack exchange,提问作者emirate.
相关产品推荐
相关产品推荐

