You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 02:00:03