do not throw 500 on mojang server error

This commit is contained in:
bytedream 2023-11-30 00:40:14 +01:00
parent b75620c892
commit 1f150bae06
2 changed files with 21 additions and 11 deletions

View File

@ -1,17 +1,22 @@
import { createHash } from 'node:crypto'; import { createHash } from 'node:crypto';
export class UserNotFoundError extends Error { export class UserNotFoundError extends Error {
readonly username: string;
constructor(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<string> { export async function getJavaUuid(username: string): Promise<string> {
const response = await fetch(`https://api.mojang.com/users/profiles/minecraft/${username}`); const response = await fetch(`https://api.mojang.com/users/profiles/minecraft/${username}`);
if (!response.ok) { if (!response.ok) {
throw response.status < 500 throw response.status < 500
? new UserNotFoundError(username) ? 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 json = await response.json();
const id: string = json['id']; const id: string = json['id'];

View File

@ -2,6 +2,7 @@ import {
getBedrockUuid, getBedrockUuid,
getJavaUuid, getJavaUuid,
getNoAuthUuid, getNoAuthUuid,
MojangError,
UserNotFoundError UserNotFoundError
} from '$lib/server/minecraft'; } from '$lib/server/minecraft';
import { error, type RequestHandler } from '@sveltejs/kit'; import { error, type RequestHandler } from '@sveltejs/kit';
@ -27,31 +28,35 @@ export const POST = (async ({ request }) => {
throw error(400, 'Ungültige Parameter'); throw error(400, 'Ungültige Parameter');
} }
let uuid: string; let uuid: string | null;
try { try {
// available playertypes are 'java', 'bedrock' and 'noauth' // available playertypes are 'java', 'bedrock' and 'noauth'
switch (data.get('playertype')) { switch (data.get('playertype')) {
case 'java': case 'java':
uuid = await getJavaUuid(data.get('username') as string); uuid = await getJavaUuid(username);
break; break;
case 'bedrock': case 'bedrock':
uuid = await getBedrockUuid(data.get('username') as string); uuid = await getBedrockUuid(username);
break; break;
case 'noauth': case 'noauth':
uuid = getNoAuthUuid(data.get('username') as string); uuid = getNoAuthUuid(username);
break; break;
default: default:
throw new Error(`invalid player type (${data.get('playertype')})`); throw new Error(`invalid player type (${playertype})`);
} }
} catch (e) { } catch (e) {
if (e instanceof UserNotFoundError) { 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); console.error((e as Error).message);
throw error(500); 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'); throw error(400, 'Dieser Spieler wurde bereits registriert');
} else if ( } else if (
await User.findOne({ await User.findOne({