Two teams try and fill in any horizontal, vertical, or diagonal line on a bingo board by playing maps on osu! osu.bingo
osu
at microservice 78 lines 2.3 kB view raw
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};