forked from syntaxbullet/AuroraBot-discord
72 lines
1.8 KiB
TypeScript
72 lines
1.8 KiB
TypeScript
import { EmbedBuilder } from "discord.js";
|
|
|
|
/**
|
|
* User data for leaderboard display
|
|
*/
|
|
interface LeaderboardUser {
|
|
username: string;
|
|
level: number | null;
|
|
xp: bigint | null;
|
|
balance: bigint | null;
|
|
netWorth?: bigint | null;
|
|
}
|
|
|
|
/**
|
|
* Returns the appropriate medal emoji for a ranking position
|
|
*/
|
|
function getMedalEmoji(index: number): string {
|
|
if (index === 0) return "🥇";
|
|
if (index === 1) return "🥈";
|
|
if (index === 2) return "🥉";
|
|
return `${index + 1}.`;
|
|
}
|
|
|
|
/**
|
|
* Formats a single leaderboard entry based on type
|
|
*/
|
|
function formatLeaderEntry(user: LeaderboardUser, index: number, type: 'xp' | 'balance' | 'networth'): string {
|
|
const medal = getMedalEmoji(index);
|
|
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, Balance or Net Worth rankings
|
|
*/
|
|
export function getLeaderboardEmbed(leaders: LeaderboardUser[], type: 'xp' | 'balance' | 'networth'): EmbedBuilder {
|
|
const description = leaders.map((user, index) =>
|
|
formatLeaderEntry(user, index, type)
|
|
).join("\n");
|
|
|
|
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)
|
|
.setDescription(description)
|
|
.setColor(0xFFD700); // Gold
|
|
}
|