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", "ttop"], description: "Affiche le top 10 des membres/teams du serveur.", emote: "🏆", utilisation: "[global|pocket|bank|reputation|niveau|team|teamreputation|teamdonnateur]", permission: 0, async execute(message, args, client) { if ( args[0] === "coins" || args[0] === "coin" || args[0] === "global" || args[0] === "money" ) { args[0] = "coins"; } else if ( args[0] === "pocket" || args[0] === "cash" || args[0] === "wallet" || args[0] === "porte-monnaie" || args[0] === "poche" ) { args[0] = "pocket"; } else if ( args[0] === "bank" || args[0] === "banque" || args[0] === "coffre" || args[0] === "coffre-fort" || args[0] === "bk" ) { args[0] = "bank"; } else if ( args[0] === "reputation" || args[0] === "rep" || args[0] === "réputation" || args[0] === "reput" ) { args[0] = "reputation"; } else if ( args[0] === "niveau" || args[0] === "lvl" || args[0] === "level" || args[0] === "lvl" ) { args[0] = "niveau"; } else if (args[0] === "team" || args[0] === "t") { args[0] = "team"; } else if ( args[0] === "teamreputation" || args[0] === "treputation" || args[0] === "teamrep" || args[0] === "trep" ) { args[0] = "team"; } else if ( args[0] === "teamdonnateur" || args[0] === " tdonnateur" || args[0] === "tdroper" || args[0] === " tdropper" || args[0] === " teamdrop" || args[0] === "tdrop" || args[0] === "teamdroper" || args[0] === "teamdropper" ) { args[0] = "teamdroper"; } else if (!args[0]) { args[0] = "coins"; } else { args[0] = "coins"; message.reply({ embeds: [ new EmbedBuilder() .setTitle("Argument invalide") .setDescription( `Vous pouvez utiliser les arguments suivants: \`coins\`, \`pocket\`, \`bank\`, \`reputation\`, \`niveau\`, \`team\`, \`teamreputation\`, \`teamdonnateur\`, ou ne rien mettre pour afficher le top 10 des membres du serveur.`, ) .setColor(await embedColor(message.author.id, message.guild.id)) .setTimestamp() .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL(), }), ], allowedMentions: { repliedUser: false }, }); } async function leaderboard(type) { let data; if (type === "coins") { data = await new Promise((resolve, reject) => { db.all( `SELECT userId, pocket+bank AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "pocket") { data = await new Promise((resolve, reject) => { db.all( `SELECT userId, pocket AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "bank") { data = await new Promise((resolve, reject) => { db.all( `SELECT userId, bank AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "reputation") { data = await new Promise((resolve, reject) => { db.all( `SELECT userId, reputation AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "niveau") { data = await new Promise((resolve, reject) => { db.all( `SELECT userId, lvl AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "team") { data = await new Promise((resolve, reject) => { db.all( `SELECT name, bank AS coins FROM teams WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "teamreputation") { data = await new Promise((resolve, reject) => { db.all( `SELECT name, reputation AS teams FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } else if (type === "teamdroper") { data = await new Promise((resolve, reject) => { db.all( `SELECT userId, teamdroper AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { if (err) reject(err); resolve(rows); }, ); }); } function convert(labelValue) { return Math.abs(Number(labelValue)) >= 1.0e+9 ? (Math.abs(Number(labelValue)) / 1.0e+9).toFixed(2) + "B" : Math.abs(Number(labelValue)) >= 1.0e+6 ? (Math.abs(Number(labelValue)) / 1.0e+6).toFixed(2) + "M" : Math.abs(Number(labelValue)) >= 1.0e+3 ? (Math.abs(Number(labelValue)) / 1.0e+3).toFixed(2) + "K" : Math.abs(Number(labelValue)); } const emoji = { coins: "🪙", pocket: "💰", bank: "🏦", reputation: "🔺", niveau: "📊", team: "👑", teamreputation: "🔺", teamdroper: "🎁", }; let leaderboard = data .map((row, i) => { const user = { coins: '<@' + row.userId + '>', pocket: '<@' + row.userId + '>', bank: '<@' + row.userId + '>', reputation: '<@' + row.userId + '>', niveau: '<@' + row.userId + '>', team: row.name, teamreputation: row.name, teamdroper: '<@' + row.userId + '>' } let position; switch (i) { case 0: position = ":first_place:"; break; case 1: position = ":second_place:"; break; case 2: position = ":third_place:"; break; default: position = `**${i + 1}.**`; } return `${position} ${user[type]} - \`${convert(row.coins)}\` ${emoji[type]}`; }) .join("\n\n"); const embed = new EmbedBuilder() .setTitle("🏆 Top 10 des membres du serveur") .setDescription( `Voici le top 10 des membres du serveur trié par ${type}:\n\n${leaderboard}`, ) .setColor(await embedColor(message.author.id, message.guild.id)) .setTimestamp() .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL(), }); return embed; } const embed = await leaderboard(args[0]); const select = new StringSelectMenuBuilder() .setCustomId("topLeaderboard") .setPlaceholder("Choisissez un type de leaderboard") .addOptions( new StringSelectMenuOptionBuilder() .setLabel("Global") .setEmoji("🪙") .setDescription( "Affiche le top en fonction de la somme de l'argent en poche et en banque", ) .setValue("coins"), new StringSelectMenuOptionBuilder() .setLabel("Poche") .setEmoji("💰") .setDescription("Affiche le top en fonction de l'argent en poche") .setValue("pocket"), new StringSelectMenuOptionBuilder() .setLabel("Banque") .setEmoji("🏦") .setDescription("Affiche le top en fonction de l'argent en banque") .setValue("bank"), new StringSelectMenuOptionBuilder() .setLabel("Réputation") .setEmoji("🔺") .setDescription("Affiche le top en fonction de la réputation") .setValue("reputation"), new StringSelectMenuOptionBuilder() .setLabel("Niveau") .setEmoji("📊") .setDescription("Affiche le top en fonction du niveau") .setValue("niveau"), new StringSelectMenuOptionBuilder() .setLabel("Teams bank") .setEmoji("👑") .setDescription("Affiche le top en fonction de l'argent des teams") .setValue("team"), new StringSelectMenuOptionBuilder() .setLabel("Teams réputation") .setEmoji("🔺") .setDescription( "Affiche le top en fonction de la réputation des teams", ) .setValue("teamreputation"), new StringSelectMenuOptionBuilder() .setLabel("TeamDroper") .setEmoji("🎁") .setDescription( "Affiche le top en fonction du nombre de coins donnés à une team", ) .setValue("teamdroper"), ); const row = new ActionRowBuilder().addComponents(select); 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") { if (interaction.user.id !== message.author.id) { return interaction.reply({ content: "Vous n'avez pas la permission d'utiliser ce menu", ephemeral: true, }); } const selected = interaction.values[0]; await interaction.deferUpdate(); const embed = await leaderboard(selected); replyMessage.edit({ embeds: [embed] }); interaction.followUp({ content: "Leaderboard mis à jour", ephemeral: true, }); } }); }, };