Discord.js:编辑Embed消息时如何重置表情反应计数而非删除?
Discord.js Embed编辑后重置反应计数实现方案
问题根因
现有代码逻辑下,Bot预先为Embed添加➡反应时,初始计数为1;用户点击该表情触发Embed编辑后,总计数会增长为2(Bot操作1次+用户操作1次)。直接编辑Embed不会自动重置原有反应的累计计数,后续的反应监听会因为计数残留,无法正常触发第三页Embed的交互流程。
实现要点
- 用户点击
➡触发编辑时,调用反应对象的remove()方法,清除该表情对应的所有历史反应记录,清空累计计数 - 清除完成后,由Bot重新为当前Embed添加一次
➡反应,此时反应计数会精确回到1,达到重置要求 - 将反应监听逻辑封装为可递归调用的方法,每次完成Embed编辑后重新挂载监听,即可支持第一页到第二页、第二页到第三页的连续交互
修正后代码
const embed = new MessageEmbed() .setTitle("Test1") .setFooter("Test1"); message.channel.send(embed).then(async sentEmbed => { // 初始添加右箭头反应 await sentEmbed.react("➡"); // 统一反应过滤规则:仅响应当前指令作者的右箭头点击 const reactionFilter = (reaction, user) => { return ["➡"].includes(reaction.emoji.name) && user.id === message.author.id; }; // 封装递归式反应监听,支持多页Embed连续切换 const startReactionWatch = () => { sentEmbed .awaitReactions(reactionFilter, { max: 1, time: 30000, errors: ["time"] }) .then(async collected => { const targetReaction = collected.first(); if (targetReaction.emoji.name === "➡") { // 核心重置步骤:清除该表情的所有旧反应记录 await targetReaction.remove(); // Bot重新添加反应,计数自动重置为1 await sentEmbed.react("➡"); // 切换Embed内容 const embed2 = new MessageEmbed() .setTitle('test2') .setDescription('test2'); await sentEmbed.edit(embed2); // 重新挂载监听,支持后续跳转第三页 startReactionWatch(); } }) .catch(() => { // 超时场景下清除所有反应,避免交互残留 sentEmbed.reactions.removeAll().catch(console.error); }); }; // 启动第一轮反应监听 startReactionWatch(); });
可选实现:如果不需要清除所有用户的反应记录,可在拿到用户反应后,调用
targetReaction.users.remove(message.author.id)单独移除当前用户的点击记录,此时计数会从2回落到1(Bot自身的反应计数),同样可以达到重置效果。
内容的提问来源于stack exchange,提问作者YUNGJOHAN
相关产品推荐
相关产品推荐

