From d482b8673b11e14cf081e531d2b4c7bdff33317d Mon Sep 17 00:00:00 2001 From: Ayden Jahola Date: Thu, 5 Sep 2024 20:10:04 +0100 Subject: [PATCH] Leaderboard: update leaderboard to display users server name rather than discord username, and add their avatar --- commands/fun/leaderboard.js | 59 ++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/commands/fun/leaderboard.js b/commands/fun/leaderboard.js index 00e29ad..5666bfb 100644 --- a/commands/fun/leaderboard.js +++ b/commands/fun/leaderboard.js @@ -10,25 +10,64 @@ module.exports = { const guild = interaction.guild; try { + // Fetch top 10 leaderboard entries sorted by correct answers const scores = await Leaderboard.find() .sort({ correctAnswers: -1 }) .limit(10); + // Fetch display names and avatars for each leaderboard entry + const leaderboardEntries = await Promise.all( + scores.map(async (entry, index) => { + try { + const member = await guild.members.fetch(entry.userId); + const displayName = member ? member.displayName : entry.username; // Fallback if member not found + const avatarUrl = member.user.displayAvatarURL({ + dynamic: true, + size: 32, + }); // Get avatar URL + + return { + position: index + 1, + name: displayName, + correctAnswers: entry.correctAnswers, + gamesPlayed: entry.gamesPlayed, + avatarUrl: avatarUrl, + }; + } catch (error) { + console.error( + `Error fetching member for userId: ${entry.userId}`, + error + ); + return { + position: index + 1, + name: entry.username, + correctAnswers: entry.correctAnswers, + gamesPlayed: entry.gamesPlayed, + avatarUrl: null, // No avatar in case of error + }; + } + }) + ); + const leaderboardEmbed = new EmbedBuilder() .setColor("#0099ff") .setTitle("Trivia Leaderboard") - .setDescription( - scores - .map( - (entry, index) => - `${index + 1}. ${entry.username}: ${ - entry.correctAnswers - } correct answers in ${entry.gamesPlayed} games` - ) - .join("\n") - ) .setTimestamp(); + // Add each leaderboard entry with avatar as a thumbnail + leaderboardEntries.forEach((entry) => { + const fieldValue = `${entry.correctAnswers} correct answers in ${entry.gamesPlayed} games`; + + leaderboardEmbed.addFields({ + name: `${entry.position}. ${entry.name}`, + value: fieldValue, + inline: false, + }); + + // Use the avatar URL as a thumbnail for each user entry + leaderboardEmbed.setThumbnail(entry.avatarUrl || null); + }); + if (guild.iconURL()) { leaderboardEmbed.setFooter({ text: guild.name,