Discord.js bot用presenceUpdate检测Twitch开播时重复发消息如何修复?
重复触发的原因
presenceUpdate 事件会在用户的在线状态、活动列表发生任何变动时触发,你的现有逻辑只要检测到当前状态包含直播活动就会发送通知,没有校验「本次状态更新是否是刚进入直播状态」,因此用户直播过程中任意状态变动(比如修改自定义状态、切换正在玩的游戏、Discord后台自动同步状态)都会重复触发通知。
修复思路
- 对比新旧状态的活动列表,只有旧状态没有直播活动、新状态有直播活动时才触发通知
- 额外增加全局开播标记,避免极端场景下重复触发
修复后的代码
// 全局开播标记,避免重复通知 let isNotified = false; bot.on("presenceUpdate", (oldPresence, newPresence) => { // 先过滤非目标用户、非目标服务器的无效更新 if (newPresence.user.id !== "BROTHER ID" || newPresence.guild.id !== "GUILD ID") return; // 分别判断新旧状态是否存在直播活动 const oldIsStreaming = oldPresence?.activities?.some(act => act.type === "STREAMING") ?? false; const newIsStreaming = newPresence?.activities?.some(act => act.type === "STREAMING") ?? false; // 只有从非直播切换到直播、且未发过通知时才推送消息 if (!oldIsStreaming && newIsStreaming && !isNotified) { const streamActivity = newPresence.activities.find(act => act.type === "STREAMING"); bot.channels.cache.get("TWITCH CHANNEL ID").send(`@everyone **BrotherUsername** is streaming: ${streamActivity.url}`); isNotified = true; } // 用户下播后重置通知标记 if (oldIsStreaming && !newIsStreaming) { isNotified = false; } });
额外注意事项
- 如果bot会不定期重启,可以把
isNotified标记存储到本地文件或轻量键值数据库中,避免重启后主播仍在直播时,状态更新触发重复通知 - 要确保你已经在Discord开发者面板的bot设置页,开启了Privileged Gateway Intents下的
Presence Intent权限,否则presenceUpdate事件可能无法正常触发
内容的提问来源于stack exchange,提问作者DrLegend
相关产品推荐
相关产品推荐

