Skip to content

Commit

Permalink
Add and change buttons in leaderboard/reminders
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMonDon committed Jul 17, 2024
1 parent b5468c8 commit 8604c98
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 47 deletions.
118 changes: 76 additions & 42 deletions commands/Economy/leaderboard.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const Command = require('../../base/Command.js');
const { EmbedBuilder } = require('discord.js');
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
const { QuickDB } = require('quick.db');
const db = new QuickDB();

Expand All @@ -17,20 +17,15 @@ class Leaderboard extends Command {
}

async run(msg, text) {
let page = text.join(' ');
page = parseInt(page, 10);
let page = parseInt(text.join(' '), 10) || 1;

if (!page) page = 1;
if (isNaN(page)) return this.client.util.errorEmbed(msg, msg.settings.prefix + this.help.usage, 'Incorrect Usage');

await msg.guild.members.fetch();
const currencySymbol = (await db.get(`servers.${msg.guild.id}.economy.symbol`)) || '$';
let realPage = page;
let maxPages = page;
const usersData = (await db.get(`servers.${msg.guild.id}.users`)) || {};
const leaderboard = [];

// Cache users and add them to the leaderboard
for (const userId in usersData) {
try {
const user = await this.client.users.cache.get(userId);
Expand All @@ -45,64 +40,103 @@ class Leaderboard extends Command {
}
}

// Sort the leaderboard
const sortedLeaderboard = leaderboard
.sort((a, b) => (b.money > a.money ? 1 : -1))
.map((c, index) => {
const neg = c.money < 0n;
const money = neg ? c.money * -1n : c.money;
return {
rank: index + 1,
user: c.user,
userId: c.userId,
display: `**${index + 1}.** ${c.user}: ${neg ? '-' : ''}${currencySymbol}${
money.toLocaleString().length > 156
? `${money.toLocaleString().slice(0, 153) + '...'}`
: `${money.toLocaleString()}`
}`,
};
});
.map((c, index) => ({
rank: index + 1,
user: c.user,
userId: c.userId,
display: `**${index + 1}.** ${c.user}: ${c.money < 0n ? '-' : ''}${currencySymbol}${
c.money.toLocaleString().length > 156
? `${c.money.toLocaleString().slice(0, 153) + '...'}`
: `${c.money.toLocaleString()}`
}`,
}));

function getOrdinalSuffix(n) {
const s = ['th', 'st', 'nd', 'rd'];
const v = n % 100;
return n + (s[(v - 20) % 10] || s[v] || s[0]);
}

// Find the user's rank
const userRank = sortedLeaderboard.find((entry) => entry.userId === msg.author.id);
const userRankDisplay = userRank
? `Your leaderboard rank: ${getOrdinalSuffix(userRank.rank)}`
: 'You are not on the leaderboard';

let displayedLeaderboard = sortedLeaderboard.slice((page - 1) * 10, page * 10);

// Create the pages
if (displayedLeaderboard.length > 0) {
realPage = page;
maxPages = Math.ceil((sortedLeaderboard.length + 1) / 10);
displayedLeaderboard = sortedLeaderboard.slice((page - 1) * 10, page * 10);
} else {
for (let i = 1; i <= page; i++) {
displayedLeaderboard = sortedLeaderboard.slice((i - 1) * 10, i * 10);
if (displayedLeaderboard?.length < 1) {
realPage = i - 1;
maxPages = Math.ceil(sortedLeaderboard.length / 10);
displayedLeaderboard = sortedLeaderboard.slice((i - 2) * 10, (i - 1) * 10);
break;
}
}
}
const maxPages = Math.ceil(sortedLeaderboard.length / 10);

const embed = new EmbedBuilder()
.setColor(msg.settings.embedColor)
.setTitle(`${msg.guild.name}'s Leaderboard`)
.setAuthor({ name: msg.author.tag, iconURL: msg.author.displayAvatarURL() })
.setDescription(`${displayedLeaderboard.map((entry) => entry.display).join('\n') || 'None'}`)
.setFooter({ text: `Page ${realPage} / ${maxPages}${userRankDisplay}` })
.setFooter({ text: `Page ${page} / ${maxPages}${userRankDisplay}` })
.setTimestamp();

return msg.channel.send({ embeds: [embed] });
const row = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('prev_page')
.setLabel('Previous')
.setStyle(ButtonStyle.Primary)
.setDisabled(page === 1),
new ButtonBuilder()
.setCustomId('next_page')
.setLabel('Next')
.setStyle(ButtonStyle.Primary)
.setDisabled(page === maxPages),
);

const message = await msg.channel.send({ embeds: [embed], components: [row] });

const collector = message.createMessageComponentCollector({ time: 2147483647 });

collector.on('collect', async (interaction) => {
if (interaction.user.id !== msg.author.id) {
return interaction.reply({ content: 'These buttons are not for you!', ephemeral: true });
}

if (interaction.customId === 'prev_page') page--;
if (interaction.customId === 'next_page') page++;

displayedLeaderboard = sortedLeaderboard.slice((page - 1) * 10, page * 10);

const updatedEmbed = new EmbedBuilder()
.setColor(msg.settings.embedColor)
.setTitle(`${msg.guild.name}'s Leaderboard`)
.setAuthor({ name: msg.author.tag, iconURL: msg.author.displayAvatarURL() })
.setDescription(`${displayedLeaderboard.map((entry) => entry.display).join('\n') || 'None'}`)
.setFooter({ text: `Page ${page} / ${maxPages}${userRankDisplay}` })
.setTimestamp();

const updatedRow = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('prev_page')
.setLabel('Previous')
.setStyle(ButtonStyle.Primary)
.setDisabled(page === 1),
new ButtonBuilder()
.setCustomId('next_page')
.setLabel('Next')
.setStyle(ButtonStyle.Primary)
.setDisabled(page === maxPages),
);

await interaction.update({ embeds: [updatedEmbed], components: [updatedRow] });
});

