87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
import {Rcon, PacketType} from "./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
|
|
);
|
|
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 1000ms.")
|
|
if(rconReconnectTimeout) {
|
|
clearTimeout(rconReconnectTimeout);
|
|
}
|
|
rconReconnectTimeout = setTimeout(() => {
|
|
client.connect()
|
|
}, 1000)
|
|
})
|
|
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<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", PacketType.COMMAND);
|
|
client.once("done", () => {
|
|
res(advancements);
|
|
});
|
|
});
|
|
}
|
|
|
|
client.connect();
|