UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

111 lines (110 loc) • 13.3 kB
"use strict"; 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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