diff options
Diffstat (limited to 'src')
31 files changed, 269 insertions, 374 deletions
diff --git a/src/app.d.ts b/src/app.d.ts index b41fa6f..9f4467d 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -3,10 +3,13 @@ // // See https://kit.svelte.dev/docs/typescript // // for information about these interfaces declare namespace App { + // interface Error { } + interface Locals { sid: string | undefined } + // interface PageData { } interface Platform { env: { @@ -18,9 +21,4 @@ declare namespace App { } } - interface Session { - sid: string | undefined - } - - // interface Stuff {} } diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..0d2087b --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,7 @@ +import type { Handle } from '@sveltejs/kit' + +export const handle = (async ({ event, resolve }) => { + event.locals.sid = event.cookies.get('sid') + const response = await resolve(event) + return response +}) satisfies Handle
\ No newline at end of file diff --git a/src/hooks.ts b/src/hooks.ts deleted file mode 100644 index 457e8ae..0000000 --- a/src/hooks.ts +++ /dev/null @@ -1,25 +0,0 @@ -import cookie from 'cookie' -import type { Handle } from '@sveltejs/kit' - - -export const handle: Handle = async ({ event, resolve }) => { - const cookies = cookie.parse(event.request.headers.get('cookie') || '') - - event.locals.sid = cookies.sid - - const response = await resolve(event) - - return response -} - -export const getSession: GetSession = async ({ locals }) => { - return { - sid: locals.sid - } -} - -// export const externalFetch: ExternalFetch = async (request) => { -// const response = await fetch(request) - -// return response -// }
\ No newline at end of file diff --git a/src/lib/LoginButton.svelte b/src/lib/LoginButton.svelte index bba078e..7ebf5d7 100644 --- a/src/lib/LoginButton.svelte +++ b/src/lib/LoginButton.svelte @@ -6,7 +6,7 @@ {#if loggedIn} <a href="/profile"><button class="login-button">Edit profile</button></a> {:else} - <a href="/login"> + <a href="/login" rel="external"> <button class="login-button" ><img src="/discord-mark-light.svg" alt="Discord logo" />Log in with Discord</button > diff --git a/src/lib/MayorSkin.svelte b/src/lib/MayorSkin.svelte index ad0a9a8..2360fab 100644 --- a/src/lib/MayorSkin.svelte +++ b/src/lib/MayorSkin.svelte @@ -23,14 +23,21 @@ faith: '64b39d0756b92b8b7599d1f971580088954e21c5f60c673d0d4f63693fb002b5', } - let url: string + let url: string | undefined $: { if (name.toLowerCase() === 'derpy') url = '/villager.png' - else url = `https://mc-heads.net/body/${skinIds[name.toLowerCase()]}` + else { + const skinId = skinIds[name.toLowerCase()] + url = skinId ? `https://mc-heads.net/body/${skinId}` : undefined + } } </script> -<img src={url} alt="Mayor {toTitleCase(name)}" /> +{#if url} + <img src={url} alt="Mayor {toTitleCase(name)}" /> +{:else} + <div class="no-skin-found">Unknown mayor</div> +{/if} <style> img { @@ -39,4 +46,12 @@ height: 12em; margin: 0 auto; } + + .no-skin-found { + display: flex; + align-items: center; + justify-content: center; + height: 12em; + margin: 0 auto; + } </style> diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts new file mode 100644 index 0000000..4596c1b --- /dev/null +++ b/src/routes/+page.server.ts @@ -0,0 +1,7 @@ +import type { ServerLoad } from '@sveltejs/kit' + +export const load = (({ locals }) => { + return { + loggedIn: locals.sid !== undefined, + } +}) satisfies ServerLoad diff --git a/src/routes/+page.ts b/src/routes/+page.ts deleted file mode 100644 index cd45f69..0000000 --- a/src/routes/+page.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { PageData } from './$types' - -export const load = (({ session }) => { - return { - loggedIn: session.sid !== undefined, - } -}) satisfies PageData diff --git a/src/routes/[player=username]/+page.ts b/src/routes/[player=username]/+page.ts index c846929..289cd48 100644 --- a/src/routes/[player=username]/+page.ts +++ b/src/routes/[player=username]/+page.ts @@ -1,11 +1,6 @@ +import { redirect } from '@sveltejs/kit' import type { PageLoad } from './$types' - -export const get = (({ params }) => { - return { - status: 303, - headers: { - location: `/player/${params.player}` - } - } +export const load = (({ params }) => { + throw redirect(303, `/player/${params.player}`) }) satisfies PageLoad
\ No newline at end of file diff --git a/src/routes/auctionprices/+page.ts b/src/routes/auctionprices/+page.ts index 8166a3c..31af8e3 100644 --- a/src/routes/auctionprices/+page.ts +++ b/src/routes/auctionprices/+page.ts @@ -1,4 +1,4 @@ -import type { PageData } from './$types' +import type { PageLoad } from './$types' import { fetchApi } from '$lib/api' export const load = (async ({ fetch }) => { @@ -10,4 +10,4 @@ export const load = (async ({ fetch }) => { prices, items, } -}) satisfies PageData +}) satisfies PageLoad diff --git a/src/routes/election/+page.svelte b/src/routes/election/+page.svelte index 1754655..dc4719e 100644 --- a/src/routes/election/+page.svelte +++ b/src/routes/election/+page.svelte @@ -1,20 +1,3 @@ -<script lang="ts" context="module"> - import type { Load } from '@sveltejs/kit' - import { fetchApi } from '$lib/api' - - export const load: Load = async ({ params, fetch }) => { - const data = await fetchApi(`election?t=${Math.floor(Date.now() / 1000)}`, fetch).then(r => - r.json() - ) - - return { - props: { - data, - }, - } - } -</script> - <script lang="ts"> import Header from '$lib/Header.svelte' import Head from '$lib/Head.svelte' diff --git a/src/routes/election/+page.ts b/src/routes/election/+page.ts new file mode 100644 index 0000000..e41087d --- /dev/null +++ b/src/routes/election/+page.ts @@ -0,0 +1,8 @@ +import { fetchApi } from '$lib/api' +import type { PageLoad } from './$types' + +export const load = (async ({ fetch }) => { + return await fetchApi(`election?t=${Math.floor(Date.now() / 1000)}`, fetch).then(r => + r.json() + ) +}) satisfies PageLoad diff --git a/src/routes/items/+page.svelte b/src/routes/items/+page.svelte index 82b3ee3..e378bdf 100644 --- a/src/routes/items/+page.svelte +++ b/src/routes/items/+page.svelte @@ -1,18 +1,3 @@ -<script lang="ts" context="module"> - import type { Load } from '@sveltejs/kit' - import { fetchApi } from '$lib/api' - - export const load: Load = async ({ params, fetch }) => { - const data = await fetchApi(`items`, fetch).then(r => r.json()) - - return { - props: { - data, - }, - } - } -</script> - <script lang="ts"> import Header from '$lib/Header.svelte' import Head from '$lib/Head.svelte' diff --git a/src/routes/items/+page.ts b/src/routes/items/+page.ts new file mode 100644 index 0000000..e5bb249 --- /dev/null +++ b/src/routes/items/+page.ts @@ -0,0 +1,6 @@ +import { fetchApi } from '$lib/api' +import type { PageLoad } from './$types' + +export const load = (async ({ fetch }) => { + return await fetchApi(`items`, fetch).then(r => r.json()) +}) satisfies PageLoad diff --git a/src/routes/leaderboard/+page.ts b/src/routes/leaderboard/+page.ts index 871f4bc..68f69ac 100644 --- a/src/routes/leaderboard/+page.ts +++ b/src/routes/leaderboard/+page.ts @@ -1,10 +1,6 @@ +import { redirect } from '@sveltejs/kit' import type { PageLoad } from './$types' export const load = (() => { - return { - status: 303, - headers: { - location: '/leaderboards' - } - } + throw redirect(303, '/leaderboards') }) satisfies PageLoad diff --git a/src/routes/leaderboard/[name]/+page.ts b/src/routes/leaderboard/[name]/+page.ts index c4b668e..8de4334 100644 --- a/src/routes/leaderboard/[name]/+page.ts +++ b/src/routes/leaderboard/[name]/+page.ts @@ -1,12 +1,8 @@ +import { redirect } from '@sveltejs/kit' import type { PageLoad } from './$types' // The route /leaderboard/<name> was moved to /leaderboards/<name> for // consistency. export const get = (({ params }) => { - return { - status: 303, - headers: { - location: `/leaderboards/${params.name}` - } - } + throw redirect(303, `/leaderboards/${params.name}`) }) satisfies PageLoad diff --git a/src/routes/leaderboards/+page.ts b/src/routes/leaderboards/+page.ts index d5a8480..f28ac79 100644 --- a/src/routes/leaderboards/+page.ts +++ b/src/routes/leaderboards/+page.ts @@ -1,6 +1,6 @@ -import type { PageData } from './$types' +import type { PageLoad } from './$types' import { fetchApi } from '$lib/api' export const load = (async ({ fetch }) => { return await fetchApi(`leaderboards`, fetch).then(r => r.json()) -}) satisfies PageData +}) satisfies PageLoad diff --git a/src/routes/leaderboards/[name]/+page.ts b/src/routes/leaderboards/[name]/+page.ts index 78f3f6b..735be61 100644 --- a/src/routes/leaderboards/[name]/+page.ts +++ b/src/routes/leaderboards/[name]/+page.ts @@ -1,16 +1,13 @@ -import type { PageData } from './$types' +import type { PageLoad } from './$types' import { fetchApi } from '$lib/api' +import { error } from '@sveltejs/kit' export const load = (async ({ params, fetch }) => { const dataText = await fetchApi(`leaderboards/${params.name}`, fetch).then(r => r.text()) const data = JSON.parse(dataText) - if (data.list.length === 0) return { status: 404, error: 'Unknown leaderboard' } + if (data.list.length === 0) throw error(404, 'Unknown leaderboard') - return { - props: { - data, - }, - } as any -}) satisfies PageData + return data +}) satisfies PageLoad diff --git a/src/routes/loggedin/+page.ts b/src/routes/loggedin/+server.ts index 9ae28ef..4772cf6 100644 --- a/src/routes/loggedin/+page.ts +++ b/src/routes/loggedin/+server.ts @@ -1,7 +1,7 @@ import { fetchApi } from '$lib/api' -import type { RequestHandler } from '@sveltejs/kit' +import { redirect, type RequestHandler, } from '@sveltejs/kit' -export const get: RequestHandler = async ({ url }) => { +export const GET = (async ({ url, cookies }) => { const code = url.searchParams.get('code') const redirectUri = `${url.protocol}//${url.host}/loggedin` const response = await fetchApi(`accounts/createsession`, fetch, { @@ -20,18 +20,11 @@ export const get: RequestHandler = async ({ url }) => { }) if (response.ok) { - return { - status: 303, - headers: { - location: '/verify', - 'Set-Cookie': `sid=${response.session_id}; Max-Age=31536000000; Path=/; HttpOnly` - } - } + cookies.set('sid', response.session_id, { + maxAge: 31536000000, + httpOnly: true, + }) + throw redirect(303, '/verify') } - return { - status: 303, - headers: { - location: '/login', - } - } -} + throw redirect(303, '/login') +}) satisfies RequestHandler diff --git a/src/routes/login/+page.ts b/src/routes/login/+page.ts deleted file mode 100644 index 1cd9b23..0000000 --- a/src/routes/login/+page.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { RequestHandler } from '@sveltejs/kit' -import env from '$lib/env' - - -export const get: RequestHandler = async ({ request, platform }) => { - const host = request.headers.get('host') - - const clientId = env(platform).DISCORD_CLIENT_ID - - if (!clientId) - return { - status: 500, - headers: { - 'content-type': 'text/plain', - }, - body: 'DISCORD_CLIENT_ID is not set as an environment variable. Please contact the owner of the website if this was expected to work.', - } - - if (!host) - return { - status: 400, - headers: { - 'content-type': 'text/plain', - }, - body: 'Host header is required.', - } - - const protocol = request.url.startsWith('https') ? 'https' : 'http' - - return { - status: 303, - headers: { - location: `https://discord.com/oauth2/authorize?client_id=${clientId}&redirect_uri=${protocol}://${host}%2Floggedin&response_type=code&scope=identify` - } - } -} diff --git a/src/routes/login/+server.ts b/src/routes/login/+server.ts new file mode 100644 index 0000000..684f11e --- /dev/null +++ b/src/routes/login/+server.ts @@ -0,0 +1,18 @@ +import env from '$lib/env' +import { error, redirect, type RequestHandler } from '@sveltejs/kit' + +export const GET = (async ({ request, platform }) => { + const host = request.headers.get('host') + + const clientId = env(platform).DISCORD_CLIENT_ID + + if (!clientId) + throw error(500, 'DISCORD_CLIENT_ID is not set as an environment variable. Please contact the owner of the website if this was expected to work.') + + if (!host) + throw error(400, 'Host header is required.') + + const protocol = request.url.startsWith('https') ? 'https' : 'http' + + throw redirect(303, `https://discord.com/oauth2/authorize?client_id=${clientId}&redirect_uri=${protocol}://${host}%2Floggedin&response_type=code&scope=identify`) +}) satisfies RequestHandler diff --git a/src/routes/logout/+page.ts b/src/routes/logout/+server.ts index 25be86c..2e0f40d 100644 --- a/src/routes/logout/+page.ts +++ b/src/routes/logout/+server.ts @@ -1,7 +1,7 @@ import { fetchApi } from '$lib/api' -import type { RequestHandler } from '@sveltejs/kit' +import { redirect, type RequestHandler } from '@sveltejs/kit' -export const get: RequestHandler = async ({ locals, url }) => { +export const GET = (async ({ url, cookies, locals }) => { // if the sid is wrong, nothing to do if (url.searchParams.has('sid') && url.searchParams.get('sid') === locals.sid) { await fetchApi(`accounts/session`, fetch, { @@ -17,12 +17,7 @@ export const get: RequestHandler = async ({ locals, url }) => { throw new Error(res.statusText) }) } - return { - status: 303, - headers: { - location: '/', - 'Set-Cookie': 'sid=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;' - } - } -} + cookies.delete('sid') + throw redirect(303, '/') +}) as RequestHandler diff --git a/src/routes/player/+page.server.ts b/src/routes/player/+page.server.ts index 3a1b069..eafae71 100644 --- a/src/routes/player/+page.server.ts +++ b/src/routes/player/+page.server.ts @@ -1,3 +1,4 @@ +import { redirect } from '@sveltejs/kit' import type { Actions } from './$types' export const actions: Actions = { @@ -6,11 +7,6 @@ export const actions: Actions = { const player = form.get('user-search') - return { - status: 303, - headers: { - location: `/player/${player}` - } - } + throw redirect(303, `/player/${player}`) } }
\ No newline at end of file diff --git a/src/routes/player/[player]/+page.ts b/src/routes/player/[player]/+page.ts index bd7c002..023c3ff 100644 --- a/src/routes/player/[player]/+page.ts +++ b/src/routes/player/[player]/+page.ts @@ -1,5 +1,6 @@ import type { PageLoad } from './$types' import { fetchApi } from '$lib/api' +import { error, redirect } from '@sveltejs/kit' export const load = (async ({ params, fetch }) => { const player: string = params.player! @@ -7,17 +8,11 @@ export const load = (async ({ params, fetch }) => { const data = await fetchApi(`player/${player}?customization=true`, fetch).then(r => r.json()) if (!data.player) { - return { - status: 404, - error: 'Unknown player', - } + throw error(404, 'Unknown player') } if (data.player.username !== player) { - return { - redirect: `/player/${data.player.username}`, - status: 302, - } as any + throw redirect(302, `/player/${data.player.username}`) } return data diff --git a/src/routes/player/[player]/[profile]/+page.ts b/src/routes/player/[player]/[profile]/+page.ts index e97cbfc..34a4e2a 100644 --- a/src/routes/player/[player]/[profile]/+page.ts +++ b/src/routes/player/[player]/[profile]/+page.ts @@ -2,6 +2,7 @@ import type { CleanMemberProfile } from '$lib/APITypes' import type { PageLoad } from './$types' import { loadPack } from '$lib/packs' import { fetchApi } from '$lib/api' +import { error, redirect } from '@sveltejs/kit' export const load = (async ({ params, fetch, url }) => { const player: string = params.player @@ -19,23 +20,14 @@ export const load = (async ({ params, fetch, url }) => { }) if (!data.member) { - return { - status: 404, - error: 'Unknown profile', - } + throw error(404, 'Unknown profile') } if (data.member.username !== player) { - return { - redirect: `/player/${data.member.username}/${data.profile.name}`, - status: 302, - } as any + throw redirect(302, `/player/${data.member.username}/${data.profile.name}`) } if (!data.member.left && data.profile.name !== profile) { - return { - redirect: `/player/${data.member.username}/${data.profile.name}`, - status: 302, - } as any + throw redirect(302, `/player/${data.member.username}/${data.profile.name}`) } const packName = url.searchParams.get('pack') ?? data?.customization?.pack diff --git a/src/routes/profile/+page.server.ts b/src/routes/profile/+page.server.ts new file mode 100644 index 0000000..60c24c1 --- /dev/null +++ b/src/routes/profile/+page.server.ts @@ -0,0 +1,7 @@ +import type { ServerLoad } from '@sveltejs/kit' + +export const load = (({ locals }) => { + return { + sid: locals.sid + } +}) satisfies ServerLoad diff --git a/src/routes/profile/index.svelte b/src/routes/profile/+page.svelte index 0d5ad04..244d1a2 100644 --- a/src/routes/profile/index.svelte +++ b/src/routes/profile/+page.svelte @@ -1,65 +1,21 @@ -<script lang="ts" context="module"> - import type { Load } from '@sveltejs/kit' - import { fetchApi } from '$lib/api' - import type { AccountCustomization, AccountSchema, CleanUser, SessionSchema } from '$lib/APITypes' - import Head from '$lib/Head.svelte' - import Header from '$lib/Header.svelte' - import donators from '../../_donators.json' - import admins from '../../_admins.json' - - export const load: Load = async ({ fetch, session }) => { - const sessionResponse: { session: SessionSchema | null; account: AccountSchema | null } | null = - await fetchApi(`accounts/session`, fetch, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - uuid: session.sid, - }), - }).then(r => r.json()) - - const playerResponse = sessionResponse?.account - ? await fetchApi(`player/${sessionResponse.account.minecraftUuid}`, fetch).then(r => r.json()) - : null - - // redirect to /login if the user is not logged in - if ( - !sessionResponse || - !sessionResponse.account || - !sessionResponse.session || - !playerResponse.player - ) { - return { redirect: '/login', status: 303 } - } - - const isDonator = - donators.find(d => d?.uuid === sessionResponse.account?.minecraftUuid) !== undefined - const isAdmin = admins.find(a => a === sessionResponse.account?.minecraftUuid) !== undefined - - return { - props: { - session: sessionResponse.session, - account: sessionResponse.account, - player: playerResponse, - isDonator: isDonator || isAdmin, - }, - } - } -</script> - <script lang="ts"> import Emoji from '$lib/Emoji.svelte' import { browser } from '$app/environment' import Tooltip from '$lib/Tooltip.svelte' import { onDestroy, onMount } from 'svelte' import backgroundNames from '../../_backgrounds.json' + import type { AccountCustomization, AccountSchema, CleanUser, SessionSchema } from '$lib/APITypes' + import type { PageData } from './$types' + import Head from '$lib/Head.svelte' + import Header from '$lib/Header.svelte' + + export let data: PageData - export let session: SessionSchema - export let account: AccountSchema - export let player: CleanUser + export let session: SessionSchema = data.session + export let account: AccountSchema = data.account + export let player: CleanUser = data.player - export let isDonator: boolean + export let isDonator: boolean = data.isDonator let pack: AccountCustomization['pack'] = account?.customization?.pack ?? 'furfsky_reborn' let blurBackground: AccountCustomization['blurBackground'] = @@ -172,6 +128,11 @@ style="background-image: url(/backgrounds-small/{thisBackgroundName})" title={thisBackgroundName} on:click={() => (backgroundName = thisBackgroundName)} + on:keypress={e => { + if (e.key === 'Enter') { + backgroundName = thisBackgroundName + } + }} /> {/each} </div> diff --git a/src/routes/profile/+page.ts b/src/routes/profile/+page.ts new file mode 100644 index 0000000..cdd2a93 --- /dev/null +++ b/src/routes/profile/+page.ts @@ -0,0 +1,44 @@ +import { fetchApi } from '$lib/api' +import type { AccountSchema, SessionSchema } from '$lib/APITypes' +import donators from '../../_donators.json' +import admins from '../../_admins.json' +import type { PageLoad } from './$types' +import { redirect } from '@sveltejs/kit' + +export const load = (async ({ fetch, data }) => { + const sessionResponse: { session: SessionSchema | null; account: AccountSchema | null } | null = + await fetchApi(`accounts/session`, fetch, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + uuid: data.sid, + }), + }).then(r => r.json()) + + const playerResponse = sessionResponse?.account + ? await fetchApi(`player/${sessionResponse.account.minecraftUuid}`, fetch).then(r => r.json()) + : null + + // redirect to /login if the user is not logged in + if ( + !sessionResponse || + !sessionResponse.account || + !sessionResponse.session || + !playerResponse.player + ) { + throw redirect(303, '/login') + } + + const isDonator = + donators.find(d => d?.uuid === sessionResponse.account?.minecraftUuid) !== undefined + const isAdmin = admins.find(a => a === sessionResponse.account?.minecraftUuid) !== undefined + + return { + session: sessionResponse.session, + account: sessionResponse.account, + player: playerResponse, + isDonator: isDonator || isAdmin, + } +}) as PageLoad diff --git a/src/routes/profile/update.ts b/src/routes/profile/update/+server.ts index 168cba8..7190fb8 100644 --- a/src/routes/profile/update.ts +++ b/src/routes/profile/update/+server.ts @@ -1,11 +1,11 @@ import { fetchApi } from '$lib/api' import type { AccountSchema, SessionSchema } from '$lib/APITypes' -import type { RequestHandler } from '@sveltejs/kit' -import backgroundFileNames from '../../_backgrounds.json' -import donators from '../../_donators.json' -import admins from '../../_admins.json' -import type { JSONValue } from '@sveltejs/kit/types/internal' +import backgroundFileNames from '../../../_backgrounds.json' +import donators from '../../../_donators.json' +import admins from '../../../_admins.json' import env from '$lib/env' +import type { PageServerLoad } from '../$types' +import { error, json } from '@sveltejs/kit' const emojiRegex = /^(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])$/ @@ -15,19 +15,13 @@ function isValidEmoji(emoji: string) { } -export const patch: RequestHandler = async ({ request, locals, platform }) => { +export const PATCH = (async ({ request, locals, platform }) => { if (locals.sid === undefined) { - return { - body: { ok: false, error: 'You are not logged in.' }, - status: 401, - } + throw error(401, 'You are not logged in.') } const key = env(platform).SKYBLOCK_STATS_API_KEY if (!key) { - return { - body: { ok: false, error: 'The SKYBLOCK_STATS_API_KEY environment variable is not set.' }, - status: 500, - } + throw error(500, 'The SKYBLOCK_STATS_API_KEY environment variable is not set.') } const data = await request.json() @@ -41,10 +35,7 @@ export const patch: RequestHandler = async ({ request, locals, platform }) => { }), }).then(r => r.json()) if (!sessionResponse.session || !sessionResponse.account?.minecraftUuid) - return { - body: { ok: false, error: 'Invalid session.' }, - status: 401, - } + throw error(401, 'Invalid session.') const backgroundName = data.backgroundName const pack = data.pack @@ -55,49 +46,28 @@ export const patch: RequestHandler = async ({ request, locals, platform }) => { const isAdmin = admins.includes(sessionResponse.account?.minecraftUuid) if (typeof backgroundName !== 'undefined' && typeof backgroundName !== 'string') { - return { - body: { ok: false, error: 'Invalid background.' }, - status: 400, - } + throw error(400, 'Invalid background.') } if (typeof pack !== 'string') { - return { - body: { ok: false, error: 'Invalid pack.' }, - status: 400, - } + throw error(400, 'Invalid pack.') } if (typeof blurBackground !== 'boolean') { - return { - body: { ok: false, error: 'Invalid blurBackground.' }, - status: 400, - } + throw error(400, 'Invalid blurBackground.') } if (typeof emoji !== 'undefined' && typeof emoji !== 'string') { - return { - body: { ok: false, error: 'Invalid emoji.' }, - status: 400, - } + throw error(400, 'Invalid emoji.') } // prevent people from putting non-existent backgrounds if (backgroundName && !backgroundFileNames.includes(backgroundName)) - return { - body: { ok: false, error: 'Invalid background.' }, - status: 400, - } + throw error(400, 'Invalid background.') const backgroundUrl = backgroundName ? `/backgrounds/${backgroundName}` : undefined if (emoji) { if (!isDonator && !isAdmin) - return { - body: { ok: false, error: 'You are not allowed to use emojis.' }, - status: 401, - } + throw error(401, 'You are not allowed to use emojis.') if (!isValidEmoji(emoji)) - return { - body: { ok: false, error: 'Invalid emoji.' }, - status: 400, - } + throw error(400, 'Invalid emoji.') } const updatedAccount: AccountSchema = { @@ -118,9 +88,8 @@ export const patch: RequestHandler = async ({ request, locals, platform }) => { }, body: JSON.stringify(updatedAccount), }).then(r => r.json()) + console.log(response) - return { - body: { ok: true } as JSONValue, - } -}
\ No newline at end of file + return json({ ok: true }) +}) satisfies PageServerLoad
\ No newline at end of file diff --git a/src/routes/verify/+page.server.ts b/src/routes/verify/+page.server.ts index 3321164..bd3ea7f 100644 --- a/src/routes/verify/+page.server.ts +++ b/src/routes/verify/+page.server.ts @@ -1,75 +1,75 @@ import { fetchApi } from '$lib/api' import type { AccountSchema, CleanUser, SessionSchema } from '$lib/APITypes' -import type { RequestHandler } from '@sveltejs/kit' +import { redirect, type RequestHandler, type ServerLoad } from '@sveltejs/kit' import env from '$lib/env' +import type { Actions } from './$types' -function redirect(status: number, location: string) { - return { - status, - headers: { - location, - }, - } -} +export const actions: Actions = { + default: async ({ platform, locals, request }) => { + const key = env(platform).SKYBLOCK_STATS_API_KEY + if (!key) { + throw redirect(303, `/verify?error=NO_KEY`) + } + if (locals.sid === undefined) { + throw redirect(303, '/login') + } -export const post: RequestHandler = async ({ request, locals, platform }) => { - const key = env(platform).SKYBLOCK_STATS_API_KEY - if (!key) { - return redirect(303, `/verify?error=NO_KEY`) - } - if (locals.sid === undefined) { - return redirect(303, '/login') - } + const form = await request.formData() - const form = await request.formData() + // username or uuid + const playerIdentifier = form.get('ign') + if (!playerIdentifier) { + throw redirect(303, `/verify?error=NO_IGN`) + } - // username or uuid - const playerIdentifier = form.get('ign') - if (!playerIdentifier) { - return redirect(303, `/verify?error=NO_IGN`) - } + const playerResponse: CleanUser = await fetchApi(`player/${playerIdentifier}`, fetch).then(res => res.json()) + const sessionResponse: { session: SessionSchema | null, account: AccountSchema | null } = await fetchApi(`accounts/session`, fetch, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + uuid: locals.sid, + }), + }).then(r => r.json()) - const playerResponse: CleanUser = await fetchApi(`player/${playerIdentifier}`, fetch).then(res => res.json()) - const sessionResponse: { session: SessionSchema | null, account: AccountSchema | null } = await fetchApi(`accounts/session`, fetch, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - uuid: locals.sid, - }), - }).then(r => r.json()) + if (!sessionResponse.session) + throw redirect(303, '/login') - if (!sessionResponse.session) - return redirect(303, '/login') + const hypixelDiscordName = playerResponse.player?.socials.discord - const hypixelDiscordName = playerResponse.player?.socials.discord + if (!hypixelDiscordName) + throw redirect(303, `/verify?error=NOT_LINKED`) - if (!hypixelDiscordName) - return redirect(303, `/verify?error=NOT_LINKED`) + const discordUser = sessionResponse.session.discord_user + const actualDiscordName = discordUser.name + // some people link themselves as <id>#<discrim> instead of <name>#<discrim> + const actualDiscordIdDiscrim = `${discordUser.id}#${discordUser.name.split('#')[1]}` - const discordUser = sessionResponse.session.discord_user - const actualDiscordName = discordUser.name - // some people link themselves as <id>#<discrim> instead of <name>#<discrim> - const actualDiscordIdDiscrim = `${discordUser.id}#${discordUser.name.split('#')[1]}` + if (!(hypixelDiscordName === actualDiscordName || hypixelDiscordName === actualDiscordIdDiscrim)) + throw redirect(303, `/verify?error=WRONG_NAME¤t=${encodeURIComponent(hypixelDiscordName)}&correct=${encodeURIComponent(actualDiscordName)}`) - if (!(hypixelDiscordName === actualDiscordName || hypixelDiscordName === actualDiscordIdDiscrim)) - return redirect(303, `/verify?error=WRONG_NAME¤t=${encodeURIComponent(hypixelDiscordName)}&correct=${encodeURIComponent(actualDiscordName)}`) + const updatedAccount: AccountSchema = { + discordId: sessionResponse.session.discord_user.id, + minecraftUuid: playerResponse.player?.uuid + } - const updatedAccount: AccountSchema = { - discordId: sessionResponse.session.discord_user.id, - minecraftUuid: playerResponse.player?.uuid - } + await fetchApi(`accounts/update`, fetch, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + key: key + }, + body: JSON.stringify(updatedAccount), + }).then(r => r.json()) - await fetchApi(`accounts/update`, fetch, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - key: key - }, - body: JSON.stringify(updatedAccount), - }).then(r => r.json()) + throw redirect(303, '/profile') + } +} - return redirect(303, '/profile') -}
\ No newline at end of file +export const load = (({ locals }) => { + return { + sid: locals.sid + } +}) satisfies ServerLoad diff --git a/src/routes/verify/+page.svelte b/src/routes/verify/+page.svelte index 20de403..4edc50d 100644 --- a/src/routes/verify/+page.svelte +++ b/src/routes/verify/+page.svelte @@ -1,27 +1,14 @@ -<script lang="ts" context="module"> - import type { Load } from '@sveltejs/kit' - export const load: Load = async ({ session, url }) => { - if (session.sid === undefined) { - return { redirect: '/login', status: 303 } - } - return { - props: { - errorCode: url.searchParams.get('error'), - current: url.searchParams.get('current'), - correct: url.searchParams.get('correct'), - }, - } - } -</script> - <script lang="ts"> import Emoji from '$lib/Emoji.svelte' import Head from '$lib/Head.svelte' import Header from '$lib/Header.svelte' + import type { PageData } from './$types' + + export let data: PageData - export let errorCode: string | null - export let current: string | null - export let correct: string | null + export let errorCode: string | null = data.errorCode + export let current: string | null = data.current + export let correct: string | null = data.correct const errorCodes = { NO_IGN: 'Please enter a valid Minecraft username.', diff --git a/src/routes/verify/+page.ts b/src/routes/verify/+page.ts new file mode 100644 index 0000000..8e5f698 --- /dev/null +++ b/src/routes/verify/+page.ts @@ -0,0 +1,13 @@ +import { redirect } from '@sveltejs/kit' +import type { PageLoad } from './$types' + +export const load = (async ({ data, url }) => { + if (data.sid === undefined) { + throw redirect(303, '/login') + } + return { + errorCode: url.searchParams.get('error'), + current: url.searchParams.get('current'), + correct: url.searchParams.get('correct'), + } +}) satisfies PageLoad |