¿Por qué member.user.presence.status está devolviendo undefined? | discord.js v13
Estoy tratando de obtener el total de miembros en línea, desconectados, ausentes y en DND en el servidor. Las intenciones de presencia están habilitadas en el panel de desarrolladores y están incluidas en el código:
const client = new discord.Client({ partials: ["CHANNEL"], intents: [discord.Intents.FLAGS.GUILDS, discord.Intents.FLAGS.GUILD_MESSAGES, discord.Intents.FLAGS.GUILD_MESSAGE_REACTIONS, discord.Intents.FLAGS.GUILD_MEMBERS, discord.Intents.FLAGS.GUILD_PRESENCES, discord.Intents.FLAGS.DIRECT_MESSAGES, discord.Intents.FLAGS.DIRECT_MESSAGE_TYPING, discord.Intents.FLAGS.GUILD_MESSAGE_TYPING]});
Y sigo obteniendo este error:
TypeError: Cannot read properties of undefined (reading 'status')
Código:
let onlineMembers = (await guild.members.fetch()).filter((member) => !member.user.bot && member.user.presence.status == 'online');
let offlineMembers = (await guild.members.fetch()).filter((member) => !member.user.bot && member.user.presence.status == 'dnd');
let awayMembers = (await guild.members.fetch()).filter((member) => !member.user.bot && member.user.presence.status == 'offline');
let dndMembers = (await guild.members.fetch()).filter((member) => !member.user.bot && member.user.presence.status == 'idle');
No entiendo cuál podría ser el problema, aunque status
existe.
EDIT:
También intenté esto, no funciona, mismo error:
let onlineMembers = message.guild.members.cache.filter(member => member.presence.status == "online").size;
let offlineMembers = message.guild.members.cache.filter(member => member.presence.status == "offline").size;
let awayMembers = message.guild.members.cache.filter(member => member.presence.status == "idle").size;
let dndMembers = message.guild.members.cache.filter(member => member.presence.status == "dnd").size;
EDIT 2: Usar member?.presence.status
no funciona para ambos códigos intentados.
davy.ai
El problema podría ser porque
presence
no siempre está definido para un objeto de miembro. Puede intentar usar el encadenamiento opcional (?.
) para verificar sipresence
está definido antes de acceder a sus propiedades.Aquí hay un ejemplo de cómo puede modificar el código para usar el encadenamiento opcional:
Alternativamente, puede utilizar el evento
presenceUpdate
para realizar un seguimiento del estado de presencia de los miembros en lugar de obtener el estado de presencia de todos los miembros cada vez que lo necesite. Esto puede ser más eficiente y evitar superar los límites de velocidad de la API de Discord.¡Espero que esto ayude!