const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require('discord.js'); const { verifyLinkCode, updateUserLinkWithUsername } = require('../../database.js'); const axios = require('axios'); module.exports = { data: new SlashCommandBuilder() .setName('lier') .setDescription('Lier manuellement un compte Discord à un compte Palworld (Admin)') .addStringOption(option => option.setName('pseudo-palworld') .setDescription('Le pseudo du joueur sur Palworld') .setRequired(true)) .addUserOption(option => option.setName('discord-account') .setDescription('Le compte Discord à lier') .setRequired(true)), async execute(interaction) { try { console.log('=== [LIER] Début de l\'exécution ==='); console.log('[LIER] Utilisateur qui exécute:', interaction.user.tag); await interaction.deferReply({ flags: MessageFlags.Ephemeral }); const palworldName = interaction.options.getString('pseudo-palworld'); const discordUser = interaction.options.getUser('discord-account'); console.log('[LIER] Pseudo Palworld:', palworldName); console.log('[LIER] Discord User:', discordUser.tag, '(ID:', discordUser.id + ')'); // Récupérer le Steam ID depuis l'API Palworld console.log('[LIER] Appel API pour récupérer les joueurs...'); const response = await axios({ method: 'get', 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 || {}; console.log('[LIER] Nombre de joueurs récupérés:', Object.keys(players).length); console.log('[LIER] Liste des joueurs:', Object.values(players).map(p => p.name)); let playerData = null; // Chercher le joueur par nom console.log('[LIER] Recherche du joueur:', palworldName); for (const [id, player] of Object.entries(players)) { if (player.name === palworldName) { playerData = { steamId: player.userId, playerId: player.playerId, name: player.name }; console.log('[LIER] Joueur trouvé:', playerData); break; } } if (!playerData) { console.log('[LIER] ❌ Joueur non trouvé'); return interaction.editReply({ content: `❌ Impossible de trouver le joueur **${palworldName}** sur le serveur.\n\n` + `💡 Le joueur doit être connecté sur le serveur Palworld.`, flags: MessageFlags.Ephemeral }); } // Créer un code temporaire pour la liaison manuelle console.log('[LIER] Génération du code de liaison...'); const { generateLinkCode } = require('../../database.js'); const code = await generateLinkCode(discordUser.id); console.log('[LIER] Code généré:', code); // Effectuer la liaison immédiatement console.log('[LIER] Vérification du code et liaison...'); const result = await verifyLinkCode(code, playerData.steamId, playerData.name, playerData.playerId); console.log('[LIER] Résultat de la liaison:', result); if (result.success) { console.log('[LIER] ✅ Liaison réussie, mise à jour du username...'); await updateUserLinkWithUsername(discordUser.id, discordUser.tag); const embed = new EmbedBuilder() .setColor(0x00FF00) .setTitle('✅ Liaison manuelle réussie') .addFields( { name: '👤 Discord', value: `${discordUser.tag} (<@${discordUser.id}>)`, inline: false }, { name: '🎮 Palworld', value: palworldName, inline: true }, { name: '🆔 Steam ID', value: `\`${playerData.steamId}\``, inline: true }, { name: '🎯 Player ID', value: `\`${playerData.playerId}\``, inline: false } ) .setTimestamp(); // Envoyer un MP au joueur lié console.log('[LIER] Envoi du MP au joueur...'); await discordUser.send( `✅ **Liaison effectuée par un administrateur**\n\n` + `Votre compte Discord a été lié à votre compte Palworld:\n` + `🎮 Nom Palworld: **${playerData.name}**\n` + `🆔 Steam ID: \`${playerData.steamId}\`\n` + `🎯 Player ID: \`${playerData.playerId}\`` ).catch((err) => { console.log('[LIER] ⚠️ Impossible d\'envoyer le MP:', err.message); }); console.log('[LIER] Envoi de la réponse finale...'); await interaction.editReply({ embeds: [embed], flags: MessageFlags.Ephemeral }); console.log('[LIER] ✅ Commande terminée avec succès'); } else { console.log('[LIER] ❌ Échec de la liaison:', result.message); await interaction.editReply({ content: `❌ Erreur lors de la liaison: ${result.message}`, flags: MessageFlags.Ephemeral }); } } catch (error) { console.error('[LIER] ❌ ERREUR CRITIQUE:', error); console.error('[LIER] Stack trace:', error.stack); await interaction.editReply({ content: '❌ Une erreur est survenue lors de la liaison.', flags: MessageFlags.Ephemeral }).catch(err => console.error('[LIER] Impossible de répondre:', err)); } }, };