const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); const db = require('../../functions/database/db.js'); const { getUserXP } = require('../../functions/xp/xp.js'); const { colors } = require('../../utils/constants'); const { sendLog } = require('../../utils/helpers'); module.exports = { category: 'xp', data: new SlashCommandBuilder() .setName('resetlevel') .setDescription('Réinitialiser le niveau d\'un utilisateur (Admin/Modérateur uniquement)') .addUserOption(option => option.setName('user') .setDescription('L\'utilisateur dont tu veux réinitialiser le niveau') .setRequired(true)) .addStringOption(option => option.setName('reason') .setDescription('Raison du reset (optionnel)') .setRequired(false)) .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), async execute(interaction) { await interaction.deferReply({ ephemeral: true }); // Vérifier les permissions (Modérateur ou Admin) if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages) && !interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { return interaction.editReply({ content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Modérateur/Admin requis)' }); } const target = interaction.options.getUser('user'); const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; if (!target) { return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); } // Vérifier que l'utilisateur ne se reset pas lui-même if (target.id === interaction.user.id) { return interaction.editReply({ content: '❌ Tu ne peux pas te reset toi-même.' }); } // Vérifier que l'utilisateur ne reset pas le propriétaire du serveur if (target.id === interaction.guild.ownerId) { return interaction.editReply({ content: '❌ Tu ne peux pas reset le niveau du propriétaire du serveur.' }); } // Vérifier les rôles (ne pas permettre de reset quelqu'un avec un rôle supérieur) const targetMember = await interaction.guild.members.fetch(target.id).catch(() => null); if (targetMember) { if (targetMember.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { return interaction.editReply({ content: '❌ Tu ne peux pas reset le niveau d\'un utilisateur avec un rôle supérieur ou égal au tien.' }); } } try { // Récupérer les données XP de l'utilisateur avant le reset const userXP = await getUserXP(target.id, interaction.guild.id); if (!userXP || userXP.xp === 0) { return interaction.editReply({ content: `❌ ${target.tag} n'a aucun niveau/XP à réinitialiser.` }); } const oldLevel = userXP.level; const oldXP = userXP.xp; const oldMessages = userXP.totalMessages || 0; const oldVoiceTime = userXP.totalVoiceTime || 0; // Supprimer complètement l'utilisateur de la table user_xp await db.query( 'DELETE FROM user_xp WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id] ); // Supprimer aussi les logs XP de l'utilisateur (optionnel, pour un reset complet) await db.query( 'DELETE FROM xp_logs WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id] ); // Logger l'action dans la table logs await db.query( `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ target.id, target.tag, interaction.user.id, interaction.user.tag, 'Reset de niveau', `Niveau ${oldLevel} (${oldXP} XP) réinitialisé. Raison: ${reason}`, 'Permanent', interaction.guild.id, Date.now() ] ); const { emojis } = require('../../utils/constants'); // Envoyer un log dans le canal de logs const logEmbed = new EmbedBuilder() .setAuthor({ name: `${interaction.user.displayName}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) .setTitle(`${emojis.warning} Reset de Niveau`) .setColor(colors.warning) .setDescription(`Le niveau de ${target.toString()} a été réinitialisé.`) .setThumbnail(target.displayAvatarURL({ dynamic: true })) .addFields( { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, { name: '📊 Niveau avant', value: `\`${oldLevel}\``, inline: true }, { name: '📈 XP avant', value: `\`${oldXP.toLocaleString()} XP\``, inline: true }, { name: '💬 Messages', value: `\`${oldMessages.toLocaleString()}\``, inline: true }, { name: '🎤 Temps vocal', value: `\`${Math.floor(oldVoiceTime / 60)}h\``, inline: true }, { name: '📝 Raison', value: reason, inline: false } ) .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) .setTimestamp(); await sendLog(interaction.guild, { embeds: [logEmbed] }); // Réponse à l'utilisateur const embed = new EmbedBuilder() .setAuthor({ name: `${target.displayName}`, iconURL: target.displayAvatarURL({ dynamic: true }) }) .setTitle(`${emojis.success} Niveau Réinitialisé`) .setColor(colors.success) .setDescription(`Le niveau de ${target.toString()} a été complètement réinitialisé.`) .setThumbnail(target.displayAvatarURL({ dynamic: true })) .addFields( { name: '👤 Utilisateur', value: `\`${target.tag}\``, inline: true }, { name: '📊 Niveau avant', value: `\`${oldLevel}\``, inline: true }, { name: '📈 XP avant', value: `\`${oldXP.toLocaleString()} XP\``, inline: true }, { name: '📝 Raison', value: reason, inline: false } ) .setFooter({ text: 'Toutes les données XP ont été supprimées de la base de données.' }) .setTimestamp(); await interaction.editReply({ embeds: [embed] }); } catch (err) { console.error('Erreur lors du reset de niveau:', err); await interaction.editReply({ content: `❌ Erreur lors du reset de niveau: ${err.message}` }); } }, };