如何实现Discord双向反应确认:我与被@用户均点击对勾才完成确认
双向反应确认功能修改方案
修改思路
- 先提取被@的目标用户,增加非空校验
- 定义状态变量分别记录发起方、被@方的确认状态
- 调整✅和❌的过滤器逻辑,同时匹配双方用户ID
- 触发反应时更新对应状态,双方均确认后再执行后续逻辑,任意一方点❌直接终止流程
- 补充超时、取消的边界场景处理
完整修改后代码
// 首先提取被@的目标用户,确保有且仅有一个被@用户 const targetUser = message.mentions.users.first(); if (!targetUser) return message.channel.send("请先@需要确认的用户"); // 定义状态记录变量 let authorConfirmed = false; let targetConfirmed = false; let nine = await message.channel.send(embed) await nine.react('✅'); await nine.react('❌'); // 修正原代码拼写错误:dipose => dispose // ✅ 过滤器:匹配双方用户的确认点击 const confirmFilter = (reaction, user) => reaction.emoji.name === '✅' && [message.author.id, targetUser.id].includes(user.id) && !user.bot; // 排除机器人自己的点击 const confirmCollector = nine.createReactionCollector(confirmFilter, { time: 30000, dispose: true }); // ❌ 过滤器:任意一方点击取消都生效 const cancelFilter = (reaction, user) => reaction.emoji.name === '❌' && [message.author.id, targetUser.id].includes(user.id) && !user.bot; const cancelCollector = nine.createReactionCollector(cancelFilter, { time: 30000, dispose: true, max: 1 }); // 监听确认点击 confirmCollector.on('collect', (reaction, user) => { // 更新对应状态 if (user.id === message.author.id) authorConfirmed = true; if (user.id === targetUser.id) targetConfirmed = true; // 双方都确认后执行后续逻辑 if (authorConfirmed && targetConfirmed) { // 清理收集器 confirmCollector.stop(); cancelCollector.stop(); // 这里替换为你要执行的后续业务代码 } }); // 监听取消点击 cancelCollector.on('collect', () => { confirmCollector.stop(); cancelCollector.stop(); // 这里替换为取消后的业务逻辑 }); // 监听超时事件 confirmCollector.on('end', (_, reason) => { if (reason === 'time') { cancelCollector.stop(); // 这里替换为超时后的业务逻辑 } });
关键修改说明
- 新增被@用户提取逻辑,避免无确认目标的异常
- 用独立状态变量记录双方确认情况,杜绝同一用户重复点击生效的问题
- 修正原代码中
dipose的拼写错误,正确参数为dispose - 过滤器新增
!user.bot判断,避免机器人自己的反应触发收集逻辑 - 所有异常分支(取消、超时)都添加了收集器清理逻辑,避免内存泄漏
内容的提问来源于stack exchange,提问作者Jimboy
相关产品推荐
相关产品推荐

