This commit is contained in:
Louis Mazin 2025-12-08 21:40:12 +01:00
parent 5173bf09bf
commit 93d5ec9b1b
2 changed files with 59 additions and 13 deletions

View File

@ -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;

View File

@ -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);