Discord.js 如何为同一条Embed消息重复添加相同emoji反应
问题原因
- Discord平台存在原生硬限制:同一条消息下的相同emoji反应会被聚合为单个入口展示,单个用户对同一个emoji仅能添加1次反应,重复触发添加操作会直接取消已存在的对应反应,完全不可能实现3个相同🍎反应并排展示的效果,该规则手动操作官方客户端即可验证,和代码实现无关。
- 现有代码存在两处逻辑问题:
- 采用
Promise.all并发发起3个添加反应的请求,Discord API要求同一条消息的反应操作必须按顺序处理,并发发送的重复请求会被服务端直接拦截丢弃,仅第一个到达的请求能正常生效。 - 未拦截机器人自身触发的反应事件:回调函数中主动执行
message.react()的操作,会再次触发messageReactionAdd事件,形成无限递归调用,极易触发API速率限制导致操作被拦截。
- 采用
修正方案
如果需求是给消息添加多个不同emoji的反应,将并发请求改为串行执行,同时增加机器人身份判断阻断递归逻辑即可,参考代码如下:
client.on("messageReactionAdd", async (reaction, user) => { console.log(reaction.emoji) const message = reaction.message; const embeds = message.embeds; // 无嵌入内容、非消息作者触发、机器人自身触发的事件全部直接拦截 if(!embeds.length || user.id !== message.author.id || user.bot) return; const firstEmbed = embeds[0]; // 等待上一个反应添加完成后,再执行下一个添加操作 await message.react('🍎'); await message.react('🍊'); await message.react('🍇'); });
注意:不要尝试重复添加相同emoji的反应,该操作受平台规则限制,没有任何绕过实现的可能。
内容的提问来源于stack exchange,提问作者Zhaniartt
相关产品推荐
相关产品推荐

