This commit is contained in:
Louis Mazin 2025-12-08 21:53:55 +01:00
parent c61d2186c6
commit ac461cc3fb
2 changed files with 61 additions and 19 deletions

View File

@ -8,7 +8,6 @@ module.exports = {
async execute(interaction) { async execute(interaction) {
try { try {
// Vérifier si l'utilisateur est déjà lié
const existingLink = await getUserLink(interaction.user.id); const existingLink = await getUserLink(interaction.user.id);
if (existingLink) { if (existingLink) {
return interaction.reply({ return interaction.reply({
@ -17,7 +16,6 @@ module.exports = {
}); });
} }
// Générer un code unique
const code = await generateLinkCode(interaction.user.id); const code = await generateLinkCode(interaction.user.id);
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
@ -30,11 +28,13 @@ module.exports = {
{ name: '⏱️ Expiration', value: 'Ce code expire dans **10 minutes**' }, { name: '⏱️ Expiration', value: 'Ce code expire dans **10 minutes**' },
{ name: '🔑 Votre code', value: `\`${code}\``, inline: false } { 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(); .setTimestamp();
await interaction.reply({ embeds: [embed], ephemeral: true }); await interaction.reply({ embeds: [embed], ephemeral: true });
// Le système checkAndManageWebSocket va détecter le nouveau code automatiquement
} catch (error) { } catch (error) {
console.error('Erreur lors de la génération du code:', error); console.error('Erreur lors de la génération du code:', error);
await interaction.reply({ await interaction.reply({

View File

@ -6,6 +6,8 @@ let ws = null;
let reconnectTimeout = null; let reconnectTimeout = null;
let client = null; let client = null;
let heartbeatInterval = null; let heartbeatInterval = null;
let checkInterval = null;
let isMonitoring = false;
const parseLogMessage = (log) => { const parseLogMessage = (log) => {
// Format réel de log Palworld: // 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) => { const connectWebSocket = async (pterodactylToken, serverId) => {
// Éviter les connexions multiples
if (ws && ws.readyState === WebSocket.OPEN) {
console.log('⚠️ WebSocket déjà connecté');
return;
}
try { try {
const credentials = await getWebSocketCredentials(pterodactylToken, serverId); const credentials = await getWebSocketCredentials(pterodactylToken, serverId);
@ -164,6 +197,8 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
if (steamId) { if (steamId) {
await handleLinkCommand(linkData.playerName, steamId, linkData.code); await handleLinkCommand(linkData.playerName, steamId, linkData.code);
// Vérifier immédiatement s'il faut fermer la connexion
await checkAndManageWebSocket();
} else { } else {
console.log(`❌ Impossible de trouver le Steam ID pour ${linkData.playerName}`); console.log(`❌ Impossible de trouver le Steam ID pour ${linkData.playerName}`);
console.log(`💡 Le joueur doit être connecté sur le serveur`); console.log(`💡 Le joueur doit être connecté sur le serveur`);
@ -187,7 +222,7 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
}); });
ws.on('close', (code, reason) => { 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; ws = null;
// Arrêter le heartbeat // Arrêter le heartbeat
@ -196,28 +231,22 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
heartbeatInterval = null; heartbeatInterval = null;
} }
// Reconnexion automatique // Ne pas reconnecter automatiquement, laisser le checkInterval gérer ça
if (reconnectTimeout) clearTimeout(reconnectTimeout);
reconnectTimeout = setTimeout(() => {
console.log('🔄 Tentative de reconnexion...');
connectWebSocket(pterodactylToken, serverId);
}, 10000);
}); });
} catch (error) { } catch (error) {
console.error('Erreur lors de la connexion WebSocket:', 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) => { const startConsoleMonitoring = (discordClient, pterodactylToken) => {
if (isMonitoring) {
console.log('⚠️ Surveillance déjà active');
return;
}
client = discordClient; client = discordClient;
isMonitoring = true;
const serverId = process.env.PTERODACTYL_SERVER_ID; const serverId = process.env.PTERODACTYL_SERVER_ID;
if (!serverId) { if (!serverId) {
@ -225,8 +254,13 @@ const startConsoleMonitoring = (discordClient, pterodactylToken) => {
return; return;
} }
console.log('🔍 Surveillance de la console Pterodactyl démarrée'); console.log('🔍 Surveillance de la console Pterodactyl démarrée (mode intelligent)');
connectWebSocket(pterodactylToken, serverId);
// Vérifier immédiatement
checkAndManageWebSocket();
// Vérifier toutes les 30 secondes s'il faut connecter/déconnecter
checkInterval = setInterval(checkAndManageWebSocket, 30000);
}; };
const stopConsoleMonitoring = () => { const stopConsoleMonitoring = () => {
@ -235,6 +269,11 @@ const stopConsoleMonitoring = () => {
heartbeatInterval = null; heartbeatInterval = null;
} }
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
if (reconnectTimeout) { if (reconnectTimeout) {
clearTimeout(reconnectTimeout); clearTimeout(reconnectTimeout);
reconnectTimeout = null; reconnectTimeout = null;
@ -244,6 +283,9 @@ const stopConsoleMonitoring = () => {
ws.close(); ws.close();
ws = null; ws = null;
} }
isMonitoring = false;
console.log('🔌 Surveillance de la console arrêtée');
}; };
module.exports = { startConsoleMonitoring, stopConsoleMonitoring }; module.exports = { startConsoleMonitoring, stopConsoleMonitoring };