import {Rcon, PacketType} from "./rcon"; import config from "./config.json" assert { type: "json" }; const advancements = new Map(); 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 ); let rconReconnectTimeout: Timer | null | undefined; client.on("connect", () => { console.log("RCON connected."); }); client.on("auth", () => { console.log("RCON authenicated."); authenicated = true; }); client.on("end", () => { console.log("RCON ended. Reconnecting in 2000ms.") if(rconReconnectTimeout) { clearTimeout(rconReconnectTimeout); } rconReconnectTimeout = setTimeout(() => { client.connect() }, 2000) }) 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`, PacketType.COMMAND); }, 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> { 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", PacketType.COMMAND); client.once("done", () => { res(advancements); }); }); } client.connect();