Discord.js 设置的服务器成员计数状态成员退出时不更新问题
问题原因
- 你统计成员数用的
client.users.cache是Discord.js维护的全局用户缓存,用户退出单服务器时不会从该缓存中删除记录(该用户可能和机器人共存于其他服务器),所以统计值只会增加不会减少。 - 你当前统计的是机器人所有关联用户的总量,并不是单目标服务器的成员数量,本身统计逻辑不符合需求。
- 如果未开启
GUILD_MEMBERS网关特权意图,机器人无法同步全量成员数据、也接收不到成员退出事件,会进一步导致缓存数据不准。
解决方案
第一步:开启成员权限意图
前往Discord开发者后台的机器人管理页,在「Privileged Gateway Intents」区域打开Server Members Intent开关。
第二步:修改初始化配置
初始化客户端时声明所需意图,以discord.js v14为例:
const { Client, IntentsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers, ] }); const TARGET_GUILD_ID = '替换为你的服务器ID'; // 要统计成员的目标服务器ID const prefix = '你的命令前缀';
第三步:修改状态更新逻辑
改用目标服务器的成员缓存统计数量,同时首次启动时主动拉取全量成员数据保证缓存准确:
client.on('ready', async () => { // 首次启动拉取目标服务器全量成员,更新缓存 const targetGuild = client.guilds.cache.get(TARGET_GUILD_ID); if (targetGuild) await targetGuild.members.fetch(); client.user.setStatus('dnd'); function picksStatus() { const userCount = targetGuild ? targetGuild.members.cache.filter(m => !m.user.bot).size : 0; const status = [`mit ${userCount} User`, `${prefix}help für Hilfe`]; const statusRotate = Math.floor(Math.random() * status.length); client.user.setActivity(status[statusRotate], { type: 'PLAYING' }) } setInterval(picksStatus, 5000); console.log(`Logged in as ${client.user.tag}`); });
内容的提问来源于stack exchange,提问作者ceqoX
相关产品推荐
相关产品推荐

