diff --git a/app/api/games/route.ts b/app/api/games/route.ts index 21a3cf6..60c4c3c 100644 --- a/app/api/games/route.ts +++ b/app/api/games/route.ts @@ -20,6 +20,14 @@ export async function POST(req: NextRequest) { won: boolean; }; + const userExists = await prisma.user.findUnique({ + where: { id: session.user.id }, + select: { id: true }, + }); + if (!userExists) { + return NextResponse.json({ error: "Utilisateur introuvable" }, { status: 401 }); + } + const game = await prisma.game.create({ data: { userId: session.user.id, diff --git a/app/api/rooms/[code]/route.ts b/app/api/rooms/[code]/route.ts index e0d5203..7891f51 100644 --- a/app/api/rooms/[code]/route.ts +++ b/app/api/rooms/[code]/route.ts @@ -69,7 +69,10 @@ function calcPlayerPoints(player: Player, room: Room): number { let timePts: number; if (room.timeLimit > 0) { const timeLeft = room.timeLimit * 1000 - elapsed; - timePts = Math.max(0, Math.floor((timeLeft / (room.timeLimit * 1000)) * 10)); + timePts = Math.max( + 0, + Math.floor((timeLeft / (room.timeLimit * 1000)) * 10), + ); } else { timePts = Math.max(0, 10 - Math.floor(elapsed / 30000)); } @@ -355,7 +358,10 @@ export async function PATCH( case "setGameMode": { const host = room.players.find((p) => p.id === playerId); if (!host?.isHost) { - return Response.json({ error: "Seul l'hôte peut modifier ce paramètre" }, { status: 403 }); + return Response.json( + { error: "Seul l'hôte peut modifier ce paramètre" }, + { status: 403 }, + ); } if (value === "race" || value === "all_finish") { room.gameMode = value; @@ -364,18 +370,38 @@ export async function PATCH( return Response.json({ room }); } + // Hôte change le nombre de manches + case "setTotalRounds": { + const host = room.players.find((p) => p.id === playerId); + if (!host?.isHost) { + return Response.json( + { error: "Seul l'hôte peut modifier ce paramètre" }, + { status: 403 }, + ); + } + if (typeof value === "number") { + room.totalRounds = Math.min(Math.max(Math.floor(value), 1), 10); + await saveRoom(room); + } + return Response.json({ room }); + } + // Hôte change la limite de temps case "setTimeLimit": { const host = room.players.find((p) => p.id === playerId); if (!host?.isHost) { - return Response.json({ error: "Seul l'hôte peut modifier ce paramètre" }, { status: 403 }); + return Response.json( + { error: "Seul l'hôte peut modifier ce paramètre" }, + { status: 403 }, + ); } - room.timeLimit = typeof value === "number" ? Math.max(0, Math.floor(value)) : 0; + room.timeLimit = + typeof value === "number" ? Math.max(0, Math.floor(value)) : 0; await saveRoom(room); return Response.json({ room }); } - // Fin du temps imparti — déclenché par le client qui détecte l'expiration + // Fin du temps imparti - déclenché par le client qui détecte l'expiration case "timeUp": { if (room.phase !== "playing") { return Response.json({ room }); diff --git a/app/components/ArticleView.tsx b/app/components/ArticleView.tsx index 17c8456..57896b9 100644 --- a/app/components/ArticleView.tsx +++ b/app/components/ArticleView.tsx @@ -24,9 +24,7 @@ const FORBIDDEN_NAMESPACES = [ "WP:", ]; -const REMOVED_SECTION_IDS = [ - "Liens_externes", -]; +const REMOVED_SECTION_IDS = ["Liens_externes"]; function getHeadingId(el: Element): string { // Nouvelle structure Wikipedia :

@@ -72,7 +70,7 @@ function cleanWikiHtml(container: HTMLElement): void { } }); - // Supprimer les sections indésirables — supporte ancienne et nouvelle structure Wikipedia + // Supprimer les sections indésirables - supporte ancienne et nouvelle structure Wikipedia // Nouvelle :
/ Ancienne :

const headingSelectors = "h2, h3, .mw-heading"; container.querySelectorAll(headingSelectors).forEach((heading) => { diff --git a/app/components/LobbyScreen.tsx b/app/components/LobbyScreen.tsx index 54de24f..271c8e8 100644 --- a/app/components/LobbyScreen.tsx +++ b/app/components/LobbyScreen.tsx @@ -19,6 +19,7 @@ type LobbyScreenProps = { gameMode: Room["gameMode"]; setGameMode: (v: Room["gameMode"]) => void; onSetGameMode: (v: Room["gameMode"]) => void; + onSetTotalRounds: (v: number) => void; onSetSearchAllowed: (v: boolean) => void; onSetTimeLimit: (v: number) => void; }; @@ -39,6 +40,7 @@ export function LobbyScreen({ gameMode, setGameMode, onSetGameMode, + onSetTotalRounds, onSetSearchAllowed, onSetTimeLimit, }: LobbyScreenProps) { @@ -180,8 +182,8 @@ export function LobbyScreen({
Manches