Trato de detectar en tiempo real si cada miembro está hablando o no en un canal de voz usando discord.js v13. En otras palabras, quiero reproducir el círculo verde de discordia en mi aplicación. Sin embargo, no pude encontrar un ejemplo de código o artículo adecuado. ¿Podrías aconsejarme?
Editar:
Con base en el consejo, pude resolverlo. El ejemplo de Recorder BOT fue útil. A continuación se muestra un ejemplo de código.
const { Client, Intents, VoiceChannel } = require('discord.js') const { joinVoiceChannel, getVoiceConnection, entersState, VoiceConnectionStatus } = require('@discordjs/voice'); const client = new Client({ intents: ['GUILD_VOICE_STATES', 'GUILD_MESSAGES', 'GUILDS'] }); client.on("messageCreate", async (message) => { if(message.content.toLowerCase() === "test") { var connection = getVoiceConnection(message.guildId) if(!connection){ connection = joinVoiceChannel({ channelId: message.member.voice.channelId, guildId: message.guildId, adapterCreator: message.guild.voiceAdapterCreator, selfDeaf: false, selfMute: true, }); } try { await entersState(connection, VoiceConnectionStatus.Ready, 20e3); connection.receiver.speaking.on("start", (userId) => { console.log( `${userId} start` ); }); connection.receiver.speaking.on("end", (userId) => { console.log( `${userId} end` ); }); console.log( "Ready" ); } catch (error) { console.warn(error); } } }); client.login('YOUR-TOKEN')La búsqueda de esto parece sugerir que esto solía ser posible, pero se rompió porque el evento no se activaba o se activaba solo una vez.
El evento client.voiceStateUpdate solía darte un VoiceState que tenía una propiedad de habla, que te decía si alguien estaba hablando (lo que parece que nunca funcionó).
La documentación actual de discord.js para VoiceState muestra que esta propiedad ya no existe, y no puede hacer lo que pide usando discord.js solo.
Editar: según el comentario de MrMythical a continuación, discord.js/voice tiene voiceRecievers, que expone voiceReciever.peakingMap.users , un mapa de usuarios que hablan actualmente. puede obtener eventos para ello registrando un oyente.