You need to enable JavaScript to run this app. Discord.js中如何设置PresenceUpdate事件代码每5分钟仅执行一次
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js中如何设置PresenceUpdate事件代码每5分钟仅执行一次

Discord.js PresenceUpdate 事件按间隔限流实现方案

实现思路

通过全局Map存储每个用户的上次执行时间戳,每次事件触发时先校验是否达到5分钟冷却阈值,未达到则直接跳过,避免高频重复执行。

修复后完整代码

// 全局存储用户冷却时间,键为用户ID,值为上次执行时间戳
const userCoolDown = new Map();
// 冷却时间:5分钟,单位毫秒
const COOLDOWN_TIME = 5 * 60 * 1000;

client.on('presenceUpdate', async (oldPresence, newPresence) => {
    // 先校验用户是否在冷却中
    const userId = newPresence.member.user.id;
    const lastExecTime = userCoolDown.get(userId);
    if (lastExecTime && Date.now() - lastExecTime < COOLDOWN_TIME) {
        return;
    }

    const guild = client.guilds.cache.get('707085819839512628');
    const rolee = guild.roles.cache.get("707416808835252245");
    if(oldPresence?.member.user.bot || newPresence.member.user.bot) return;
    
    let oldState = oldPresence?.activities[0]?.state;
    let newState = newPresence.activities[0]?.state;
    if(oldState === newState) return;
    if(newState?.includes("https://discord.gg/indos")) {
        await newPresence.member.roles.add(rolee);
        // 执行完逻辑后更新用户冷却时间
        userCoolDown.set(userId, Date.now());
    }
})

核心改动说明

  • 新增全局userCoolDown映射表,独立记录每个用户的执行间隔,避免不同用户互相影响
  • 补充了oldPresence可选链校验,避免用户首次上线时oldPresence为空导致的报错
  • 给异步方法roles.add补充了await关键字,避免异步逻辑抛出异常无法捕获
  • 移除了原代码末尾多余的无效语法片段
  • 仅当加角色的业务逻辑实际执行后才更新冷却时间,避免无意义的冷却占用

内容的提问来源于stack exchange,提问作者gamers_indo1223

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:21:04