95 lines
2.6 KiB
TypeScript
95 lines
2.6 KiB
TypeScript
import { jsonError } from "../../common.js";
|
|
import { getBanList } from "../../roblox-open-cloud.js";
|
|
|
|
export async function onRequestGet(context: RequestContext) {
|
|
const code = new URL(context.request.url).searchParams.get("code");
|
|
|
|
if (!code) return jsonError("Missing code", 400);
|
|
|
|
const dataTransferData = (await context.env.DATA.get(
|
|
`datatransfer_${context.data.data_transfer_id}`,
|
|
{ type: "json" },
|
|
)) as { [k: string]: any } | null;
|
|
|
|
if (!dataTransferData)
|
|
return jsonError("No transfer exists with that ID", 404);
|
|
|
|
const exchangeReq = await fetch("https://apis.roblox.com/oauth/v1/token", {
|
|
body: `code=${code}&grant_type=authorization_code`,
|
|
headers: {
|
|
authorization: `Basic ${
|
|
btoa(context.env.ROBLOX_OAUTH_ID) +
|
|
":" +
|
|
context.env.ROBLOX_OAUTH_SECRET
|
|
}`,
|
|
"content-type": "application/x-www-form-urlencoded",
|
|
},
|
|
method: "POST",
|
|
});
|
|
|
|
if (!exchangeReq.ok) return jsonError("Failed to redeem code", 500);
|
|
|
|
const { id_token } = (await exchangeReq.json()) as { id_token: string };
|
|
|
|
const { name, preferred_username, sub } = JSON.parse(
|
|
atob(id_token.replaceAll("-", "+").replaceAll("_", "/")),
|
|
);
|
|
|
|
if (!preferred_username) return jsonError("Username missing", 500);
|
|
|
|
const userObj = {
|
|
displayName: name,
|
|
id: parseInt(sub),
|
|
name: preferred_username,
|
|
};
|
|
|
|
let redirectLocation = "/data-transfer/complete";
|
|
|
|
if (dataTransferData.oldUser) {
|
|
let banList;
|
|
|
|
try {
|
|
banList = (await getBanList(context)) as {
|
|
[k: string]: { BanType: number };
|
|
};
|
|
} catch {
|
|
return jsonError("Failed to create data transfer request", 500);
|
|
}
|
|
|
|
if (banList[userObj.id].BanType)
|
|
return new Response(null, {
|
|
headers: {
|
|
location: redirectLocation,
|
|
},
|
|
status: 302,
|
|
});
|
|
|
|
dataTransferData.newUser = userObj;
|
|
|
|
await fetch(
|
|
`https://api.trello.com/1/cards?key=${context.env.TRELLO_API_KEY}&token=${context.env.TRELLO_API_TOKEN}`,
|
|
{
|
|
body: JSON.stringify({
|
|
desc: `${dataTransferData.oldUser.name} -> ${userObj.name}\n${dataTransferData.oldUser.id} -> ${userObj.id}\nNO MODMAIL TICKET - WEBSITE FORM SUBMISSION`,
|
|
idList: context.env.TRELLO_LIST_ID,
|
|
name: `${dataTransferData.oldUser.name} | Data Transfer`,
|
|
}),
|
|
headers: {
|
|
"content-type": "application/json",
|
|
},
|
|
method: "POST",
|
|
},
|
|
);
|
|
} else {
|
|
dataTransferData.oldUser = userObj;
|
|
redirectLocation = "/data-transfer/destination-account";
|
|
}
|
|
|
|
return new Response(null, {
|
|
headers: {
|
|
location: redirectLocation,
|
|
},
|
|
status: 302,
|
|
});
|
|
}
|