feat: improve Discord bot reconnection logic and enhance multiple resolve handling

This commit is contained in:
2025-09-22 22:09:06 -05:00
parent de7bcccb88
commit a33f033a64

View File

@@ -10,12 +10,18 @@ export const bot = new Amayo();
// Listeners de robustez del cliente Discord // Listeners de robustez del cliente Discord
bot.on('error', (e) => console.error('🐞 Discord client error:', e)); bot.on('error', (e) => console.error('🐞 Discord client error:', e));
bot.on('warn', (m) => console.warn('⚠️ Discord warn:', m)); bot.on('warn', (m) => console.warn('⚠️ Discord warn:', m));
// Evitar reintentos de re-login simultáneos
let relogging = false;
// Cuando la sesión es invalidada, intentamos reconectar/login // Cuando la sesión es invalidada, intentamos reconectar/login
bot.on('invalidated', () => { bot.on('invalidated', () => {
if (relogging) return;
relogging = true;
console.error('🔄 Sesión de Discord invalidada. Reintentando login...'); console.error('🔄 Sesión de Discord invalidada. Reintentando login...');
withRetry('Re-login tras invalidated', () => bot.play(), { minDelayMs: 2000, maxDelayMs: 60_000 }).catch(() => { withRetry('Re-login tras invalidated', () => bot.play(), { minDelayMs: 2000, maxDelayMs: 60_000 })
console.error('No se pudo reloguear tras invalidated, se seguirá intentando en el bucle general.'); .catch(() => {
}); console.error('No se pudo reloguear tras invalidated, se seguirá intentando en el bucle general.');
})
.finally(() => { relogging = false; });
}); });
// Utilidad: reintentos con backoff exponencial + jitter // Utilidad: reintentos con backoff exponencial + jitter
@@ -80,8 +86,20 @@ process.on('uncaughtException', (err) => {
// No salimos; dejamos que el bot continúe vivo // No salimos; dejamos que el bot continúe vivo
}); });
process.on('multipleResolves', (type, promise, reason) => { process.on('multipleResolves', (type, promise, reason: any) => {
console.warn('⚠️ multipleResolves:', type, reason); // Ignorar resoluciones sin razón (ruido)
if (type === 'resolve' && (reason === undefined || reason === null)) {
return;
}
const msg = reason instanceof Error ? `${reason.name}: ${reason.message}` : String(reason);
const stack = (reason && (reason as any).stack) ? String((reason as any).stack) : '';
const isAbortErr = (reason && ((reason as any).code === 'ABORT_ERR' || /AbortError|operation was aborted/i.test(msg)));
const isDiscordWs = /@discordjs\/ws|WebSocketShard/.test(stack);
if (isAbortErr && isDiscordWs) {
// Ruido benigno de reconexiones del WS de Discord: ignorar
return;
}
console.warn('⚠️ multipleResolves:', type, msg);
}); });
let shuttingDown = false; let shuttingDown = false;