From 07c27ffaaad5b2238fa933c2c433e704b1e13399 Mon Sep 17 00:00:00 2001 From: voidarc Date: Sun, 5 Jul 2026 13:28:23 +0100 Subject: [PATCH] player view donesies (vibe coding might be insane) --- src/lib/server/databaseManager.ts | 75 ++++++++++ .../api/playerEvents/[playerId]/+server.ts | 20 +++ .../stats/player/[playerId]/+page.server.ts | 16 +-- .../stats/player/[playerId]/+page.svelte | 131 ++++++++++++++---- 4 files changed, 207 insertions(+), 35 deletions(-) create mode 100644 src/routes/api/playerEvents/[playerId]/+server.ts diff --git a/src/lib/server/databaseManager.ts b/src/lib/server/databaseManager.ts index 0c01b01..8544a27 100644 --- a/src/lib/server/databaseManager.ts +++ b/src/lib/server/databaseManager.ts @@ -230,6 +230,81 @@ export async function getRegisteredEventsWithPlayers(eventId?: number) { return fullEventList; } +export async function getPlayerEvents(playerId: number) { + const registrations = await getPlayerRegistrations(playerId); + if (registrations.length === 0) return []; + + const events = await Promise.all( + registrations.map(async (reg) => { + const [event] = await db + .select() + .from(schema.registeredEventsView) + .where(eq(schema.registeredEventsView.eventId, reg.eventId)); + + if (!event) return null; + + let awardedPoints = 0; + if (event.scorePreset && reg.placement > 0) { + const [pointsRow] = await db + .select() + .from(schema.scoringPresets) + .where( + and( + eq(schema.scoringPresets.presetID, event.scorePreset), + eq(schema.scoringPresets.placement, reg.placement) + ) + ); + if (pointsRow) awardedPoints = pointsRow.points; + } + + const results = await db + .select() + .from(schema.registeredResults) + .where(eq(schema.registeredResults.registeredPlayerId, reg.registeredPlayerId)); + + let winnerInfo: { name: string; color: string; points: number } | null = null; + if (event.winner) { + const teamData = await getTeams(event.winner); + winnerInfo = teamData.teams[0] || null; + } + + let unit = ''; + if (event.resultPreset) { + const { resultPresets } = await getResultPreset(event.resultPreset); + if (resultPresets.length > 0) { + unit = resultPresets[0].unit; + } + } + + return { + id: reg.eventId, + name: reg.eventName, + division: event.division, + state: event.state, + completed: event.timeCompleted || 0, + winner: winnerInfo, + bracket: reg.bracket, + placement: reg.placement, + points: awardedPoints, + unit, + results: results.map((r) => ({ + index: r.resultIndex, + result: r.result + })) + }; + }) + ); + + return events + .filter((e) => e !== null) + .sort((a, b) => { + if (a.completed && b.completed) return b.completed - a.completed; + if (a.completed) return -1; + if (b.completed) return 1; + return b.id - a.id; + }); +} + export async function getLedgerEntries(limit: number | 'all' = 100) { let query = db .select({ diff --git a/src/routes/api/playerEvents/[playerId]/+server.ts b/src/routes/api/playerEvents/[playerId]/+server.ts new file mode 100644 index 0000000..0451737 --- /dev/null +++ b/src/routes/api/playerEvents/[playerId]/+server.ts @@ -0,0 +1,20 @@ +import { getPlayerEvents } from '$lib/server/databaseManager'; +import { globalEmitter } from '$lib/server/globalEmitter'; +import { generateEndpoint } from '$lib/server/endpoint'; + +export async function GET({ params, request }) { + const playerId = parseInt(params.playerId); + const endpoint = generateEndpoint(async (enqueue) => { + let eventList = async () => { + let events = await getPlayerEvents(playerId); + enqueue(events); + }; + eventList(); + globalEmitter.on('eventUpdate', eventList); + + return () => { + globalEmitter.off('eventUpdate', eventList); + }; + }, request); + return (await endpoint).response; +} diff --git a/src/routes/stats/player/[playerId]/+page.server.ts b/src/routes/stats/player/[playerId]/+page.server.ts index bfe6dd4..1836982 100644 --- a/src/routes/stats/player/[playerId]/+page.server.ts +++ b/src/routes/stats/player/[playerId]/+page.server.ts @@ -1,14 +1,14 @@ -import { getPlayerInfo } from '$lib/server/databaseManager'; +import { getPlayerInfo, getPlayerEvents } from '$lib/server/databaseManager'; import type { PageServerLoad } from './$types'; -// export const load: PageServerLoad = async ({ params }) => { -// return { -// data: await getPlayerInfo(parseInt(params.playerId)) -// }; -// }; - export const load: PageServerLoad = async ({ params }) => { + const playerId = parseInt(params.playerId); + const [playerInfo, playerEvents] = await Promise.all([ + getPlayerInfo(playerId), + getPlayerEvents(playerId) + ]); return { - playerInfo: getPlayerInfo(parseInt(params.playerId)) + playerInfo, + playerEvents }; }; diff --git a/src/routes/stats/player/[playerId]/+page.svelte b/src/routes/stats/player/[playerId]/+page.svelte index e6ff680..2215539 100644 --- a/src/routes/stats/player/[playerId]/+page.svelte +++ b/src/routes/stats/player/[playerId]/+page.svelte @@ -1,7 +1,29 @@ -{#await data.playerInfo} -
Loading...
-{:then playerInfo} -
-
-
- -
- {playerInfo.firstName} - {playerInfo.lastName} -
+
+
+ +
+
+ {playerInfo.firstName} {playerInfo.lastName} +
+
+ {playerInfo.teamInfo.name}
-{/await} \ No newline at end of file + + + +
+
+ {#each playerEvents as event (event.id)} +
+
+ {event.name} + {event.division} + {#if event.state == 1} + ONGOING + {:else if event.state == 2} + Won By {event.winner?.name ?? '?'} + {/if} +
+
+
+ {event.bracket} + {#if event.placement > 0} +
+ placed + {ordinal(event.placement)} +
+
+ {event.points} + pts +
+ {:else} + Unranked + {/if} +
+ {#if event.results.length > 0} +
+ {#each event.results as score, i} + {i > 0 ? ' ยท ' : ''}Run {score.index + 1}: {score.result}{event.unit} + {/each} +
+ {/if} +
+
+ {/each} +
+
+