Files
Femboy-Croissant-Bot/commands/xp/leaderboard.js
2026-03-15 11:58:43 +01:00

73 lines
2.3 KiB
JavaScript

const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
const { getLeaderboard, getXPProgress } = require('../../functions/xp/xp.js');
const { colors } = require('../../utils/constants');
module.exports = {
category: 'xp',
data: new SlashCommandBuilder()
.setName('leaderboard')
.setDescription('Affiche le classement des niveaux')
.addIntegerOption(option =>
option.setName('limit')
.setDescription('Nombre d\'utilisateurs à afficher (par défaut: 10)')
.setRequired(false)
.setMinValue(1)
.setMaxValue(25)),
async execute(interaction) {
await interaction.deferReply();
const limit = interaction.options.getInteger('limit') || 10;
const leaderboard = await getLeaderboard(interaction.guild.id, limit);
if (leaderboard.length === 0) {
return interaction.editReply({
content: '❌ Aucun utilisateur trouvé dans le classement.'
});
}
// Récupérer les informations des utilisateurs
const leaderboardData = [];
for (const user of leaderboard) {
try {
const member = await interaction.guild.members.fetch(user.userId).catch(() => null);
if (member) {
leaderboardData.push({
user: member.user,
xp: user.xp,
level: user.level
});
}
} catch (err) {
// Ignorer les erreurs
}
}
const { emojis } = require('../../utils/constants');
// Créer la description du classement
const medals = ['🥇', '🥈', '🥉'];
const description = leaderboardData.map((data, index) => {
const medal = medals[index] || `\`${index + 1}.\``;
const progress = getXPProgress(data.xp, data.level);
return `${medal} **${data.user.displayName}** • ${emojis.level} Niveau \`${data.level}\`${emojis.xp} \`${data.xp.toLocaleString()} XP\`\`${progress.percentage}%\``;
}).join('\n');
const embed = new EmbedBuilder()
.setAuthor({
name: `${interaction.guild.name}`,
iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined
})
.setTitle(`${emojis.leaderboard} Classement des Niveaux`)
.setColor(colors.xp)
.setDescription(description || 'Aucun utilisateur dans le classement')
.setFooter({
text: `Top ${limit}${interaction.guild.name}`,
iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined
})
.setTimestamp();
await interaction.editReply({ embeds: [embed] });
},
};