Two teams try and fill in any horizontal, vertical, or diagonal line on a bingo board by playing maps on osu!
osu.bingo
osu
1import { redirect, type Handle } from '@sveltejs/kit';
2import * as jose from 'jose';
3import { env } from '$env/dynamic/private';
4import q from '$lib/drizzle/queries';
5import { StatusCodes } from '$lib/StatusCodes';
6import { logger } from '$lib/logger';
7
8// Start Polling
9import { tokens, events } from '$lib/server/polling';
10import { setup as startWatch } from '$lib/server/game/watch';
11tokens.setup();
12events.setup();
13startWatch();
14
15// Connect Services
16import { connect as connectBancho } from '$lib/server/bancho';
17import { connect as connectRabbit } from '$lib/server/rabbit';
18connectBancho();
19connectRabbit();
20
21q.deleteUnstartedGames();
22
23const jwt_secret = new TextEncoder().encode(env.JWT_SECRET);
24
25// Request Handler (Run before every request)
26export const handle: Handle = async ({ event, resolve }) => {
27 const sessionToken = event.cookies.get('osu_bingo_token');
28
29 // Redirect to game page
30 if (event.route.id == null) {
31 const match = event.url.pathname.match(/^\/(?:\D{4})$/g);
32 if (match != null) {
33 const link = match[0].slice(1, 5);
34 const gameId = await q.gameLinkToId(link);
35 if (gameId != null) {
36 redirect(StatusCodes.TEMPORARY_REDIRECT, `/game/${gameId.split('_')[1]}?code=${link}`);
37 }
38 }
39 }
40
41 // Login Stuff
42 if (sessionToken) {
43 try {
44 const { payload } = await jose.jwtVerify(sessionToken, jwt_secret);
45 const userId = payload.user_id;
46 if (!userId || typeof userId != 'number') throw 'No User ID in token';
47
48 // Get user from database
49 const user = await q.getUserFromSessionToken(sessionToken);
50
51 if (!user || user.id != userId) throw 'Session is invalid!';
52
53 event.locals.user = user;
54 } catch (error) {
55 logger.error(error as string, { type: 'invalid_session' });
56 event.cookies.delete('osu_bingo_token', { path: '/' });
57 }
58 }
59
60 const resolved = await resolve(event);
61
62 // Turn searchParams into a javascript object
63 const params = Array.from(event.url.searchParams.entries()).reduce(
64 (a, [k, v]) => ({ ...a, [k]: v }),
65 {}
66 );
67 const user = event.locals.user?.username;
68 logger.log('http', `${resolved.status} ${event.request.method} ${event.url.pathname}`, {
69 type: 'http_log',
70 user,
71 params,
72 path: event.url.pathname,
73 method: event.request.method,
74 status: resolved.status
75 });
76
77 return resolved;
78};