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:
@@ -39,9 +39,15 @@ try {
|
||||
$discord = new Discord([
|
||||
'token' => DISCORD_BOT_TOKEN,
|
||||
'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->getLogger()->info("==================================================");
|
||||
$discord->getLogger()->info("Bot conectado y listo para escuchar!");
|
||||
@@ -49,6 +55,21 @@ try {
|
||||
$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
|
||||
$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.");
|
||||
@@ -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();
|
||||
|
||||
} catch (Throwable $e) {
|
||||
|
||||
Reference in New Issue
Block a user