65 lines
2.7 KiB
JavaScript
65 lines
2.7 KiB
JavaScript
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
|
|
const { getLeaderboard, getXPProgress } = require('../../functions/xp/xp.js');
|
|
const { colors, emojis } = 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.'
|
|
});
|
|
}
|
|
|
|
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 */ }
|
|
}
|
|
|
|
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] });
|
|
},
|
|
}; |