97 lines
3.8 KiB
JavaScript
97 lines
3.8 KiB
JavaScript
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
|
|
const { getUserXP, getXPProgress, getXPForNextLevel, getUserRank } = require('../../functions/xp/xp.js');
|
|
const { colors, emojis } = require('../../utils/constants');
|
|
|
|
module.exports = {
|
|
category: 'xp',
|
|
data: new SlashCommandBuilder()
|
|
.setName('level')
|
|
.setDescription('Affiche ton niveau et ton XP')
|
|
.addUserOption(option =>
|
|
option.setName('user')
|
|
.setDescription('L\'utilisateur dont tu veux voir le niveau')
|
|
.setRequired(false)),
|
|
async execute(interaction) {
|
|
await interaction.deferReply();
|
|
|
|
const target = interaction.options.getUser('user') || interaction.user;
|
|
const userXP = await getUserXP(target.id, interaction.guild.id);
|
|
|
|
if (!userXP) {
|
|
return interaction.editReply({
|
|
content: '❌ Erreur lors de la récupération des données XP.'
|
|
});
|
|
}
|
|
|
|
const progress = getXPProgress(userXP.xp, userXP.level);
|
|
const xpForNextLevel = getXPForNextLevel(userXP.level);
|
|
const rank = await getUserRank(target.id, interaction.guild.id);
|
|
|
|
const barLength = 20;
|
|
let filled = 0;
|
|
let empty = barLength;
|
|
|
|
if (progress.needed > 0 && progress.current >= 0) {
|
|
const percentage = Math.min(100, Math.max(0, (progress.current / progress.needed) * 100));
|
|
filled = Math.max(0, Math.min(barLength, Math.floor((percentage / 100) * barLength)));
|
|
empty = Math.max(0, barLength - filled);
|
|
}
|
|
|
|
const progressBar = '█'.repeat(filled) + '░'.repeat(empty);
|
|
|
|
// Formatage du temps vocal
|
|
const totalMinutes = userXP.totalVoiceTime || 0;
|
|
const hours = Math.floor(totalMinutes / 60);
|
|
const minutes = totalMinutes % 60;
|
|
const voiceTimeStr = `${hours}h ${minutes}m`;
|
|
|
|
const embed = new EmbedBuilder()
|
|
.setAuthor({
|
|
name: target.displayName,
|
|
iconURL: target.displayAvatarURL({ dynamic: true })
|
|
})
|
|
.setTitle(`${emojis.level} Niveau ${userXP.level}`)
|
|
.setColor(colors.xp)
|
|
.setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 }))
|
|
.setDescription(`**${emojis.rank} Rang #${rank}** sur ${interaction.guild.name}`)
|
|
.addFields(
|
|
{
|
|
name: `${emojis.xp} XP Total`,
|
|
value: `\`${userXP.xp.toLocaleString()} XP\``,
|
|
inline: true
|
|
},
|
|
{
|
|
name: '📈 Progression',
|
|
value: `\`${progress.current}/${progress.needed} XP\` (${progress.percentage}%)`,
|
|
inline: true
|
|
},
|
|
{
|
|
name: '🎯 Prochain Niveau',
|
|
value: `\`${xpForNextLevel} XP\` requis`,
|
|
inline: true
|
|
},
|
|
{
|
|
name: '📊 Barre de Progression',
|
|
value: `\`\`\`${progressBar}\`\`\``,
|
|
inline: false
|
|
},
|
|
{
|
|
name: '💬 Messages',
|
|
value: `\`${(userXP.totalMessages || 0).toLocaleString()}\``,
|
|
inline: true
|
|
},
|
|
{
|
|
name: '🎤 Temps Vocal',
|
|
value: `\`${voiceTimeStr}\``,
|
|
inline: true
|
|
}
|
|
)
|
|
.setFooter({
|
|
text: `${interaction.guild.name} • Niveau ${userXP.level}`,
|
|
iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined
|
|
})
|
|
.setTimestamp();
|
|
|
|
await interaction.editReply({ embeds: [embed] });
|
|
},
|
|
}; |