From 7aa6a2a8fbe7ee3f735dc20b4901ac6f8c9654fd Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Wed, 10 Dec 2025 12:09:32 +0100 Subject: [PATCH] test --- consoleMonitor.js | 56 ++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/consoleMonitor.js b/consoleMonitor.js index 28874c4..603e91b 100644 --- a/consoleMonitor.js +++ b/consoleMonitor.js @@ -11,6 +11,10 @@ let isMonitoring = false; let isConnecting = false; let connectionTimestamp = null; +// Backoff de reconnexion +let reconnectDelayMs = 5000; +const RECONNECT_DELAY_MAX_MS = 5 * 60 * 1000; // 5 min + const parseLogMessage = (log) => { // Format réel de log Palworld: // [2025-12-09 13:28:23] [CHAT] !link X2NMAY @@ -149,42 +153,58 @@ const checkAndManageWebSocket = async () => { } }; +const resetReconnectBackoff = () => { + reconnectDelayMs = 5000; +}; + +const scheduleReconnect = () => { + if (!isMonitoring) return; + if (reconnectTimeout) clearTimeout(reconnectTimeout); + const delay = reconnectDelayMs; + reconnectDelayMs = Math.min(reconnectDelayMs * 2, RECONNECT_DELAY_MAX_MS); + console.log(`🔄 Reconnexion WebSocket dans ${Math.round(delay / 1000)}s...`); + reconnectTimeout = setTimeout(() => { + checkAndManageWebSocket(); + }, delay); +}; + const connectWebSocket = async (pterodactylToken, serverId) => { if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) { console.log('⚠️ WebSocket déjà connecté ou en cours de connexion'); return; } - if (isConnecting) { console.log('⚠️ Connexion WebSocket déjà en cours'); return; } - + isConnecting = true; connectionTimestamp = Date.now(); console.log(`📅 Timestamp de connexion: ${new Date(connectionTimestamp).toISOString()}`); - + try { + // Toujours rafraîchir les credentials pour éviter les tokens expirés après redémarrage serveur const credentials = await getWebSocketCredentials(pterodactylToken, serverId); - + ws = new WebSocket(credentials.socket, { origin: process.env.PTERODACTYL_API_URL }); - + ws.on('open', () => { console.log('✅ WebSocket Pterodactyl connecté'); isConnecting = false; - + resetReconnectBackoff(); + ws.send(JSON.stringify({ event: 'auth', args: [credentials.token] })); }); - + ws.on('message', async (data) => { try { const message = JSON.parse(data.toString()); - + if (message.event === 'auth success') { console.log('✅ Authentification WebSocket réussie'); @@ -196,10 +216,7 @@ const connectWebSocket = async (pterodactylToken, serverId) => { if (heartbeatInterval) clearInterval(heartbeatInterval); heartbeatInterval = setInterval(() => { if (ws && ws.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify({ - event: 'send heartbeat', - args: [] - })); + ws.send(JSON.stringify({ event: 'send heartbeat', args: [] })); } }, 30000); } @@ -270,19 +287,16 @@ const connectWebSocket = async (pterodactylToken, serverId) => { heartbeatInterval = null; } - // Tenter une reconnexion après 5 secondes - if (isMonitoring) { - console.log('🔄 Reconnexion dans 5 secondes...'); - reconnectTimeout = setTimeout(() => { - checkAndManageWebSocket(); - }, 5000); - } + // Planifier une reconnexion avec backoff (utile lors des redémarrages quotidiens du serveur) + scheduleReconnect(); }); } catch (error) { console.error('Erreur lors de la connexion WebSocket:', error); isConnecting = false; connectionTimestamp = null; + // Échec immédiat -> planifier reconnexion avec backoff + scheduleReconnect(); } }; @@ -308,6 +322,7 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => { client = discordClient; isMonitoring = true; + resetReconnectBackoff(); const serverId = process.env.PTERODACTYL_SERVER_ID; if (!serverId) { @@ -320,7 +335,8 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => { // Vérifier immédiatement checkAndManageWebSocket(); - // Vérifier toutes les 30 secondes + // Vérifier toutes les 30 secondes (nettoyage codes et reconnect si besoin) + if (checkInterval) clearInterval(checkInterval); checkInterval = setInterval(checkAndManageWebSocket, 30000); };