@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
128 lines (121 loc) • 16 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const BinaryStream = require('@jsprismarine/jsbinaryutils');
const _interopDefault = e => e && e.__esModule ? e : { default: e };
const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream);
var QueryType = /* @__PURE__ */ ((QueryType2) => {
QueryType2[QueryType2["Handshake"] = 0] = "Handshake";
QueryType2[QueryType2["Stats"] = 9] = "Stats";
return QueryType2;
})(QueryType || {});
class QueryManager {
server;
constructor(server) {
this.server = server;
}
async onRaw(buffer, rinfo) {
return new Promise(async (resolve, reject) => {
const stream = new BinaryStream__default.default(buffer);
const magic = stream.readUnsignedShort();
const type = stream.readByte();
const sessionId = stream.readInt() & 252645135;
if (!this.server.getRaknet()) {
reject(new Error("Server is not started"));
return;
}
if (magic !== 65277) {
reject(new Error("Invalid magic"));
return;
}
switch (type) {
case 0 /* Handshake */: {
const res = new BinaryStream__default.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 /* Stats */: {
const res = new BinaryStream__default.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);
const plugins = [];
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()} ${plugins.join("; ")}`,
// TODO
"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");
}
});
}
}
exports.QueryManager = QueryManager;
exports.QueryType = QueryType;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlNYW5hZ2VyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyeS9RdWVyeU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBJbmV0QWRkcmVzcyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuXG5leHBvcnQgZW51bSBRdWVyeVR5cGUge1xuICAgIEhhbmRzaGFrZSA9IDAsXG4gICAgU3RhdHMgPSA5XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeU1hbmFnZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUmF3KGJ1ZmZlcjogQnVmZmVyLCByaW5mbzogSW5ldEFkZHJlc3MpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgbWFnaWMgPSBzdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IFF1ZXJ5VHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gc3RyZWFtLnJlYWRJbnQoKSAmIDB4MGYwZjBmMGY7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2ZXIuZ2V0UmFrbmV0KCkpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHN0YXJ0ZWQnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWFnaWMgIT09IDY1Mjc3KSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignSW52YWxpZCBtYWdpYycpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlUeXBlLkhhbmRzaGFrZToge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kc2hha2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDkpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVJbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKEJ1ZmZlci5mcm9tKGA5NTEzMzA3XFwwYCwgJ2JpbmFyeScpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0UmFrbmV0KCk/LnNlbmRCdWZmZXIocmVzLmdldEJ1ZmZlcigpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiByaW5mby5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiByaW5mby5nZXRQb3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk6ICdJUHY0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzLmdldEJ1ZmZlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlUeXBlLlN0YXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFkZGluZ1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExNSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTEyKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwNSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTE2KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTApO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExNyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTA5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMjgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmQgcGFkZGluZ1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcXDAke1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TWV0YWRhdGEoKS5nZXRNb3RkKCksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dhbWV0eXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NNUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnYW1lX2lkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01JTkVDUkFGVFBFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRWZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEpTUHJpc21hcmluZSBvbiBQcmlzbWFyaW5lICR7dGhpcy5zZXJ2ZXIuZ2V0VmVyc2lvbigpfSAke3BsdWdpbnMuam9pbignOyAnKX1gLCAvLyBUT0RPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRXb3JsZE1hbmFnZXIoKS5nZXREZWZhdWx0V29ybGQoKSEuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtcGxheWVycycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldE1ldGFkYXRhKCkuZ2V0T25saW5lUGxheWVyQ291bnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heHBsYXllcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRNZXRhZGF0YSgpLmdldE1heFBsYXllckNvdW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob3N0cG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldENvbmZpZygpLmdldFNlcnZlclBvcnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3RpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldENvbmZpZygpLmdldFNlcnZlcklwKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcMCcpfVxcMFxcMGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpbmFyeSdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQYWRkaW5nXG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTEyKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDk3KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMjEpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwMSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTE0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSg5NSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBwYWRkaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwbGF5ZXIpID0+IGAke3BsYXllci5nZXROYW1lKCl9XFwwYCl9XFwwYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmluYXJ5J1xuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRSYWtuZXQoKT8uc2VuZEJ1ZmZlcihyZXMuZ2V0QnVmZmVyKCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHJpbmZvLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHJpbmZvLmdldFBvcnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseTogJ0lQdjQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5nZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFF1ZXJ5VHlwZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiUXVlcnlUeXBlIiwiQmluYXJ5U3RyZWFtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBSVksSUFBQSxTQUFBLHFCQUFBQSxVQUFMLEtBQUE7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