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([
|
$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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user