collector.on('end', () => {
const disabledRow = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('prev_page')
.setLabel('Previous')
.setStyle(ButtonStyle.Primary)
.setDisabled(true),
new ButtonBuilder().setCustomId('next_page').setLabel('Next').setStyle(ButtonStyle.Primary).setDisabled(true),
);
message.edit({ components: [disabledRow] });
});
}
}

Expand Down
8 changes: 6 additions & 2 deletions commands/General/reminders.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class Reminders extends Command {
const collector = message.createMessageComponentCollector({
filter,
componentType: ComponentType.Button,
time: 60000,
time: 180000,
});

collector.on('collect', async (interaction) => {
Expand Down Expand Up @@ -146,7 +146,11 @@ class Reminders extends Command {
});

collector.on('end', () => {
message.edit({ components: [] });
const disabledRow = new ActionRowBuilder().addComponents(
new ButtonBuilder().setCustomId('prev').setLabel('Previous').setStyle(ButtonStyle.Primary).setDisabled(true),
new ButtonBuilder().setCustomId('next').setLabel('Next').setStyle(ButtonStyle.Primary).setDisabled(true),
);
message.edit({ components: [disabledRow] });
});

return;
Expand Down
75 changes: 73 additions & 2 deletions slash_commands/Economy/leaderboard.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
const {
SlashCommandBuilder,
EmbedBuilder,
ActionRowBuilder,
ButtonBuilder,
ButtonStyle,
ComponentType,
} = require('discord.js');
const { QuickDB } = require('quick.db');
const db = new QuickDB();

Expand Down Expand Up @@ -92,5 +99,69 @@ exports.run = async (interaction) => {
.setFooter({ text: `Page ${realPage} / ${maxPages}${userRankDisplay}` })
.setTimestamp();

return interaction.editReply({ embeds: [embed] });
const row = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('prev')
.setLabel('Previous')
.setStyle(ButtonStyle.Primary)
.setDisabled(realPage === 1),
new ButtonBuilder()
.setCustomId('next')
.setLabel('Next')
.setStyle(ButtonStyle.Primary)
.setDisabled(realPage === maxPages),
);

const message = await interaction.editReply({ embeds: [embed], components: [row] });

const filter = (i) => i.user.id === interaction.user.id;
const collector = message.createMessageComponentCollector({
filter,
componentType: ComponentType.Button,
time: 2147483647,
});

collector.on('collect', async (i) => {
if (i.customId === 'prev') {
realPage -= 1;
} else if (i.customId === 'next') {
realPage += 1;
}

displayedLeaderboard = sortedLeaderboard.slice((realPage - 1) * 10, realPage * 10);

const updatedEmbed = new EmbedBuilder()
.setColor(interaction.settings.embedColor)
.setTitle(`${interaction.guild.name}'s Leaderboard`)
.setAuthor({ name: interaction.user.tag, iconURL: interaction.user.displayAvatarURL() })
.setDescription(`${displayedLeaderboard.map((entry) => entry.display).join('\n') || 'None'}`)
.setFooter({ text: `Page ${realPage} / ${maxPages}${userRankDisplay}` })
.setTimestamp();

await i.update({
embeds: [updatedEmbed],
components: [
new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('prev')
.setLabel('Previous')
.setStyle(ButtonStyle.Primary)
.setDisabled(realPage === 1),
new ButtonBuilder()
.setCustomId('next')
.setLabel('Next')
.setStyle(ButtonStyle.Primary)
.setDisabled(realPage === maxPages),
),
],
});
});

collector.on('end', () => {
const disabledRow = new ActionRowBuilder().addComponents(
new ButtonBuilder().setCustomId('prev').setLabel('Previous').setStyle(ButtonStyle.Primary).setDisabled(true),
new ButtonBuilder().setCustomId('next').setLabel('Next').setStyle(ButtonStyle.Primary).setDisabled(true),
);
message.edit({ components: [disabledRow] });
});
};
2 changes: 1 addition & 1 deletion slash_commands/General/reminders.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ exports.run = async (interaction) => {
const collector = message.createMessageComponentCollector({
filter,
componentType: ComponentType.Button,
time: 60000,
time: 2147483647,
});

collector.on('collect', async (btnInteraction) => {
Expand Down

0 comments on commit 8604c98

Please sign in to comment.