see_leaderboard_bot/advancementAPI.ts
2024-07-01 13:30:52 +03:00

78 lines
1.9 KiB
TypeScript

//@ts-nocheck
import Rcon from "ts-rcon";
import config from "./config.json" assert { type: "json" };
const advancements = new Map<string, number>();
let advancementsRequired = 0;
let authenicated = false;
const advancementRegex = /^([^ ]*) has (\d*) \[Advancements\]$/gm;
const playerRegex = /There are \d* whitelisted player\(s\): /gm;
const noAdvancements =
/^Can't get value of bac_advancements for ([^;]*); none is set$/gm;
const client = new Rcon(
config.rcon.host,
config.rcon.port,
config.rcon.password
);
client.on("connect", () => {
console.log("RCON connected.");
});
client.on("auth", () => {
console.log("RCON authenicated.");
authenicated = true;
});
client.on("response", (a: string) => {
if (playerRegex.test(a)) {
const whitelistedPlayers = a.replace(playerRegex, "").split(", ");
advancementsRequired = whitelistedPlayers.length;
for (let i = 0; i < whitelistedPlayers.length; i++) {
setTimeout(() => {
const name = whitelistedPlayers[i];
client.send(`scoreboard players get ${name} bac_advancements`, 0x02);
}, i * 20);
}
}
if (advancementRegex.test(a)) {
advancements.set(
a.replace(advancementRegex, "$1"),
+a.replace(advancementRegex, "$2")
);
}
if (noAdvancements.test(a)) {
advancements.set(a.replace(noAdvancements, "$1"), 0);
}
if (advancements.size == advancementsRequired) {
client.emit("done");
}
});
export function getAdvancements(): Promise<Map<string, number>> {
return new Promise(async (res, rej) => {
if (!authenicated) {
await new Promise((res2, rej2) => {
client.once("auth", () => {
res2("");
});
client.once("error", () => {
rej2();
});
});
}
advancementsRequired = 0;
advancements.clear();
client.send("whitelist list", 0x02);
client.once("done", () => {
res(advancements);
});
});
}
client.connect();