From 1f150bae06a20b1b02e7e596f2d91ac8d9acc4d6 Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 30 Nov 2023 00:40:14 +0100 Subject: [PATCH] do not throw 500 on mojang server error --- src/lib/server/minecraft.ts | 9 +++++++-- src/routes/register/+server.ts | 23 ++++++++++++++--------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/lib/server/minecraft.ts b/src/lib/server/minecraft.ts index 139e23c..fce530d 100644 --- a/src/lib/server/minecraft.ts +++ b/src/lib/server/minecraft.ts @@ -1,17 +1,22 @@ import { createHash } from 'node:crypto'; export class UserNotFoundError extends Error { + readonly username: string; + constructor(username: string) { - super(`Ein Spieler mit dem Namen '${username}' konnte nicht gefunden werden`); + super(`couldn't find a player with the username '${username}'`); + this.username = username; } } +export class MojangError extends Error {} + export async function getJavaUuid(username: string): Promise { const response = await fetch(`https://api.mojang.com/users/profiles/minecraft/${username}`); if (!response.ok) { throw response.status < 500 ? new UserNotFoundError(username) - : new Error(`mojang server error (${response.status}): ${await response.text()}`); + : new MojangError(`mojang server error (${response.status}): ${await response.text()}`); } const json = await response.json(); const id: string = json['id']; diff --git a/src/routes/register/+server.ts b/src/routes/register/+server.ts index c709b3e..dfa70db 100644 --- a/src/routes/register/+server.ts +++ b/src/routes/register/+server.ts @@ -2,6 +2,7 @@ import { getBedrockUuid, getJavaUuid, getNoAuthUuid, + MojangError, UserNotFoundError } from '$lib/server/minecraft'; import { error, type RequestHandler } from '@sveltejs/kit'; @@ -27,31 +28,35 @@ export const POST = (async ({ request }) => { throw error(400, 'Ungültige Parameter'); } - let uuid: string; + let uuid: string | null; try { // available playertypes are 'java', 'bedrock' and 'noauth' switch (data.get('playertype')) { case 'java': - uuid = await getJavaUuid(data.get('username') as string); + uuid = await getJavaUuid(username); break; case 'bedrock': - uuid = await getBedrockUuid(data.get('username') as string); + uuid = await getBedrockUuid(username); break; case 'noauth': - uuid = getNoAuthUuid(data.get('username') as string); + uuid = getNoAuthUuid(username); break; default: - throw new Error(`invalid player type (${data.get('playertype')})`); + throw new Error(`invalid player type (${playertype})`); } } catch (e) { if (e instanceof UserNotFoundError) { - throw error(400, e.message); + throw error(400, `Ein Spieler mit dem Namen '${username}' konnte nicht gefunden werden`); + } else if (e instanceof MojangError) { + console.error((e as Error).message); + uuid = null; + } else { + console.error((e as Error).message); + throw error(500); } - console.error((e as Error).message); - throw error(500); } - if (await User.findOne({ where: { uuid: uuid } })) { + if (uuid && (await User.findOne({ where: { uuid: uuid } }))) { throw error(400, 'Dieser Spieler wurde bereits registriert'); } else if ( await User.findOne({