Start inserting game mod logs into D1
This commit is contained in:
parent
4edf232d90
commit
8e5ff1f974
@ -1,4 +1,3 @@
|
|||||||
import { insertLogs } from "../../../gcloud.js";
|
|
||||||
import { getBanList, setBanList } from "../../../roblox-open-cloud.js";
|
import { getBanList, setBanList } from "../../../roblox-open-cloud.js";
|
||||||
import { jsonError } from "../../../common.js";
|
import { jsonError } from "../../../common.js";
|
||||||
|
|
||||||
@ -35,11 +34,19 @@ export async function onRequestPost(context: RequestContext) {
|
|||||||
UnbanReduct: statsReduction,
|
UnbanReduct: statsReduction,
|
||||||
};
|
};
|
||||||
|
|
||||||
await insertLogs(
|
await context.env.D1.prepare(
|
||||||
{ [data.roblox_id]: 4 },
|
"INSERT INTO game_mod_logs (action, evidence, executed_at, executor, id, target) VALUES (?, ?, ?, ?, ?, ?);",
|
||||||
context.params.id as string,
|
)
|
||||||
context,
|
.bind(
|
||||||
);
|
"accept_appeal",
|
||||||
|
`https://carcrushers.cc/mod-queue?id=${context.params.id}&type=gma`,
|
||||||
|
Date.now(),
|
||||||
|
context.data.current_user.id,
|
||||||
|
crypto.randomUUID(),
|
||||||
|
data.roblox_id,
|
||||||
|
)
|
||||||
|
.run();
|
||||||
|
|
||||||
await setBanList(context, banList);
|
await setBanList(context, banList);
|
||||||
|
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { getBanList } from "../../../roblox-open-cloud.js";
|
import { getBanList } from "../../../roblox-open-cloud.js";
|
||||||
import { jsonError, jsonResponse } from "../../../common.js";
|
import { jsonError, jsonResponse } from "../../../common.js";
|
||||||
import { queryLogs } from "../../../gcloud.js";
|
|
||||||
|
|
||||||
export async function onRequestGet(context: RequestContext) {
|
export async function onRequestGet(context: RequestContext) {
|
||||||
const robloxUserReq = await fetch(
|
const robloxUserReq = await fetch(
|
||||||
@ -52,12 +51,13 @@ export async function onRequestGet(context: RequestContext) {
|
|||||||
else if (banData.BanType === 2) current_status = "Banned";
|
else if (banData.BanType === 2) current_status = "Banned";
|
||||||
|
|
||||||
const response = {
|
const response = {
|
||||||
history: (await queryLogs(users[0].id, context)).sort((a, b) =>
|
history: (
|
||||||
a.entity.properties.executed_at.integerValue <
|
await context.env.D1.prepare(
|
||||||
b.entity.properties.executed_at.integerValue
|
"SELECT * FROM game_mod_logs WHERE target = ? ORDER BY executed_at DESC;",
|
||||||
? 1
|
)
|
||||||
: -1,
|
.bind(users[0].id)
|
||||||
),
|
.all()
|
||||||
|
).results,
|
||||||
user: {
|
user: {
|
||||||
avatar: thumbnailRequest.ok
|
avatar: thumbnailRequest.ok
|
||||||
? (
|
? (
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { getBanList, setBanList } from "../../../roblox-open-cloud.js";
|
import { getBanList, setBanList } from "../../../roblox-open-cloud.js";
|
||||||
import { insertLogs } from "../../../gcloud.js";
|
|
||||||
import { jsonError } from "../../../common.js";
|
import { jsonError } from "../../../common.js";
|
||||||
|
|
||||||
export async function onRequestPost(context: RequestContext) {
|
export async function onRequestPost(context: RequestContext) {
|
||||||
@ -19,7 +18,18 @@ export async function onRequestPost(context: RequestContext) {
|
|||||||
|
|
||||||
if (isNaN(parseInt(user))) return jsonError("Invalid user ID", 400);
|
if (isNaN(parseInt(user))) return jsonError("Invalid user ID", 400);
|
||||||
|
|
||||||
await insertLogs({ [user]: 3 }, ticket_link, context);
|
await context.env.D1.prepare(
|
||||||
|
"INSERT INTO game_mod_logs (action, evidence, executed_at, executor, id, target) VALUES (?, ?, ?, ?, ?, ?);",
|
||||||
|
)
|
||||||
|
.bind(
|
||||||
|
"revoke",
|
||||||
|
ticket_link,
|
||||||
|
Date.now(),
|
||||||
|
context.data.current_user.id,
|
||||||
|
crypto.randomUUID(),
|
||||||
|
parseInt(user),
|
||||||
|
)
|
||||||
|
.run();
|
||||||
|
|
||||||
const banList = (await getBanList(context)) as {
|
const banList = (await getBanList(context)) as {
|
||||||
[k: string]: { BanType: number };
|
[k: string]: { BanType: number };
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { getBanList, setBanList } from "../../../roblox-open-cloud.js";
|
import { getBanList, setBanList } from "../../../roblox-open-cloud.js";
|
||||||
import { insertLogs } from "../../../gcloud.js";
|
|
||||||
import { jsonError } from "../../../common.js";
|
import { jsonError } from "../../../common.js";
|
||||||
import sendEmail from "../../../email.js";
|
import sendEmail from "../../../email.js";
|
||||||
import { sendPushNotification } from "../../../gcloud.js";
|
import { sendPushNotification } from "../../../gcloud.js";
|
||||||
@ -32,14 +31,35 @@ export async function onRequestPost(context: RequestContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Object.values(logMap).length) {
|
if (Object.values(logMap).length) {
|
||||||
await insertLogs(logMap, context.params.id as string, context);
|
const batchedQueries = [];
|
||||||
|
const statement = context.env.D1.prepare(
|
||||||
|
"INSERT INTO game_mod_logs (action, evidence, executed_at, executor, id, target) VALUES (?, ?, ?, ?, ?, ?);",
|
||||||
|
);
|
||||||
|
const actionMap: { [k: number]: string } = {
|
||||||
|
1: "blacklist",
|
||||||
|
2: "ban",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const [k, v] of Object.entries(logMap)) {
|
||||||
|
if (v === 0) continue;
|
||||||
|
|
||||||
|
batchedQueries.push(
|
||||||
|
statement.bind(actionMap[v]),
|
||||||
|
`https://carcrushers.cc/mod-queue?type=report&id=${context.params.id}`,
|
||||||
|
Date.now(),
|
||||||
|
context.data.current_user.id,
|
||||||
|
crypto.randomUUID(),
|
||||||
|
parseInt(k),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
await context.env.D1.batch(batchedQueries);
|
||||||
|
|
||||||
const banList = (await getBanList(context)) as {
|
const banList = (await getBanList(context)) as {
|
||||||
[k: string]: { BanType: number };
|
[k: string]: { BanType: number };
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.assign(banList, newActions);
|
await setBanList(context, Object.assign(banList, newActions));
|
||||||
await setBanList(context, banList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reportData.open = false;
|
reportData.open = false;
|
||||||
|
@ -125,94 +125,6 @@ async function getKeyIDs(
|
|||||||
return ((await keyRequest.json()) as { keys: { [k: string]: any }[] }).keys;
|
return ((await keyRequest.json()) as { keys: { [k: string]: any }[] }).keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function insertLogs(
|
|
||||||
userActionMap: { [k: string]: number },
|
|
||||||
reportId: string,
|
|
||||||
context: RequestContext,
|
|
||||||
) {
|
|
||||||
const accessToken = await GetAccessToken(context.env);
|
|
||||||
const actionBaseURLs: { [k: number]: string } = {
|
|
||||||
1: "https://carcrushers.cc/mod-queue?type=report&id=",
|
|
||||||
2: "https://carcrushers.cc/mod-queue?type=report&id=",
|
|
||||||
3: "",
|
|
||||||
4: "https://carcrushers.cc/mod-queue?type=gma&id=",
|
|
||||||
};
|
|
||||||
const actionIntegers: { [k: number]: string } = {
|
|
||||||
1: "blacklist",
|
|
||||||
2: "ban",
|
|
||||||
3: "revoke",
|
|
||||||
4: "accept_appeal",
|
|
||||||
};
|
|
||||||
const incompleteLogKey = {
|
|
||||||
partitionId: {
|
|
||||||
projectId: context.env.DATASTORE_PROJECT,
|
|
||||||
},
|
|
||||||
path: [
|
|
||||||
{
|
|
||||||
kind: "log",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
const payload: { mode: string; mutations: { [k: string]: any }[] } = {
|
|
||||||
mode: "NON_TRANSACTIONAL",
|
|
||||||
mutations: [],
|
|
||||||
};
|
|
||||||
const preAllocatedLogKeys = [];
|
|
||||||
|
|
||||||
while (preAllocatedLogKeys.length < Object.keys(userActionMap).length)
|
|
||||||
preAllocatedLogKeys.push(incompleteLogKey);
|
|
||||||
|
|
||||||
const keys = await getKeyIDs(
|
|
||||||
accessToken,
|
|
||||||
context.env.DATASTORE_PROJECT,
|
|
||||||
preAllocatedLogKeys,
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const [user, action] of Object.entries(userActionMap)) {
|
|
||||||
payload.mutations.push({
|
|
||||||
insert: {
|
|
||||||
key: keys.pop(),
|
|
||||||
properties: {
|
|
||||||
action: {
|
|
||||||
stringValue: actionIntegers[action],
|
|
||||||
},
|
|
||||||
evidence: {
|
|
||||||
stringValue: actionBaseURLs[action] + reportId,
|
|
||||||
},
|
|
||||||
executed_at: {
|
|
||||||
integerValue: Date.now(),
|
|
||||||
},
|
|
||||||
executor: {
|
|
||||||
stringValue: context.data.current_user.id,
|
|
||||||
},
|
|
||||||
target: {
|
|
||||||
integerValue: user,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const mutationRequest = await fetch(
|
|
||||||
`https://datastore.googleapis.com/v1/projects/${context.env.DATASTORE_PROJECT}:commit`,
|
|
||||||
{
|
|
||||||
body: JSON.stringify(payload),
|
|
||||||
headers: {
|
|
||||||
authorization: `Bearer ${accessToken}`,
|
|
||||||
"content-type": "application/json",
|
|
||||||
},
|
|
||||||
method: "POST",
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!mutationRequest.ok) {
|
|
||||||
console.log(await mutationRequest.json());
|
|
||||||
throw new Error("Failed to commit mutation");
|
|
||||||
}
|
|
||||||
|
|
||||||
return await mutationRequest.json();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function queryLogs(user: number, context: RequestContext) {
|
export async function queryLogs(user: number, context: RequestContext) {
|
||||||
const accessToken = await GetAccessToken(context.env);
|
const accessToken = await GetAccessToken(context.env);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user