Solución crítica: Reconexión automática bot Discord y sistema de health check

- Implementa heartbeat cada 30 segundos para mantener conexión WebSocket activa
- Agrega manejo de eventos de conexión/desconexión/reconexión
- Sistema de health check cada 2 minutos para verificar estado del bot
- Configuración mejorada de timeouts y reconexión automática
- Soluciona problema de bot no responde después de períodos de inactividad
This commit is contained in:
2026-02-07 20:09:16 -06:00
parent 7af0e95e0b
commit 26414094d4

View File

@@ -39,9 +39,15 @@ try {
$discord = new Discord([ $discord = new Discord([
'token' => DISCORD_BOT_TOKEN, 'token' => DISCORD_BOT_TOKEN,
'intents' => Intents::GUILDS | Intents::GUILD_MESSAGES | Intents::DIRECT_MESSAGES | Intents::GUILD_MEMBERS | Intents::GUILD_MESSAGE_REACTIONS, 'intents' => Intents::GUILDS | Intents::GUILD_MESSAGES | Intents::DIRECT_MESSAGES | Intents::GUILD_MEMBERS | Intents::GUILD_MESSAGE_REACTIONS,
'logger' => $logger 'logger' => $logger,
'loop' => \React\EventLoop\Loop::get(),
'socket_options' => [
'heartbeat_interval' => 30, // Enviar heartbeat cada 30 segundos
'reconnect_timeout' => 60, // Timeout para reconexión
]
]); ]);
// Manejar eventos de conexión y desconexión
$discord->on('ready', function (Discord $discord) { $discord->on('ready', function (Discord $discord) {
$discord->getLogger()->info("=================================================="); $discord->getLogger()->info("==================================================");
$discord->getLogger()->info("Bot conectado y listo para escuchar!"); $discord->getLogger()->info("Bot conectado y listo para escuchar!");
@@ -49,6 +55,21 @@ try {
$discord->getLogger()->info("=================================================="); $discord->getLogger()->info("==================================================");
}); });
// Evento de reconexión
$discord->on('reconnected', function (Discord $discord) {
$logger->info("[RECONEXIÓN] Bot reconectado exitosamente");
});
// Evento de desconexión
$discord->on('disconnected', function (Discord $discord, $reason) {
$logger->warning("[DESCONEXIÓN] Bot desconectado. Razón: $reason");
});
// Evento de error
$discord->on('error', function ($error, Discord $discord) {
$logger->error("[ERROR DISCORD] Error en la conexión: " . $error->getMessage());
});
// Evento para nuevos miembros en el servidor // Evento para nuevos miembros en el servidor
$discord->on(Event::GUILD_MEMBER_ADD, function (Member $member, Discord $discord) use ($pdo, $logger) { $discord->on(Event::GUILD_MEMBER_ADD, function (Member $member, Discord $discord) use ($pdo, $logger) {
$logger->info("[NUEVO MIEMBRO] Usuario {$member->user->username} ({$member->id}) se ha unido al servidor."); $logger->info("[NUEVO MIEMBRO] Usuario {$member->user->username} ({$member->id}) se ha unido al servidor.");
@@ -400,6 +421,23 @@ try {
} }
}); });
// Sistema de verificación de salud periódica
$discord->on('ready', function (Discord $discord) use ($logger) {
// Programar verificación de salud cada 2 minutos
$discord->getLoop()->addPeriodicTimer(120, function() use ($discord, $logger) {
try {
// Verificar si el bot sigue conectado
if ($discord->user && $discord->user->id) {
$logger->info("[HEALTH CHECK] Bot conectado y respondiendo. Usuario: {$discord->user->username}");
} else {
$logger->warning("[HEALTH CHECK] Bot no responde correctamente");
}
} catch (\Throwable $e) {
$logger->error("[HEALTH CHECK] Error en verificación: " . $e->getMessage());
}
});
});
$discord->run(); $discord->run();
} catch (Throwable $e) { } catch (Throwable $e) {