Files
bot-discord-coins/commands/casino/top.js
T

110 lines
4.0 KiB
JavaScript

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];
}