UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

119 lines (116 loc) • 15.7 kB
import BinaryStream from '@jsprismarine/jsbinaryutils'; 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(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(); 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(); 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"); } }); } } export { QueryManager, QueryType }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlNYW5hZ2VyLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkvUXVlcnlNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB0eXBlIHsgSW5ldEFkZHJlc3MgfSBmcm9tICdAanNwcmlzbWFyaW5lL3Jha25ldCc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcblxuZXhwb3J0IGVudW0gUXVlcnlUeXBlIHtcbiAgICBIYW5kc2hha2UgPSAwLFxuICAgIFN0YXRzID0gOVxufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvblJhdyhidWZmZXI6IEJ1ZmZlciwgcmluZm86IEluZXRBZGRyZXNzKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IG1hZ2ljID0gc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBRdWVyeVR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHN0cmVhbS5yZWFkSW50KCkgJiAweDBmMGYwZjBmO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VydmVyLmdldFJha25ldCgpKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignU2VydmVyIGlzIG5vdCBzdGFydGVkJykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hZ2ljICE9PSA2NTI3Nykge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ludmFsaWQgbWFnaWMnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5VHlwZS5IYW5kc2hha2U6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZHNoYWtlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSg5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlSW50KHNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZShCdWZmZXIuZnJvbShgOTUxMzMwN1xcMGAsICdiaW5hcnknKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldFJha25ldCgpPy5zZW5kQnVmZmVyKHJlcy5nZXRCdWZmZXIoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogcmluZm8uZ2V0QWRkcmVzcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDogcmluZm8uZ2V0UG9ydCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5nZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5VHlwZS5TdGF0czoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhZGRpbmdcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTUpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExMik7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTA4KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDUpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExNik7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTEwKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTcpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwOSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTI4KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5kIHBhZGRpbmdcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXFwwJHtbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob3N0bmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldE1ldGFkYXRhKCkuZ2V0TW90ZCgpLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnYW1ldHlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTTVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2FtZV9pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSU5FQ1JBRlRQRScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0VmVyc2lvbigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBKU1ByaXNtYXJpbmUgb24gUHJpc21hcmluZSAke3RoaXMuc2VydmVyLmdldFZlcnNpb24oKX0gJHtwbHVnaW5zLmpvaW4oJzsgJyl9YCwgLy8gVE9ET1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0V29ybGRNYW5hZ2VyKCkuZ2V0RGVmYXVsdFdvcmxkKCkhLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bXBsYXllcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRNZXRhZGF0YSgpLmdldE9ubGluZVBsYXllckNvdW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhwbGF5ZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TWV0YWRhdGEoKS5nZXRNYXhQbGF5ZXJDb3VudCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9zdHBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRDb25maWcoKS5nZXRTZXJ2ZXJQb3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob3N0aXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRDb25maWcoKS5nZXRTZXJ2ZXJJcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCdcXDAnKX1cXDBcXDBgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaW5hcnknXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFkZGluZ1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExMik7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTA4KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSg5Nyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTIxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDEpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExNCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoOTUpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDApO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmQgcGFkZGluZ1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuc2VydmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBgJHtwbGF5ZXIuZ2V0TmFtZSgpfVxcMGApfVxcMGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpbmFyeSdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0UmFrbmV0KCk/LnNlbmRCdWZmZXIocmVzLmdldEJ1ZmZlcigpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiByaW5mby5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiByaW5mby5nZXRQb3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk6ICdJUHY0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZ2V0QnVmZmVyKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBRdWVyeVR5cGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlF1ZXJ5VHlwZSJdLCJtYXBwaW5ncyI6Ijs7QUFJWSxJQUFBLFNBQUEscUJBQUFBLFVBQUwsS0FBQTtBQUNILEVBQUFBLFVBQUFBLENBQUFBLFVB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