Discord成员计数机器人输出旧数值、更新异常问题技术问询
问题修复方案
问题根源
- 成员拉取、在线人数统计的逻辑全部写在了
setInterval定时器外部,这部分代码只会在模块加载时执行1次,后续定时器运行时永远调用首次计算得到的旧数值 onlineCount前的await属于多余用法,filter返回的集合的size是同步属性,不需要异步等待- 若使用discord.js v14及以上版本,需要确认机器人已经开启
GUILD_MEMBERS、GUILD_PRESENCES两个特权意图,否则无法正常拉取成员在线状态数据
修复后代码
module.exports = async (client) => { const guild = client.guilds.cache.get('889774617349218304'); // 固定不变的频道对象可以提前提取,不需要每次定时器执行都重复查询缓存 const channel = guild.channels.cache.get('906111710706954251'); setInterval(async () =>{ // 每次统计前重新拉取最新的成员列表和在线状态数据 const guildMembers = await guild.members.fetch({ withPresences: true }); const onlineCount = guildMembers.filter(member => !member.user.bot && member.presence?.status === "online").size; channel.setName(`🟢 ${onlineCount.toLocaleString()}`); console.log('Updating User-Online Count'); }, 360000); }
额外注意事项
- Discord对频道改名有全局速率限制,每10分钟最多修改5次,你当前设置的360000毫秒即6分钟修改1次符合限制要求,无需调整
- 如果需要统计idle、dnd状态的成员数量,按照同样逻辑在定时器内部新增对应过滤规则计算数值即可
内容的提问来源于stack exchange,提问作者OpenVWX
相关产品推荐
相关产品推荐

