From bdec09128e134238e3e0efdaa7cf6e7c46c19c94 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 4 Mar 2022 18:32:23 +0000 Subject: add leaderboards --- src/lib/utils.ts | 20 ++++++++ src/routes/leaderboard/[name].ts | 10 ++++ src/routes/leaderboard/index.ts | 8 ++++ src/routes/leaderboards/[name].svelte | 86 +++++++++++++++++++++++++++++++++++ src/routes/leaderboards/index.svelte | 54 ++++++++++++++++++++++ 5 files changed, 178 insertions(+) create mode 100644 src/routes/leaderboard/[name].ts create mode 100644 src/routes/leaderboard/index.ts create mode 100644 src/routes/leaderboards/[name].svelte create mode 100644 src/routes/leaderboards/index.svelte diff --git a/src/lib/utils.ts b/src/lib/utils.ts index c581af0..aabd981 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -114,6 +114,13 @@ export function cleanId(id: string) { .replace(/_/g, ' ') } +export function toTitleCase(s: string) { + return s.replace( + /\w\S*/g, + w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase() + ) +} + export function toRomanNumerals(number: number) { return ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'][number] } @@ -151,4 +158,17 @@ export function formatNumber(n: number, digits = 3) { ] const item = numberSymbolsLookup.slice().reverse().find(item => n >= item.value) return (n / (item?.value ?? 1)).toPrecision(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + (item?.symbol ?? '') +} + +export function formatNumberFromUnit(n: number, unit: null | 'date' | 'time' | string) { + switch (unit) { + case null: + return n.toLocaleString() + case 'date': + return (new Date(n * 1000)).toUTCString() + case 'time': + return millisecondsToTime(Math.abs(n)) + default: + return `${n.toLocaleString()} ${unit}` + } } \ No newline at end of file diff --git a/src/routes/leaderboard/[name].ts b/src/routes/leaderboard/[name].ts new file mode 100644 index 0000000..fac1ee9 --- /dev/null +++ b/src/routes/leaderboard/[name].ts @@ -0,0 +1,10 @@ +// The route /leaderboard/ was moved to /leaderboards/ for +// consistency. +export async function get({ params }) { + return { + status: 303, + headers: { + location: `/leaderboards/${params.name}` + } + } +} diff --git a/src/routes/leaderboard/index.ts b/src/routes/leaderboard/index.ts new file mode 100644 index 0000000..beda8d6 --- /dev/null +++ b/src/routes/leaderboard/index.ts @@ -0,0 +1,8 @@ +export async function get({ request }) { + return { + status: 303, + headers: { + location: '/leaderboards' + } + } +} diff --git a/src/routes/leaderboards/[name].svelte b/src/routes/leaderboards/[name].svelte new file mode 100644 index 0000000..2aec4b3 --- /dev/null +++ b/src/routes/leaderboards/[name].svelte @@ -0,0 +1,86 @@ + + + + + +
+ +
+

+ {#if imageUrl} + {cleanId(data.name.slice(11))} + {/if} + {toTitleCase(cleanId(data.name))} +

+ {#if data.info} +

{data.info}

+ {/if} + +
    + {#each data.list as leaderboardItem} +
  1. + + {formatNumberFromUnit( + leaderboardItem.value, + leaderboardItem.unit ?? cleanId(data.name).toLowerCase() + )} + + {#if leaderboardItem.player} + + {:else if leaderboardItem.players} + {#each leaderboardItem.players as player} + + + + {/each} + {:else} + Unknown player + {/if} +
  2. + {/each} +
+
+ + diff --git a/src/routes/leaderboards/index.svelte b/src/routes/leaderboards/index.svelte new file mode 100644 index 0000000..b6815e5 --- /dev/null +++ b/src/routes/leaderboards/index.svelte @@ -0,0 +1,54 @@ + + + + + +
+ +
+ + + {#each Object.entries(data) as [category, leaderboards]} +
+ +
    + {#each leaderboards as leaderboard} + {@const imageUrl = leaderboard.startsWith('collection_') + ? skyblockItemToUrl(leaderboard.slice(11)) + : null} + {#if imageUrl} + + {cleanId(leaderboard)} + + {:else} +
  • {cleanId(leaderboard)}
  • + {/if} + {/each} +
+
+
+ {/each} +
-- cgit