import { getBanList } from "../../roblox-open-cloud.js"; export default async function ( context: RequestContext, user: number, ): Promise<{ can_appeal?: boolean; error?: string; reason?: string; types?: string[]; }> { if ( await context.env.D1.prepare( "SELECT * FROM game_appeals WHERE roblox_id = ?;", ) .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; hidden_from_leaderboards?: boolean; serverconfigurator_blacklist?: boolean; }; }; } 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`, }; const userLogs = await context.env.D1.prepare( "SELECT executed_at FROM game_mod_logs WHERE target = ? ORDER BY executed_at DESC;", ) .bind(user) .all(); if (userLogs.error) return { error: "Could not determine your eligibility", }; // Legacy bans if (!userLogs.results.length) return { can_appeal: true, reason: "", types: ["ban"] }; const allowedTime = (userLogs.results[0].executed_at as number) + 2592000000; if (Date.now() < allowedTime) return { can_appeal: false, reason: `You must wait until ${new Date( allowedTime, ).toLocaleString()} to submit an appeal`, }; const types: string[] = []; if (banList[user].BanType) types.push("ban"); if (banList[user].hidden_from_leaderboards) types.push("leaderboard"); if (banList[user].serverconfigurator_blacklist) types.push("server_configurator"); return { can_appeal: true, reason: "", types }; }