see_leaderboard_bot/advancementAPI.ts

87 lines
2.2 KiB
TypeScript
Raw Normal View History

2024-07-01 11:13:27 +00:00
import {Rcon, PacketType} from "./rcon";
2024-07-01 10:30:52 +00:00
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
);
2024-07-07 22:21:07 +00:00
let rconReconnectTimeout: Timer | null | undefined;
2024-07-01 10:30:52 +00:00
client.on("connect", () => {
console.log("RCON connected.");
});
client.on("auth", () => {
console.log("RCON authenicated.");
authenicated = true;
});
2024-07-07 22:21:07 +00:00
client.on("end", () => {
console.log("RCON ended. Reconnecting in 1000ms.")
if(rconReconnectTimeout) {
clearTimeout(rconReconnectTimeout);
}
rconReconnectTimeout = setTimeout(() => {
client.connect()
}, 1000)
})
2024-07-01 10:30:52 +00:00
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];
2024-07-01 11:13:27 +00:00
client.send(`scoreboard players get ${name} bac_advancements`, PacketType.COMMAND);
2024-07-01 10:30:52 +00:00
}, 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();
2024-07-01 11:13:27 +00:00
client.send("whitelist list", PacketType.COMMAND);
2024-07-01 10:30:52 +00:00
client.once("done", () => {
res(advancements);
});
});
}
client.connect();