discord.js v13版本serverinfo命令用户状态统计异常问题咨询
问题引发原因
- 网关权限配置缺失
discord.js v13开始强制要求使用网关意图(Intent)来获取敏感数据,用户状态、成员列表属于需要手动开启的特权意图,未开启时机器人无法拉取全量成员状态数据,只会同步启动后发生状态变更的用户信息,所以刚重启时离线用户数为0,只有用户上下线后数据才会更新。 - 缓存机制限制
默认情况下interaction.guild.members.cache只会缓存部分活跃成员,不会预加载全量服务器成员数据,导致统计时遗漏部分成员,出现计数偏差。 - 离线用户判断逻辑错误
离线用户的presence字段为undefined,原代码中判断member.presence?.status == "offline"的逻辑无法匹配到真实离线用户,只会匹配到有presence缓存但状态为offline的用户,导致离线统计完全失效。
解决方法
步骤1:开启开发者后台特权意图
- 进入Discord开发者门户,找到对应的机器人应用,进入「Bot」配置页
- 下滑到Privileged Gateway Intents区域,开启
SERVER MEMBERS INTENT和PRESENCE INTENT两个开关
步骤2:修改客户端初始化配置,注册对应意图
更新机器人启动时的客户端初始化代码,添加必要意图:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, // 拉取成员列表必需 Intents.FLAGS.GUILD_PRESENCES, // 拉取用户状态必需 // 保留其他正在使用的意图即可 ] });
步骤3:修正状态统计逻辑
修改serverinfo命令中的统计代码,先拉取全量成员再统计,同时用总成员数减去在线状态数的方式计算离线用户数,避免判断遗漏:
const lang = require('../bot/languageSelector'); const { MessageEmbed } = require("discord.js"); module.exports = { name: 'serverinfo', description: 'Shows information of this Discord server', run: async (bot, interaction, colorMe) => { let embed = new MessageEmbed(); // 先拉取全量服务器成员,保证缓存完整 await interaction.guild.members.fetch(); const members = interaction.guild.members.cache; // 统计各状态人数 const online = members.filter(member => member.presence?.status === "online").size; const idle = members.filter(member => member.presence?.status === "idle").size; const dnd = members.filter(member => member.presence?.status === "dnd").size; // 离线人数 = 总成员数 - 其他三类状态人数,避免判断遗漏 const offline = members.size - online - idle - dnd; embed.setColor(colorMe); embed.setTitle(`${lang(interaction.user.id, "about")} ${interaction.guild.name}`); embed.setFields({ name: `${lang(interaction.user.id, "byStatuses")}`, value: ` ${lang(interaction.user.id, "online")}: ${online} ${lang(interaction.user.id, "idle")}: ${idle} ${lang(interaction.user.id, "dnd")}: ${dnd} ${lang(interaction.user.id, "offline")}: ${offline} `, inline: true }); interaction.followUp({embeds: [embed]}); } }
内容的提问来源于stack exchange,提问作者user17481541
相关产品推荐
相关产品推荐

