diff --git a/commands/utility/delier.js b/commands/utility/delier.js index 9cef536..ead33ff 100644 --- a/commands/utility/delier.js +++ b/commands/utility/delier.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageFlags } = require('discord.js'); const { getUserLink, deleteUserLink } = require('../../database.js'); module.exports = { @@ -6,54 +6,126 @@ module.exports = { .setName('delier') .setDescription('Délier un compte Discord de son compte Palworld (Admin)') .addUserOption(option => - option.setName('discord-account') + option.setName('compte-discord') .setDescription('Le compte Discord à délier') .setRequired(true)), async execute(interaction) { try { - await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + const discordUser = interaction.options.getUser('compte-discord'); - const discordUser = interaction.options.getUser('discord-account'); - - // Vérifier si l'utilisateur est lié const existingLink = await getUserLink(discordUser.id); if (!existingLink) { - return interaction.editReply({ - content: `❌ Le compte <@${discordUser.id}> n'est pas lié à un compte Palworld.`, - flags: MessageFlags.Ephemeral + const embed = new EmbedBuilder() + .setColor(0xFF9900) + .setTitle('⚠️ Aucune liaison trouvée') + .setDescription(`Le compte <@${discordUser.id}> n'est pas lié à un compte Palworld.`) + .setTimestamp(); + + return interaction.reply({ embeds: [embed]}); + } + + // Afficher un embed de confirmation avec boutons + const confirmEmbed = new EmbedBuilder() + .setColor(0xFF6600) + .setTitle('⚠️ Confirmation de déliaison (Admin)') + .setDescription(`Êtes-vous sûr de vouloir délier ce compte ?`) + .addFields( + { name: '👤 Discord', value: `${discordUser.tag} (<@${discordUser.id}>)`, inline: false }, + { name: '🎮 Palworld', value: `**${existingLink.palworld_username}**`, inline: true }, + { name: '🆔 Steam ID', value: `\`${existingLink.steam_id}\``, inline: true }, + { name: '🎯 Player ID', value: `\`${existingLink.player_id || 'N/A'}\``, inline: false } + ) + .setFooter({ text: 'Cette action est irréversible' }) + .setTimestamp(); + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('admin_confirm_unlink') + .setLabel('✅ Confirmer la déliaison') + .setStyle(ButtonStyle.Danger), + new ButtonBuilder() + .setCustomId('admin_cancel_unlink') + .setLabel('❌ Annuler') + .setStyle(ButtonStyle.Secondary) + ); + + const response = await interaction.reply({ + embeds: [confirmEmbed], + components: [row] + }); + + const collectorFilter = i => i.user.id === interaction.user.id; + + try { + const confirmation = await response.awaitMessageComponent({ + filter: collectorFilter, + time: 60000 + }); + + if (confirmation.customId === 'admin_confirm_unlink') { + await deleteUserLink(discordUser.id); + + const successEmbed = new EmbedBuilder() + .setColor(0x00FF00) + .setTitle('✅ Liaison supprimée') + .setDescription(`Le compte Discord a été délié avec succès.`) + .addFields( + { name: '👤 Discord', value: `${discordUser.tag} (<@${discordUser.id}>)`, inline: false }, + { name: '🎮 Palworld (ancien)', value: existingLink.palworld_username, inline: true }, + { name: '🆔 Steam ID (ancien)', value: `\`${existingLink.steam_id}\``, inline: true } + ) + .setTimestamp(); + + await discordUser.send( + `🔓 **Liaison supprimée**\n\n` + + `Votre compte Discord a été délié de votre compte Palworld par un administrateur.\n` + + `Vous pouvez vous lier à nouveau avec \`/lier-rygainland\`.` + ).catch(() => {}); + + await confirmation.update({ + embeds: [successEmbed], + components: [] + }); + + } else if (confirmation.customId === 'admin_cancel_unlink') { + const cancelEmbed = new EmbedBuilder() + .setColor(0x808080) + .setTitle('❌ Déliaison annulée') + .setDescription('La liaison n\'a pas été modifiée.') + .setTimestamp(); + + await confirmation.update({ + embeds: [cancelEmbed], + components: [] + }); + } + + } catch (error) { + const timeoutEmbed = new EmbedBuilder() + .setColor(0x808080) + .setTitle('⏱️ Temps écoulé') + .setDescription('La demande de déliaison a expiré. La liaison n\'a pas été modifiée.') + .setTimestamp(); + + await interaction.editReply({ + embeds: [timeoutEmbed], + components: [] }); } - // Supprimer la liaison - await deleteUserLink(discordUser.id); - - const embed = new EmbedBuilder() - .setColor(0xFF0000) - .setTitle('🔓 Liaison supprimée') - .setDescription(`Le compte Discord a été délié avec succès.`) - .addFields( - { name: '👤 Discord', value: `${discordUser.tag} (<@${discordUser.id}>)`, inline: false }, - { name: '🎮 Palworld (ancien)', value: existingLink.palworld_username, inline: true }, - { name: '🆔 Steam ID (ancien)', value: `\`${existingLink.steam_id}\``, inline: true } - ) - .setTimestamp(); - - // Envoyer un MP au joueur délié - await discordUser.send( - `🔓 **Liaison supprimée**\n\n` + - `Votre compte Discord a été délié de votre compte Palworld par un administrateur.\n` + - `Vous pouvez vous lier à nouveau avec \`/rygainland-link\`.` - ).catch(() => {}); - - await interaction.editReply({ embeds: [embed], flags: MessageFlags.Ephemeral }); - } catch (error) { console.error('Erreur lors de la suppression de la liaison:', error); - await interaction.editReply({ + await interaction.reply({ content: '❌ Une erreur est survenue lors de la suppression de la liaison.', flags: MessageFlags.Ephemeral + }).catch(() => { + interaction.editReply({ + content: '❌ Une erreur est survenue lors de la suppression de la liaison.', + flags: MessageFlags.Ephemeral + }); }); } },