diff --git a/commands/casino/top.js b/commands/casino/top.js index d865afb..ab6d16c 100644 --- a/commands/casino/top.js +++ b/commands/casino/top.js @@ -6,7 +6,7 @@ module.exports = { aliases: ['leaderboard', 'lb'], description: 'Affiche le top 10 des membres du serveur', emote: '🏆', - utilisation: '[coins|pocket|bank|reputation|niveau]', + utilisation: '[global|pocket|bank|reputation|niveau]', permission: 0, async execute(message, args, client) { @@ -34,19 +34,131 @@ module.exports = { ], allowedMentions: { repliedUser: false } }) } - let data; - if (args[0] === 'coins') { - data = db.all(`SELECT userId, pocket+bank AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id]); - } else if (args[0] === 'pocket') { - data = db.all(message.guild.id, 'SELECT userId, pocket AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10', [message.guild.id]); - } else if (args[0] === 'bank') { - data = db.all(message.guild.id, 'SELECT userId, bank AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10', [message.guild.id]); - } else if (args[0] === 'reputation') { - data = db.all(message.guild.id, 'SELECT userId, reputation AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10', [message.guild.id]); - } else if (args[0] === 'niveau') { - data = db.all(message.guild.id, 'SELECT userId, lvl AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10', [message.guild.id]); - } + 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); + }); + }); + } + + const emoji = { + coins: '🪙', + pocket: '💰', + bank: '🏦', + reputation: '🔺', + niveau: '📊' + } + + let leaderboard = data.map((row, i) => { + 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} <@${row.userId}> - \`${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() }) - console.log(data) + 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') + ); + + 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') { + 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 }); + } + }); }, } \ No newline at end of file