Discord.js Tiempo de conexión de voz

Actualmente estoy luchando con un problema de mi Discord. js bot que toca un flujo de música a través de un url. Todo funciona bien, pero después de aproximadamente 12h todos los jugadores desconectan y obtengo el siguiente mensaje de error: [VOICE_CONNECTION_TIMEOUT]: Connection not established within 15 seconds.

Este es mi código para unir / soltar un canal:

function join(voiceChannel, volume = 20) {
    return new Promise((resolve, reject) => {
        voiceChannel.join().then(vc => {
            vc.voice.setSelfDeaf(true);

            const dispatcher = vc.play(streamURL);
            dispatcher.once('start', () => {
                dispatcher.setBitrate(64);
                dispatcher.setVolumeLogarithmic(volume / 100);

                setTimeout(() => {
                    if (voiceChannel.members.filter(m => !m.user.bot).size === 0) dispatcher.pause(true);
                }, 1500);

                resolve();
            });

            // Tried to reconnect on error but does not seem to work
            dispatcher.on('error', () => {
                leave(voiceChannel.guild);
                setTimeout(() => join(voiceChannel, volume), 5000);
            });
        }).catch(err => reject(err));
    });
}

function leave(guild) {
    guild.me?.voice?.connection?.disconnect();
}

También tengo este evento preparado para detener la corriente si nadie está escuchando:

client.on('voiceStateUpdate', (oldState, newState) => {
    const state = oldState || newState;
    if (state?.member.user.bot) return;

    const guild = state?.guild;
    if (!guild?.me?.voice?.connection) return;
    if (newState.channel === oldState.channel) return;

    Guild.findOne({guildId: guild.id}, (err, dbGuild) => {
        if (err || !dbGuild) return;

        const channel = guild.channels.cache.get(dbGuild.musicChannelId);
        if (!channel || !guild.me.voice.connection.dispatcher) return;

        const dispatcher = guild.me.voice.connection.dispatcher;
        if (channel.members.filter(m => !m.user.bot).size > 0 && dispatcher.paused) {
            dispatcher.resume();
            return;
        }

        if (!dispatcher.paused && channel.members.filter(m => !m.user.bot).size === 0) {
            dispatcher.pause(true);
        }
    });
});

Tal vez alguien pueda ayudarme con esto. No sé cómo solucionar este error.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codercentaur


3 Respuestas:

  • Este error es familiar en la Discord. Paquete JS. El problema es que la Discord no apoya plenamente las conexiones de voz para los robots, por lo que esto no tiene nada que ver con su código. Discord. JS le recomienda que use su paquete de voz para reproducir audio en un canal de voz. Aquí. son sus documentos y Aquí. son algunos de sus ejemplos.

    Respondida el Dec 18, 2020 a las 10:29 - por techscribe

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo se debe a que la conexión de voz no se establece dentro de los 15 segundos esperados. Puedes intentar resolver esta situación implementando un sistema de reconexión en caso de error o desconexión. Aquí te dejo una solución que podrías aplicar a tu código:

    Agrega un contador de intentos de reconexión e incrementa el tiempo de espera entre intentos en caso de error. También te recomendaría mover la lógica de reconexión a una función separada para facilitar su manejo.

    Aquí te muestro cómo podrías modificar tu código para implementar esta funcionalidad:

    javascript
    let reconnectAttempts = 0;
    
    function join(voiceChannel, volume = 20, reconnect) {
        return new Promise((resolve, reject) => {
            voiceChannel.join().then(vc => {
                vc.voice.setSelfDeaf(true);
    
                const dispatcher = vc.play(streamURL);
                dispatcher.once('start', () => {
                    dispatcher.setBitrate(64);
                    dispatcher.setVolumeLogarithmic(volume / 100);
    
                    setTimeout(() => {
                        if (voiceChannel.members.filter(m => !m.user.bot).size === 0) dispatcher.pause(true);
                    }, 1500);
    
                    resolve();
                });
    
                // Implement reconnection logic
                dispatcher.on('error', () => {
                    if (reconnect && reconnectAttempts < 3) {
                        reconnectAttempts++;
                        setTimeout(() => {
                            leave(voiceChannel.guild);
                            join(voiceChannel, volume, true);
                        }, 5000 * reconnectAttempts);
                    } else {
                        reject(new Error('Failed to reconnect. Max attempts reached.'));
                    }
                });
            }).catch(err => reject(err));
        });
    }
    
    function leave(guild) {
        reconnectAttempts = 0; // Reset reconnect attempts counter
        guild.me?.voice?.connection?.disconnect();
    }
    

    Con estos cambios, la función join ahora acepta un nuevo parámetro reconnect que indica si se está intentando reconectar. Además, se ha añadido la lógica de reconexión en caso de error en el evento 'error' del dispatcher.

    Espero que esta solución te ayude a resolver el problema de desconexión después de un tiempo prolongado. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 19, 2020 a las 10:27 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error [VOICE_CONNECTION_TIMEOUT]: Connection not established within 15 seconds indica que la conexión de voz con Discord no se estableció dentro del periodo de tiempo de espera de 15 segundos. Esto puede ocurrir por varias razones:

    Problemas de red:

    Verifica si hay problemas de red o de cortafuegos que puedan estar bloqueando la conexión. Asegúrate de que tu bot tenga los permisos necesarios para conectarse a canales de voz.

    Problemas de Discord:

    Discord tiene un límite de 100 conexiones de voz simultáneas por servidor. Si se alcanza este límite, los nuevos intentos de conexión pueden fallar. Los servidores de Discord pueden experimentar interrupciones ocasionales que pueden afectar las conexiones de voz.

    Problemas de código:

    En tu código, estás llamando a vc.voice.setSelfDeaf(true) antes de unirte al canal de voz. Esto puede causar problemas, ya que el bot no podrá escuchar el flujo de audio y, por lo tanto, no podrá reproducirlo. Intenta mover esta llamada después de unirte al canal de voz.

    Solución recomendada:*

    Para resolver este problema, intenta las siguientes soluciones:

    • Verifica los permisos de red y cortafuegos.
    • Mueve la llamada a `vc.voice.setSelfDeaf(true)` después de unirte al canal de voz.
    • Intenta aumentar el tiempo de espera de conexión de voz en la configuración de Discord.js.
    • Implementa un mecanismo de reconexión automática para volver a conectarse al canal de voz en caso de que falle una conexión.

    Aquí tienes un ejemplo de implementación de reconexión automática:

    js
    function joinWithRetry(voiceChannel, volume = 20) {
      return new Promise((resolve, reject) => {
        let connectionAttempts = 0;
    
        const joinAndListen = () => {
          voiceChannel.join().then(vc => {
            vc.voice.setSelfDeaf(true);
    
            const dispatcher = vc.play(streamURL);
            dispatcher.once('start', () => {
              dispatcher.setBitrate(64);
              dispatcher.setVolumeLogarithmic(volume / 100);
    
              setTimeout(() => {
                if (voiceChannel.members.filter(m => !m.user.bot).size === 0) dispatcher.pause(true);
              }, 1500);
    
              resolve();
            });
    
            dispatcher.on('error', () => {
              // Intenta reconectarte si la conexión falla
              if (connectionAttempts < 3) {
                connectionAttempts++;
                leave(voiceChannel.guild);
                setTimeout(joinAndListen, 5000);
              } else {
                reject(err);
              }
            });
          }).catch(err => reject(err));
        };
    
        joinAndListen();
      });
    }
    

    Respondida el Dec 19, 2020 a las 10:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0