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
相关产品推荐
相关产品推荐

