This commit is contained in:
Louis Mazin 2025-12-09 13:27:43 +01:00
parent c483e8f5da
commit ff851ed35f
2 changed files with 40 additions and 32 deletions

View File

@ -8,6 +8,7 @@ let client = null;
let heartbeatInterval = null; let heartbeatInterval = null;
let checkInterval = null; let checkInterval = null;
let isMonitoring = false; let isMonitoring = false;
let isConnecting = false;
const parseLogMessage = (log) => { const parseLogMessage = (log) => {
// Format réel de log Palworld: // Format réel de log Palworld:
@ -118,21 +119,18 @@ const checkAndManageWebSocket = async () => {
const { hasActiveLinkCodes, cleanExpiredCodes } = require('./database.js'); const { hasActiveLinkCodes, cleanExpiredCodes } = require('./database.js');
try { try {
// Nettoyer les codes expirés
await cleanExpiredCodes(); await cleanExpiredCodes();
const hasActiveCodes = await hasActiveLinkCodes(); const hasActiveCodes = await hasActiveLinkCodes();
if (hasActiveCodes && !ws) { if (hasActiveCodes && !ws && !isConnecting) {
// Il y a des codes actifs mais pas de connexion WebSocket
console.log('🔌 Codes de liaison actifs détectés, connexion au WebSocket...'); console.log('🔌 Codes de liaison actifs détectés, connexion au WebSocket...');
const serverId = process.env.PTERODACTYL_SERVER_ID; const serverId = process.env.PTERODACTYL_SERVER_ID;
const pterodactylToken = process.env.PTERODACTYL_API_TOKEN; const pterodactylToken = process.env.PTERODACTYL_API_TOKEN;
await connectWebSocket(pterodactylToken, serverId); await connectWebSocket(pterodactylToken, serverId);
} else if (!hasActiveCodes && ws) { } else if (!hasActiveCodes && ws) {
// Pas de codes actifs mais WebSocket connecté
console.log('🔌 Aucun code actif, fermeture du WebSocket...'); console.log('🔌 Aucun code actif, fermeture du WebSocket...');
stopConsoleMonitoring(); stopWebSocketOnly();
} }
} catch (error) { } catch (error) {
console.error('Erreur lors de la vérification des codes actifs:', error); console.error('Erreur lors de la vérification des codes actifs:', error);
@ -140,12 +138,18 @@ const checkAndManageWebSocket = async () => {
}; };
const connectWebSocket = async (pterodactylToken, serverId) => { const connectWebSocket = async (pterodactylToken, serverId) => {
// Éviter les connexions multiples if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {
if (ws && ws.readyState === WebSocket.OPEN) { console.log('⚠️ WebSocket déjà connecté ou en cours de connexion');
console.log('⚠️ WebSocket déjà connecté');
return; return;
} }
if (isConnecting) {
console.log('⚠️ Connexion WebSocket déjà en cours');
return;
}
isConnecting = true;
try { try {
const credentials = await getWebSocketCredentials(pterodactylToken, serverId); const credentials = await getWebSocketCredentials(pterodactylToken, serverId);
@ -155,8 +159,8 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
ws.on('open', () => { ws.on('open', () => {
console.log('✅ WebSocket Pterodactyl connecté'); console.log('✅ WebSocket Pterodactyl connecté');
isConnecting = false;
// Authentification selon la documentation
ws.send(JSON.stringify({ ws.send(JSON.stringify({
event: 'auth', event: 'auth',
args: [credentials.token] args: [credentials.token]
@ -167,17 +171,14 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
try { try {
const message = JSON.parse(data.toString()); const message = JSON.parse(data.toString());
// Gérer l'événement d'authentification réussie
if (message.event === 'auth success') { if (message.event === 'auth success') {
console.log('✅ Authentification WebSocket réussie'); console.log('✅ Authentification WebSocket réussie');
// S'abonner aux logs de la console
ws.send(JSON.stringify({ ws.send(JSON.stringify({
event: 'send logs', event: 'send logs',
args: [null] args: [null]
})); }));
// Démarrer le heartbeat (toutes les 30 secondes)
if (heartbeatInterval) clearInterval(heartbeatInterval); if (heartbeatInterval) clearInterval(heartbeatInterval);
heartbeatInterval = setInterval(() => { heartbeatInterval = setInterval(() => {
if (ws && ws.readyState === WebSocket.OPEN) { if (ws && ws.readyState === WebSocket.OPEN) {
@ -189,7 +190,6 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
}, 30000); }, 30000);
} }
// Gérer les logs de la console
if (message.event === 'console output') { if (message.event === 'console output') {
const log = message.args[0]; const log = message.args[0];
@ -199,44 +199,57 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
if (playerData) { if (playerData) {
await handleLinkCommand(linkData.playerName, playerData, linkData.code); await handleLinkCommand(linkData.playerName, playerData, linkData.code);
await checkAndManageWebSocket(); // Vérifier immédiatement après la liaison
setTimeout(() => checkAndManageWebSocket(), 2000);
} else { } else {
console.log(`❌ Impossible de trouver le Steam ID pour ${linkData.playerName}`); console.log(`❌ Impossible de trouver le Steam ID pour ${linkData.playerName}`);
} }
} }
} }
// Gérer les événements de statut
if (message.event === 'status') { if (message.event === 'status') {
console.log('📊 Statut du serveur:', message.args[0]); console.log('📊 Statut du serveur:', message.args[0]);
} }
} catch (error) { } catch (error) {
// Message non-JSON ou erreur de parsing, on ignore
console.error('Erreur parsing message WebSocket:', error); console.error('Erreur parsing message WebSocket:', error);
} }
}); });
ws.on('error', (error) => { ws.on('error', (error) => {
console.error('❌ Erreur WebSocket:', error.message); console.error('❌ Erreur WebSocket:', error.message);
isConnecting = false;
}); });
ws.on('close', (code, reason) => { ws.on('close', (code, reason) => {
console.log(`⚠️ WebSocket Pterodactyl déconnecté (Code: ${code})`); console.log(`⚠️ WebSocket Pterodactyl déconnecté (Code: ${code})`);
ws = null; ws = null;
isConnecting = false;
// Arrêter le heartbeat if (heartbeatInterval) {
clearInterval(heartbeatInterval);
heartbeatInterval = null;
}
});
} catch (error) {
console.error('Erreur lors de la connexion WebSocket:', error);
isConnecting = false;
}
};
const stopWebSocketOnly = () => {
if (heartbeatInterval) { if (heartbeatInterval) {
clearInterval(heartbeatInterval); clearInterval(heartbeatInterval);
heartbeatInterval = null; heartbeatInterval = null;
} }
// Ne pas reconnecter automatiquement, laisser le checkInterval gérer ça if (ws) {
}); ws.close();
ws = null;
} catch (error) {
console.error('Erreur lors de la connexion WebSocket:', error);
} }
isConnecting = false;
}; };
const startConsoleMonitoring = (discordClient, pterodactylToken) => { const startConsoleMonitoring = (discordClient, pterodactylToken) => {
@ -259,15 +272,12 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => {
// Vérifier immédiatement // Vérifier immédiatement
checkAndManageWebSocket(); checkAndManageWebSocket();
// Vérifier toutes les 30 secondes s'il faut connecter/déconnecter // Vérifier toutes les 30 secondes
checkInterval = setInterval(checkAndManageWebSocket, 30000); checkInterval = setInterval(checkAndManageWebSocket, 30000);
}; };
const stopConsoleMonitoring = () => { const stopConsoleMonitoring = () => {
if (heartbeatInterval) { stopWebSocketOnly();
clearInterval(heartbeatInterval);
heartbeatInterval = null;
}
if (checkInterval) { if (checkInterval) {
clearInterval(checkInterval); clearInterval(checkInterval);
@ -279,11 +289,6 @@ const stopConsoleMonitoring = () => {
reconnectTimeout = null; reconnectTimeout = null;
} }
if (ws) {
ws.close();
ws = null;
}
isMonitoring = false; isMonitoring = false;
console.log('🔌 Surveillance de la console arrêtée'); console.log('🔌 Surveillance de la console arrêtée');
}; };

View File

@ -6,7 +6,7 @@ const deploy = require('./deploy_command.js')
const update = require('./displayer.js'); const update = require('./displayer.js');
const clean = require('./cleaner.js'); const clean = require('./cleaner.js');
const { Client, GatewayIntentBits, Collection, Events, Partials } = require('discord.js'); const { Client, GatewayIntentBits, Collection, Events, Partials } = require('discord.js');
const { initDatabase, createTables } = require('./database.js'); const { initDatabase, createTables, cleanExpiredCodes } = require('./database.js');
const { startConsoleMonitoring } = require('./consoleMonitor.js'); const { startConsoleMonitoring } = require('./consoleMonitor.js');
const client = new Client({ intents: const client = new Client({ intents:
@ -52,13 +52,16 @@ client.once('ready', async () => {
client.user.setPresence({ activities: [{ name: 'Rygain', type: 'WATCHING' }], status: 'online' }); client.user.setPresence({ activities: [{ name: 'Rygain', type: 'WATCHING' }], status: 'online' });
console.log('Bot started !'); console.log('Bot started !');
// Initialiser la base de données (non bloquant)
try { try {
await initDatabase(); await initDatabase();
await createTables(); await createTables();
// Nettoyer les codes expirés au démarrage
await cleanExpiredCodes();
console.log('🧹 Codes expirés nettoyés');
console.log('📦 Système de liaison activé'); console.log('📦 Système de liaison activé');
// Démarrer la surveillance de la console seulement si la DB est OK
startConsoleMonitoring(client, process.env.PTERODACTYL_API_TOKEN); startConsoleMonitoring(client, process.env.PTERODACTYL_API_TOKEN);
} catch (error) { } catch (error) {
console.error('⚠️ Erreur lors de l\'initialisation de la base de données'); console.error('⚠️ Erreur lors de l\'initialisation de la base de données');