This commit is contained in:
Louis Mazin 2025-12-10 12:27:00 +01:00
parent 7aa6a2a8fb
commit 5d72bc1ab4

View File

@ -15,6 +15,9 @@ let connectionTimestamp = null;
let reconnectDelayMs = 5000;
const RECONNECT_DELAY_MAX_MS = 5 * 60 * 1000; // 5 min
// Suivi des joueurs connectés (fallback si la console naffiche pas les déconnexions)
const connectedPlayers = new Map(); // steamId -> { name, playerId, lastSeen }
const parseLogMessage = (log) => {
// Format réel de log Palworld:
// [2025-12-09 13:28:23] [CHAT] <LouisMazin> !link X2NMAY
@ -135,12 +138,87 @@ const getWebSocketCredentials = async (pterodactylToken, serverId) => {
}
};
const checkAndManageWebSocket = async () => {
const { hasActiveLinkCodes, cleanExpiredCodes } = require('./database.js');
// Helper: récupérer la liste actuelle des joueurs via lAPI Palworld
const fetchCurrentPlayers = async () => {
try {
const response = await axios({
method: 'get',
maxBodyLength: Infinity,
url: 'http://play.louismazin.ovh:8212/v1/api/players',
headers: {
'Accept': 'application/json',
'Authorization': `Basic ${process.env.PALWORLD_API_TOKEN}`
}
});
const players = response.data.players || {};
const list = [];
for (const [, player] of Object.entries(players)) {
list.push({
steamId: player.userId,
playerId: player.playerId,
name: player.name
});
}
return list;
} catch (error) {
// API inaccessible quand le serveur est down
return null;
}
};
// Mettre à jour le set des joueurs et détecter les départs silencieux
const pollPlayersAndDetectDisconnects = async (serverState = null) => {
const list = await fetchCurrentPlayers();
const now = Date.now();
if (list && list.length > 0) {
// Marquer présents
for (const p of list) {
connectedPlayers.set(p.steamId, { name: p.name, playerId: p.playerId, lastSeen: now });
}
// Détecter ceux qui ont disparu depuis le dernier poll
for (const [steamId, info] of connectedPlayers) {
const stillHere = list.find(x => x.steamId === steamId);
if (!stillHere) {
try {
const result = await updateLastConnection(steamId);
if (result.changes > 0) {
console.log(`✅ Départ silencieux détecté: ${info.name} (${steamId}) -> lastConnection mis à jour`);
}
} catch (e) {
console.error(`❌ Erreur update lastConnection pour ${steamId}:`, e.message);
}
connectedPlayers.delete(steamId);
}
}
} else {
// Pas de liste (serveur inaccessible) ou vide:
// Si le serveur est arrêté/stopping/offline, considérer tous comme déconnectés
if (serverState && ['offline', 'stopping', 'stopped'].includes(serverState)) {
for (const [steamId, info] of connectedPlayers) {
try {
const result = await updateLastConnection(steamId);
if (result.changes > 0) {
console.log(`✅ Serveur ${serverState}: déconnexion implicite de ${info.name} (${steamId})`);
}
} catch (e) {
console.error(`❌ Erreur update lastConnection pour ${steamId}:`, e.message);
}
}
connectedPlayers.clear();
}
}
};
const checkAndManageWebSocket = async () => {
const { cleanExpiredCodes } = require('./database.js');
try {
await cleanExpiredCodes();
// Fallback polling toutes les 20s
await pollPlayersAndDetectDisconnects();
// Le WebSocket doit toujours être connecté maintenant (pour les déconnexions)
if (!ws && !isConnecting) {
console.log('🔌 Connexion au WebSocket pour surveillance...');
@ -263,7 +341,13 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
}
if (message.event === 'status') {
console.log('📊 Statut du serveur:', message.args[0]);
const state = message.args[0];
console.log('📊 Statut du serveur:', state);
// Si le serveur sarrête/offline, forcer la mise à jour des joueurs connectés (déconnexions implicites)
if (['offline', 'stopping', 'stopped'].includes(state)) {
await pollPlayersAndDetectDisconnects(state);
}
}
} catch (error) {
@ -335,9 +419,9 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => {
// Vérifier immédiatement
checkAndManageWebSocket();
// Vérifier toutes les 30 secondes (nettoyage codes et reconnect si besoin)
// Vérifier toutes les 20 secondes (nettoyage codes et reconnect si besoin)
if (checkInterval) clearInterval(checkInterval);
checkInterval = setInterval(checkAndManageWebSocket, 30000);
checkInterval = setInterval(checkAndManageWebSocket, 20000); // 20s pour détecter vite les départs silencieux
};
const stopConsoleMonitoring = () => {