From ce08329b2dacc15aa84717e0de0bdf780bfa9ef1 Mon Sep 17 00:00:00 2001 From: whidix Date: Fri, 6 Mar 2026 19:34:46 +0100 Subject: [PATCH] feat: add friends' results display for today's game --- src/routes/(game)/daily/+page.server.ts | 65 +++++++++++++++++++++++-- src/routes/(game)/daily/+page.svelte | 29 +++++++++++ 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/routes/(game)/daily/+page.server.ts b/src/routes/(game)/daily/+page.server.ts index a31862d..26d52b6 100644 --- a/src/routes/(game)/daily/+page.server.ts +++ b/src/routes/(game)/daily/+page.server.ts @@ -1,10 +1,10 @@ import { error } from '@sveltejs/kit'; import { db } from '$lib/server/db'; -import { config } from '$lib/server/db/schema'; -import { getDailyModeCharacters, getOrCreateTodayCharacter, getYesterdayCharacter, getTodayCharacterWinsCount } from '$lib/server/daily-character'; -import { like } from 'drizzle-orm'; +import { characterHistory, config, friendship, user, userCharacterHistory } from '$lib/server/db/schema'; +import { getDailyModeCharacters, getOrCreateTodayCharacter, getYesterdayCharacter, getTodayCharacterWinsCount, getDateKey } from '$lib/server/daily-character'; +import { and, eq, inArray, like, or } from 'drizzle-orm'; -export async function load() { +export async function load(event) { const characters = await getDailyModeCharacters(); const dailyCharacter = await getOrCreateTodayCharacter(characters); @@ -17,6 +17,60 @@ export async function load() { // Load the win count for today const winCount = await getTodayCharacterWinsCount(dailyCharacter.id); + let friendsTodayResults: Array<{ userId: string; name: string; image: string | null; tryCount: number }> = []; + + if (event.locals.user) { + const currentUserId = event.locals.user.id; + + const acceptedFriendships = await db + .select({ + requesterId: friendship.requesterId, + addresseeId: friendship.addresseeId + }) + .from(friendship) + .where( + and( + eq(friendship.status, 'accepted'), + or(eq(friendship.requesterId, currentUserId), eq(friendship.addresseeId, currentUserId)) + ) + ); + + const friendIds = acceptedFriendships.map((relation) => + relation.requesterId === currentUserId ? relation.addresseeId : relation.requesterId + ); + + if (friendIds.length > 0) { + const todayDate = getDateKey(new Date()); + + const [todayHistoryEntry] = await db + .select({ id: characterHistory.id }) + .from(characterHistory) + .where(eq(characterHistory.date, todayDate)) + .limit(1); + + const todayCharacterHistoryId = todayHistoryEntry?.id; + + if (todayCharacterHistoryId) { + friendsTodayResults = await db + .select({ + userId: user.id, + name: user.name, + image: user.image, + tryCount: userCharacterHistory.tryCount + }) + .from(userCharacterHistory) + .innerJoin(user, eq(userCharacterHistory.userId, user.id)) + .where( + and( + eq(userCharacterHistory.characterHistoryId, todayCharacterHistoryId), + inArray(userCharacterHistory.userId, friendIds) + ) + ) + .orderBy(userCharacterHistory.tryCount); + } + } + } + // Load column visibility config const columnConfig = await db .select() @@ -37,6 +91,7 @@ export async function load() { dailyCharacter, yesterdayCharacter, columnVisibility, - winCount + winCount, + friendsTodayResults }; } diff --git a/src/routes/(game)/daily/+page.svelte b/src/routes/(game)/daily/+page.svelte index f188fbb..0451d12 100644 --- a/src/routes/(game)/daily/+page.svelte +++ b/src/routes/(game)/daily/+page.svelte @@ -258,6 +258,35 @@ {columnVisibility} /> + {#if data.friendsTodayResults && data.friendsTodayResults.length > 0} +
+

Tes amis aujourd'hui

+
+ {#each data.friendsTodayResults as friendResult} +
+
+ {#if friendResult.image} + {friendResult.name} + {:else} +
+ {friendResult.name?.charAt(0).toUpperCase() || 'U'} +
+ {/if} +

{friendResult.name}

+
+

+ {friendResult.tryCount} {friendResult.tryCount > 1 ? 'coups' : 'coup'} +

+
+ {/each} +
+
+ {/if} +