Así que tengo este fragmento de código que funcionó para d.js v12 pero ahora está roto en v13, he estado tratando durante un tiempo de encontrar una solución, también pregunté en su servidor de discordia pero nadie sabe, el problema es que el el código simplemente deja de ejecutarse cuando la cantidad de personas en línea está desconectada, etc., no hay errores, simplemente deja de ejecutarse.
cuando solo se obtiene 1 usuario y se registra su estado, no cuando se obtienen los estados de todos.
const members = message.guild.members.cache; const online = members.filter((m) => m.presence.status === 'online').length; const offline = members.filter((m) => m.presence.status === 'offline').length; const dnd = members.filter((m) => m.presence.status === 'dnd').length; const afk = members.filter((m) => m.presence.status === 'idle').length;Hay dos problemas en su código, pero son tan sutiles que la mayoría no los notaría. La mayoría de la gente asumiría de inmediato que el problema son las intenciones, pero las intenciones no son el verdadero problema aquí.
El primer problema es que GuildMember.presence puede no estar undefined cuando se usa guild.members.cache . Eso significa que intentar hacer m.presence.status cuando m.presence no está undefined provocará un error. Por ejemplo, mientras jugaba con el comando eval de mi bot de discordia, intenté filtrar las ID de todos los miembros de mi gremio de prueba que tienen presencias undefined o null . Descubrí que todos los miembros que habían estado desconectados/invisibles desde antes de que el bot se conectara (como yo), tenían presencias undefined . Cuando configuré mi estado para no molestar y luego volví a invisible, el caché se actualizó y mi presencia ya no estaba undefined (y estaba "offline" , como se esperaba). No estoy seguro de por qué ocurre exactamente esto, ya que incluso buscar a todos los miembros del gremio no elimina las presencias undefined . Tengo todas las intenciones relevantes también.
El segundo problema es que guild.members.cache.filter() devuelve una Collection , no una Array . La clase Collection no tiene una propiedad .length ; tienes que usar .size en su lugar.
Este es un ejemplo de cómo solucionaría estos problemas:
const members = message.guild.members.cache; const online = members.filter(m => m.presence?.status === 'online').size; const offline = members.filter(m => !m.presence || m.presence.status === 'offline').size; const dnd = members.filter(m => m.presence?.status === 'dnd').size; const afk = members.filter(m => m.presence?.status === 'idle').size; Estoy usando el ?. Operador de encadenamiento opcional para mayor comodidad aquí. Puede reemplazar m.presence?.status con m.presence && m.presence.status si no se siente cómodo usando el encadenamiento opcional (o no puede debido a una versión de nodo inferior).
Básicamente, esta respuesta resuelve el primer problema al verificar si m.presence no está undefined antes de determinar el estado del miembro. Dado que m.presence no está undefined para algunos usuarios sin conexión, si m.presence no está undefined para un miembro, lo incluimos en el recuento de miembros sin conexión y lo excluimos de todos los demás recuentos de miembros. Cómo esta respuesta resuelve el segundo problema es bastante sencillo; simplemente reemplazamos .length con .size .
Recursos relevantes:
https://discord.js.org/#/docs/collection/main/class/Collection?scrollTo=filter https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=presence