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", }; const appealBlock = await context.env.DATA.get(`gameappealblock_${user}`); if (appealBlock) return { can_appeal: false, reason: `You must wait until ${new Date( parseInt(appealBlock), ).toLocaleString()} to submit another appeal`, }; let userLogs; try { userLogs = await queryLogs(user, context); } catch { return { error: "Could not determine your eligibility", }; } // Legacy bans if (!userLogs.length) return { can_appeal: true, reason: "" }; 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: "" }; }