@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
111 lines (110 loc) • 13.3 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const require_runtime = require("../_virtual/_rolldown/runtime.cjs.cjs");
let _jsprismarine_jsbinaryutils = require("@jsprismarine/jsbinaryutils");
_jsprismarine_jsbinaryutils = require_runtime.__toESM(_jsprismarine_jsbinaryutils, 1);
//#region src/query/QueryManager.ts
var QueryType = /* @__PURE__ */ function(QueryType) {
QueryType[QueryType["Handshake"] = 0] = "Handshake";
QueryType[QueryType["Stats"] = 9] = "Stats";
return QueryType;
}({});
var QueryManager = class {
server;
constructor(server) {
this.server = server;
}
async onRaw(buffer, rinfo) {
return new Promise(async (resolve, reject) => {
const stream = new _jsprismarine_jsbinaryutils.default(buffer);
const magic = stream.readUnsignedShort();
const type = stream.readByte();
const sessionId = stream.readInt() & 252645135;
if (!this.server.getRaknet()) {
reject(/* @__PURE__ */ new Error("Server is not started"));
return;
}
if (magic !== 65277) {
reject(/* @__PURE__ */ new Error("Invalid magic"));
return;
}
switch (type) {
case 0: {
const res = new _jsprismarine_jsbinaryutils.default();
res.writeByte(9);
res.writeInt(sessionId);
res.write(Buffer.from(`9513307\0`, "binary"));
this.server.getRaknet()?.sendBuffer(res.getBuffer(), {
address: rinfo.getAddress(),
port: rinfo.getPort(),
family: "IPv4",
size: 0
});
resolve(res.getBuffer());
return;
}
case 9: {
const res = new _jsprismarine_jsbinaryutils.default();
res.writeByte(0);
res.writeByte(115);
res.writeByte(112);
res.writeByte(108);
res.writeByte(105);
res.writeByte(116);
res.writeByte(110);
res.writeByte(117);
res.writeByte(109);
res.writeByte(0);
res.writeByte(128);
res.writeByte(0);
res.write(Buffer.from(`\0${[
"hostname",
this.server.getMetadata().getMotd(),
"gametype",
"SMP",
"game_id",
"MINECRAFTPE",
"version",
this.server.getVersion(),
"plugins",
`JSPrismarine on Prismarine ${this.server.getVersion()} ${[].join("; ")}`,
"map",
this.server.getWorldManager().getDefaultWorld().getName(),
"numplayers",
this.server.getMetadata().getOnlinePlayerCount(),
"maxplayers",
this.server.getMetadata().getMaxPlayerCount(),
"hostport",
this.server.getConfig().getServerPort(),
"hostip",
this.server.getConfig().getServerIp()
].join("\0")}\0\0`, "binary"));
res.writeByte(1);
res.writeByte(112);
res.writeByte(108);
res.writeByte(97);
res.writeByte(121);
res.writeByte(101);
res.writeByte(114);
res.writeByte(95);
res.writeByte(0);
res.writeByte(0);
res.write(Buffer.from(`${this.server.getSessionManager().getAllPlayers().map((player) => `${player.getName()}\0`)}\0`, "binary"));
this.server.getRaknet()?.sendBuffer(res.getBuffer(), {
address: rinfo.getAddress(),
port: rinfo.getPort(),
family: "IPv4",
size: 0
});
resolve(res.getBuffer());
return;
}
default: throw new Error("Invalid QueryType");
}
});
}
};
//#endregion
exports.QueryManager = QueryManager;
exports.QueryType = QueryType;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlNYW5hZ2VyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L1F1ZXJ5TWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgdHlwZSB7IEluZXRBZGRyZXNzIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5cbmV4cG9ydCBlbnVtIFF1ZXJ5VHlwZSB7XG4gICAgSGFuZHNoYWtlID0gMCxcbiAgICBTdGF0cyA9IDlcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5TWFuYWdlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2ZXI6IFNlcnZlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25SYXcoYnVmZmVyOiBCdWZmZXIsIHJpbmZvOiBJbmV0QWRkcmVzcyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBtYWdpYyA9IHN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpO1xuICAgICAgICAgICAgY29uc3QgdHlwZTogUXVlcnlUeXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSBzdHJlYW0ucmVhZEludCgpICYgMHgwZjBmMGYwZjtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNlcnZlci5nZXRSYWtuZXQoKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1NlcnZlciBpcyBub3Qgc3RhcnRlZCcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtYWdpYyAhPT0gNjUyNzcpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdJbnZhbGlkIG1hZ2ljJykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBRdWVyeVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRzaGFrZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoOSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUludChzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGUoQnVmZmVyLmZyb20oYDk1MTMzMDdcXDBgLCAnYmluYXJ5JykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRSYWtuZXQoKT8uc2VuZEJ1ZmZlcihyZXMuZ2V0QnVmZmVyKCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHJpbmZvLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHJpbmZvLmdldFBvcnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseTogJ0lQdjQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZ2V0QnVmZmVyKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSBRdWVyeVR5cGUuU3RhdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBQYWRkaW5nXG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTE1KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTIpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwOCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTA1KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTYpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTE3KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDkpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDApO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEyOCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBwYWRkaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxcMCR7W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9zdG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRNZXRhZGF0YSgpLmdldE1vdGQoKSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2FtZXR5cGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU01QJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dhbWVfaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUlORUNSQUZUUEUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldFZlcnNpb24oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgSlNQcmlzbWFyaW5lIG9uIFByaXNtYXJpbmUgJHt0aGlzLnNlcnZlci5nZXRWZXJzaW9uKCl9ICR7cGx1Z2lucy5qb2luKCc7ICcpfWAsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldFdvcmxkTWFuYWdlcigpLmdldERlZmF1bHRXb3JsZCgpIS5nZXROYW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1wbGF5ZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TWV0YWRhdGEoKS5nZXRPbmxpbmVQbGF5ZXJDb3VudCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4cGxheWVycycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldE1ldGFkYXRhKCkuZ2V0TWF4UGxheWVyQ291bnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3Rwb3J0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0Q29uZmlnKCkuZ2V0U2VydmVyUG9ydCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9zdGlwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0Q29uZmlnKCkuZ2V0U2VydmVySXAoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignXFwwJyl9XFwwXFwwYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmluYXJ5J1xuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBhZGRpbmdcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTIpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwOCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoOTcpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEyMSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTQpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDk1KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5kIHBhZGRpbmdcblxuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLnNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBsYXllcikgPT4gYCR7cGxheWVyLmdldE5hbWUoKX1cXDBgKX1cXDBgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaW5hcnknXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldFJha25ldCgpPy5zZW5kQnVmZmVyKHJlcy5nZXRCdWZmZXIoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogcmluZm8uZ2V0QWRkcmVzcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDogcmluZm8uZ2V0UG9ydCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzLmdldEJ1ZmZlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUXVlcnlUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBSUEsSUFBWSxZQUFMLHlCQUFBLFdBQUE7Q0FDSCxVQUFBLFVBQUEsZUFBQSxLQUFBO0NBQ0EsVUFBQSxV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