const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder } = require('discord.js'); const db = require('../../fonctions/database.js'); const embedColor = require('../../fonctions/embedColor.js'); module.exports = { aliases: ['leaderboard', 'lb'], description: 'Affiche le top 10 des membres du serveur', emote: '🏆', utilisation: '[pocket|bank|reputation]', permission: 0, async execute(message, args, client) { let type = 'bank'; let emote = ':bank:'; if (args[0] ==='pocket') { type = args[0] emote = ':moneybag:'; } else if (args[0] === 'reputation') { type = args[0] emote = ':star2:'; } else if (args[0] && args[0] !== 'bank') { const embed = new EmbedBuilder() .setTitle('Erreur') .setDescription('❌ Veuillez spĂ©cifier un type de leaderboard valide: `pocket`, `bank` ou `reputation`') .setColor(await embedColor(message.author.id, message.guild.id)) .setTimestamp() .setFooter({ text: `DemandĂ© par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) } const [embed, row] = await leaderboard(message, type); const replyMessage = await message.reply({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); client.on('interactionCreate', async (interaction) => { if (!interaction.isStringSelectMenu()) return; if (interaction.customId === 'topLeaderboard') { const selected = interaction.values[0]; await interaction.deferUpdate(); const [embed, row] = await leaderboard(message, selected); replyMessage.edit({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); interaction.followUp({ content: `Leaderboard mis Ă  jour en fonction de \`${selected}\``, ephemeral: true, allowedMentions: { repliedUser: false } }); } }); }, }; async function leaderboard(message, type) { const topUsers = await new Promise((resolve, reject) => { db.all(`SELECT * FROM users WHERE guildId = ? ORDER BY ${type} DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }); }); let emote = ':bank:'; if (type === 'pocket') { emote = ':moneybag:'; } else if (type === 'reputation') { emote = ':star2:'; } const description = topUsers.map((user, index) => { let place; if (index === 0) { place = ':first_place:'; } else if (index === 1) { place = ':second_place:'; } else if (index === 2) { place = ':third_place:'; } else { place = `${index + 1}.`; } return `${place} <@${user.userId}> - \`${user[type]}\` ${emote}`; }); const embed = new EmbedBuilder() .setAuthor({ name: `Top 10 des Membres de ${message.guild.name} en ${type}`, iconURL: message.guild.iconURL() }) .setDescription(description.join('\n\n')) .setColor(await embedColor(message.author.id, message.guild.id)) .setTimestamp() .setFooter({ text: `DemandĂ© par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); const select = new StringSelectMenuBuilder() .setCustomId('topLeaderboard') .setPlaceholder('Choisissez un type de leaderboard') .addOptions( new StringSelectMenuOptionBuilder() .setLabel('Pocket') .setDescription('Affiche le top en fonction de leur argent de poche') .setValue('pocket'), new StringSelectMenuOptionBuilder() .setLabel('Bank') .setDescription('Affiche le top en fonction de leur argent en banque') .setValue('bank'), new StringSelectMenuOptionBuilder() .setLabel('Reputation') .setDescription('Affiche le top en fonction de leur rĂ©putation') .setValue('reputation') ); const row = new ActionRowBuilder() .addComponents(select); return [embed, row]; }