如何让Discord反应收集器(reaction collector)获取前2条用户反应?
问题根因
你在创建反应收集器的配置中设置了max: 1,该参数的作用是限制收集器最多仅收集1条符合过滤规则的反应,触发1次后就会自动触发end事件停止运行,这是无法触发第二次操作的核心原因。
修复方案
- 移除收集器配置中的
max: 1参数,可按需调整time参数设置收集器自动停止的时长,单位为毫秒,填0则不会自动超时。 - 不再在
end事件中处理用户操作逻辑,改为监听collect事件,该事件会在每次有符合过滤规则的反应被触发时执行,支持多次响应。 - 建议在每次处理完用户反应后删除对应用户的反应记录,避免用户需要先取消反应才能再次触发的问题。
修正后参考代码
queue.textChannel.send(thing).then((question) => { question.react('⏸'); question.react('▶️'); question.react('⬅️'); question.react('⏹️'); const filter = (reaction, user) => { return ['⏹️', '⬅️','⏸','▶️'].includes(reaction.emoji.name) && !user.bot; }; // 移除max限制,此处示例设置5分钟后自动停止收集,按需修改即可 const collector = question.createReactionCollector(filter, { time: 300000 }); // 监听collect事件处理每次用户的反应操作 collector.on('collect', (reaction, user) => { const emoji = reaction.emoji.name; // 此处填写你原有的各表情对应控制逻辑 switch(emoji) { case '⏸': // 暂停音乐逻辑 break; case '▶️': // 播放音乐逻辑 break; case '⬅️': // 切上一首歌逻辑 break; case '⏹️': // 停止播放逻辑 // 如果需要点击停止后直接结束收集器,可以手动调用stop // collector.stop('user_stop'); break; } // 处理完成后删除用户的反应,方便用户下次直接点击 reaction.users.remove(user.id).catch(err => console.log(err)); }); collector.on('end', (collected, reason) => { if (reason === 'time') { msg.reply('控制已超时结束'); } }); });
额外注意
如果你使用的是discord.js v13及以上版本,需要确保在客户端初始化时开启了GUILD_MESSAGE_REACTIONS网关意图,否则无法正常接收反应事件。
内容的提问来源于stack exchange,提问作者Commander1An
相关产品推荐
相关产品推荐

