diff --git a/consoleMonitor.js b/consoleMonitor.js index 46ee8c4..fc888df 100644 --- a/consoleMonitor.js +++ b/consoleMonitor.js @@ -5,6 +5,7 @@ const { verifyLinkCode, updateUserLinkWithUsername } = require('./database.js'); let ws = null; let reconnectTimeout = null; let client = null; +let heartbeatInterval = null; const parseLogMessage = (log) => { // Exemple de format de log Palworld: @@ -78,39 +79,68 @@ const connectWebSocket = async (pterodactylToken, serverId) => { try { const credentials = await getWebSocketCredentials(pterodactylToken, serverId); - ws = new WebSocket(credentials.socket); + ws = new WebSocket(credentials.socket, { + origin: process.env.PTERODACTYL_API_URL + }); ws.on('open', () => { console.log('✅ WebSocket Pterodactyl connecté'); - // Authentification + // Authentification selon la documentation ws.send(JSON.stringify({ event: 'auth', args: [credentials.token] })); - - // S'abonner aux logs - ws.send(JSON.stringify({ - event: 'send logs', - args: [null] - })); }); ws.on('message', (data) => { try { const message = JSON.parse(data.toString()); + // Gérer l'événement d'authentification réussie + if (message.event === 'auth success') { + console.log('✅ Authentification WebSocket réussie'); + + // S'abonner aux logs de la console + ws.send(JSON.stringify({ + event: 'send logs', + args: [null] + })); + + // Démarrer le heartbeat (toutes les 30 secondes) + if (heartbeatInterval) clearInterval(heartbeatInterval); + heartbeatInterval = setInterval(() => { + if (ws && ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ + event: 'send heartbeat', + args: [] + })); + } + }, 30000); + } + + // Gérer les logs de la console if (message.event === 'console output') { const log = message.args[0]; + // Afficher le log pour debug + console.log('📝 Log:', log); + // Détecter les commandes !link const linkData = parseLogMessage(log); if (linkData) { handleLinkCommand(linkData.playerName, linkData.steamId, linkData.code); } } + + // Gérer les événements de statut + if (message.event === 'status') { + console.log('📊 Statut du serveur:', message.args[0]); + } + } catch (error) { // Message non-JSON ou erreur de parsing, on ignore + console.error('Erreur parsing message WebSocket:', error); } }); @@ -118,13 +148,20 @@ const connectWebSocket = async (pterodactylToken, serverId) => { console.error('❌ Erreur WebSocket:', error.message); }); - ws.on('close', () => { - console.log('⚠️ WebSocket Pterodactyl déconnecté, reconnexion dans 10 secondes...'); + ws.on('close', (code, reason) => { + console.log(`⚠️ WebSocket Pterodactyl déconnecté (Code: ${code}, Raison: ${reason})`); ws = null; + // Arrêter le heartbeat + if (heartbeatInterval) { + clearInterval(heartbeatInterval); + heartbeatInterval = null; + } + // Reconnexion automatique if (reconnectTimeout) clearTimeout(reconnectTimeout); reconnectTimeout = setTimeout(() => { + console.log('🔄 Tentative de reconnexion...'); connectWebSocket(pterodactylToken, serverId); }, 10000); }); @@ -135,6 +172,7 @@ const connectWebSocket = async (pterodactylToken, serverId) => { // Réessayer dans 30 secondes if (reconnectTimeout) clearTimeout(reconnectTimeout); reconnectTimeout = setTimeout(() => { + console.log('🔄 Tentative de reconnexion...'); connectWebSocket(pterodactylToken, serverId); }, 30000); } @@ -154,6 +192,11 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => { }; const stopConsoleMonitoring = () => { + if (heartbeatInterval) { + clearInterval(heartbeatInterval); + heartbeatInterval = null; + } + if (reconnectTimeout) { clearTimeout(reconnectTimeout); reconnectTimeout = null; diff --git a/index.js b/index.js index 2d8d668..80f02a3 100644 --- a/index.js +++ b/index.js @@ -52,15 +52,18 @@ client.once('ready', async () => { client.user.setPresence({ activities: [{ name: 'Rygain', type: 'WATCHING' }], status: 'online' }); console.log('Bot started !'); - // Initialiser la base de données + // Initialiser la base de données (non bloquant) try { await initDatabase(); await createTables(); + console.log('📦 Système de liaison activé'); - // Démarrer la surveillance de la console pour les commandes !link + // Démarrer la surveillance de la console seulement si la DB est OK startConsoleMonitoring(client, process.env.PTERODACTYL_API_TOKEN); } catch (error) { - console.error('Erreur lors de l\'initialisation:', error); + console.error('⚠️ Erreur lors de l\'initialisation de la base de données'); + console.error('⚠️ Le système de liaison est désactivé'); + console.error('⚠️ Les autres fonctionnalités du bot restent actives'); } deploy(process.env.DISCORD_TOKEN);