diff --git a/commands/utility/rygainland-link.js b/commands/utility/rygainland-link.js index 4dc686d..d7069cd 100644 --- a/commands/utility/rygainland-link.js +++ b/commands/utility/rygainland-link.js @@ -8,7 +8,6 @@ module.exports = { async execute(interaction) { try { - // Vérifier si l'utilisateur est déjà lié const existingLink = await getUserLink(interaction.user.id); if (existingLink) { return interaction.reply({ @@ -17,7 +16,6 @@ module.exports = { }); } - // Générer un code unique const code = await generateLinkCode(interaction.user.id); const embed = new EmbedBuilder() @@ -30,10 +28,12 @@ module.exports = { { name: '⏱️ Expiration', value: 'Ce code expire dans **10 minutes**' }, { name: '🔑 Votre code', value: `\`${code}\``, inline: false } ) - .setFooter({ text: 'Ne partagez pas ce code avec d\'autres personnes' }) + .setFooter({ text: 'Le système de surveillance démarre automatiquement' }) .setTimestamp(); await interaction.reply({ embeds: [embed], ephemeral: true }); + + // Le système checkAndManageWebSocket va détecter le nouveau code automatiquement } catch (error) { console.error('Erreur lors de la génération du code:', error); diff --git a/consoleMonitor.js b/consoleMonitor.js index ba08047..7c0bed2 100644 --- a/consoleMonitor.js +++ b/consoleMonitor.js @@ -6,6 +6,8 @@ let ws = null; let reconnectTimeout = null; let client = null; let heartbeatInterval = null; +let checkInterval = null; +let isMonitoring = false; const parseLogMessage = (log) => { // Format réel de log Palworld: @@ -109,7 +111,38 @@ const getWebSocketCredentials = async (pterodactylToken, serverId) => { } }; +const checkAndManageWebSocket = async () => { + const { hasActiveLinkCodes, cleanExpiredCodes } = require('./database.js'); + + try { + // Nettoyer les codes expirés + await cleanExpiredCodes(); + + const hasActiveCodes = await hasActiveLinkCodes(); + + if (hasActiveCodes && !ws) { + // Il y a des codes actifs mais pas de connexion WebSocket + console.log('🔌 Codes de liaison actifs détectés, connexion au WebSocket...'); + const serverId = process.env.PTERODACTYL_SERVER_ID; + const pterodactylToken = process.env.PTERODACTYL_API_TOKEN; + await connectWebSocket(pterodactylToken, serverId); + } else if (!hasActiveCodes && ws) { + // Pas de codes actifs mais WebSocket connecté + console.log('🔌 Aucun code actif, fermeture du WebSocket...'); + stopConsoleMonitoring(); + } + } catch (error) { + console.error('Erreur lors de la vérification des codes actifs:', error); + } +}; + const connectWebSocket = async (pterodactylToken, serverId) => { + // Éviter les connexions multiples + if (ws && ws.readyState === WebSocket.OPEN) { + console.log('⚠️ WebSocket déjà connecté'); + return; + } + try { const credentials = await getWebSocketCredentials(pterodactylToken, serverId); @@ -164,6 +197,8 @@ const connectWebSocket = async (pterodactylToken, serverId) => { if (steamId) { await handleLinkCommand(linkData.playerName, steamId, linkData.code); + // Vérifier immédiatement s'il faut fermer la connexion + await checkAndManageWebSocket(); } else { console.log(`❌ Impossible de trouver le Steam ID pour ${linkData.playerName}`); console.log(`💡 Le joueur doit être connecté sur le serveur`); @@ -187,7 +222,7 @@ const connectWebSocket = async (pterodactylToken, serverId) => { }); ws.on('close', (code, reason) => { - console.log(`⚠️ WebSocket Pterodactyl déconnecté (Code: ${code}, Raison: ${reason})`); + console.log(`⚠️ WebSocket Pterodactyl déconnecté (Code: ${code})`); ws = null; // Arrêter le heartbeat @@ -196,28 +231,22 @@ const connectWebSocket = async (pterodactylToken, serverId) => { heartbeatInterval = null; } - // Reconnexion automatique - if (reconnectTimeout) clearTimeout(reconnectTimeout); - reconnectTimeout = setTimeout(() => { - console.log('🔄 Tentative de reconnexion...'); - connectWebSocket(pterodactylToken, serverId); - }, 10000); + // Ne pas reconnecter automatiquement, laisser le checkInterval gérer ça }); } catch (error) { console.error('Erreur lors de la connexion WebSocket:', error); - - // Réessayer dans 30 secondes - if (reconnectTimeout) clearTimeout(reconnectTimeout); - reconnectTimeout = setTimeout(() => { - console.log('🔄 Tentative de reconnexion...'); - connectWebSocket(pterodactylToken, serverId); - }, 30000); } }; const startConsoleMonitoring = (discordClient, pterodactylToken) => { + if (isMonitoring) { + console.log('⚠️ Surveillance déjà active'); + return; + } + client = discordClient; + isMonitoring = true; const serverId = process.env.PTERODACTYL_SERVER_ID; if (!serverId) { @@ -225,8 +254,13 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => { return; } - console.log('🔍 Surveillance de la console Pterodactyl démarrée'); - connectWebSocket(pterodactylToken, serverId); + console.log('🔍 Surveillance de la console Pterodactyl démarrée (mode intelligent)'); + + // Vérifier immédiatement + checkAndManageWebSocket(); + + // Vérifier toutes les 30 secondes s'il faut connecter/déconnecter + checkInterval = setInterval(checkAndManageWebSocket, 30000); }; const stopConsoleMonitoring = () => { @@ -235,6 +269,11 @@ const stopConsoleMonitoring = () => { heartbeatInterval = null; } + if (checkInterval) { + clearInterval(checkInterval); + checkInterval = null; + } + if (reconnectTimeout) { clearTimeout(reconnectTimeout); reconnectTimeout = null; @@ -244,6 +283,9 @@ const stopConsoleMonitoring = () => { ws.close(); ws = null; } + + isMonitoring = false; + console.log('🔌 Surveillance de la console arrêtée'); }; module.exports = { startConsoleMonitoring, stopConsoleMonitoring };