From f135368dc47e92bba22ac87bd276a4325aab7093 Mon Sep 17 00:00:00 2001 From: regalijan Date: Thu, 19 Oct 2023 16:51:03 -0400 Subject: [PATCH] Add first game appeal endpoints --- functions/api/game-appeals/metadata.ts | 16 +++++++ functions/api/game-appeals/precheck.ts | 66 ++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 functions/api/game-appeals/metadata.ts create mode 100644 functions/api/game-appeals/precheck.ts diff --git a/functions/api/game-appeals/metadata.ts b/functions/api/game-appeals/metadata.ts new file mode 100644 index 0000000..582c688 --- /dev/null +++ b/functions/api/game-appeals/metadata.ts @@ -0,0 +1,16 @@ +import { jsonError, jsonResponse } from "../../common.js"; +import precheck from "./precheck.js"; + +export async function onRequestPost(context: RequestContext) { + const { id }: { id: any } = context.data.body; + + if (typeof id !== "number") return jsonError("Invalid user id", 400); + + const precheckData = await precheck(context, id); + + if (precheckData.error) return jsonError(precheckData.error, 500); + + const { can_appeal, reason } = precheckData; + + return jsonResponse(JSON.stringify({ can_appeal, reason })); +} diff --git a/functions/api/game-appeals/precheck.ts b/functions/api/game-appeals/precheck.ts new file mode 100644 index 0000000..f60aae7 --- /dev/null +++ b/functions/api/game-appeals/precheck.ts @@ -0,0 +1,66 @@ +import { queryLogs } from "../../gcloud.js"; +import { getBanList } from "../../roblox-open-cloud.js"; + +export default async function ( + context: RequestContext, + user: number, +): Promise<{ can_appeal?: boolean; error?: string; reason?: string }> { + if ( + await context.env.D1.prepare("SELECT * FROM game_appeals WHERE open = 1 AND user = ?;") + .bind(user) + .first() + ) + return { + can_appeal: false, + reason: "You have already submitted an appeal", + }; + + let banList; + + try { + banList = (await getBanList(context)) as { + [k: number]: { BanType: number }; + }; + } catch { + return { + error: "Failed to check your ban status", + }; + } + + if (!banList[user]?.BanType) + return { + can_appeal: false, + reason: "You do not appear to be banned", + }; + + let userLogs; + + try { + userLogs = await queryLogs(user, context); + } catch { + return { + error: "Could not determine your eligibility", + }; + } + + userLogs.sort((a, b) => + parseInt(a.entity.properties.executed_at.integerValue) > + parseInt(b.entity.properties.executed_at.integerValue) + ? -1 + : 1, + ); + + const allowedTime = + parseInt(userLogs[0].entity.properties.executed_at.integerValue) + + 2592000000; + + if (Date.now() < allowedTime) + return { + can_appeal: false, + reason: `You must wait until ${new Date( + allowedTime, + ).toLocaleString()} to submit an appeal`, + }; + + return { can_appeal: true, reason: "" }; +}