feat: Implement a net worth leaderboard by aggregating user balance and inventory item values.
This commit is contained in:
@@ -8,6 +8,7 @@ interface LeaderboardUser {
|
||||
level: number | null;
|
||||
xp: bigint | null;
|
||||
balance: bigint | null;
|
||||
netWorth?: bigint | null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -23,23 +24,45 @@ function getMedalEmoji(index: number): string {
|
||||
/**
|
||||
* Formats a single leaderboard entry based on type
|
||||
*/
|
||||
function formatLeaderEntry(user: LeaderboardUser, index: number, type: 'xp' | 'balance'): string {
|
||||
function formatLeaderEntry(user: LeaderboardUser, index: number, type: 'xp' | 'balance' | 'networth'): string {
|
||||
const medal = getMedalEmoji(index);
|
||||
const value = type === 'xp'
|
||||
? `Lvl ${user.level ?? 1} (${user.xp ?? 0n} XP)`
|
||||
: `${user.balance ?? 0n} 🪙`;
|
||||
let value = '';
|
||||
|
||||
switch (type) {
|
||||
case 'xp':
|
||||
value = `Lvl ${user.level ?? 1} (${user.xp ?? 0n} XP)`;
|
||||
break;
|
||||
case 'balance':
|
||||
value = `${user.balance ?? 0n} 🪙`;
|
||||
break;
|
||||
case 'networth':
|
||||
value = `${user.netWorth ?? 0n} 🪙 (Net Worth)`;
|
||||
break;
|
||||
}
|
||||
|
||||
return `${medal} **${user.username}** — ${value}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a leaderboard embed for either XP or Balance rankings
|
||||
* Creates a leaderboard embed for either XP, Balance or Net Worth rankings
|
||||
*/
|
||||
export function getLeaderboardEmbed(leaders: LeaderboardUser[], type: 'xp' | 'balance'): EmbedBuilder {
|
||||
export function getLeaderboardEmbed(leaders: LeaderboardUser[], type: 'xp' | 'balance' | 'networth'): EmbedBuilder {
|
||||
const description = leaders.map((user, index) =>
|
||||
formatLeaderEntry(user, index, type)
|
||||
).join("\n");
|
||||
|
||||
const title = type === 'xp' ? "🏆 XP Leaderboard" : "💰 Richest Players";
|
||||
let title = '';
|
||||
switch (type) {
|
||||
case 'xp':
|
||||
title = "🏆 XP Leaderboard";
|
||||
break;
|
||||
case 'balance':
|
||||
title = "💰 Richest Players";
|
||||
break;
|
||||
case 'networth':
|
||||
title = "💎 Net Worth Leaderboard";
|
||||
break;
|
||||
}
|
||||
|
||||
return new EmbedBuilder()
|
||||
.setTitle(title)
|
||||
|
||||
Reference in New Issue
Block a user