UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

125 lines (124 loc) • 13 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const require_runtime = require("./_virtual/_rolldown/runtime.cjs.cjs"); const require_entity_Entity = require("./entity/Entity.cjs.cjs"); let node_process = require("node:process"); node_process = require_runtime.__toESM(node_process, 1); let _jsprismarine_math = require("@jsprismarine/math"); let node_readline = require("node:readline"); node_readline = require_runtime.__toESM(node_readline, 1); //#region src/Console.ts /** * Server console. */ var Console = class extends require_entity_Entity.EntityLike { cli; constructor(server, runtimeId = BigInt(-1)) { const world = server.getWorldManager().getDefaultWorld(); super({ server, runtimeId, world }); } /** * On enable hook. * @group Lifecycle */ async enable() { if (this.cli) return; if (!node_process.default.stdin.setRawMode) return; node_process.default.stdin.setRawMode(true); if (typeof node_process.default.stdin.setNoDelay === "function") node_process.default.stdin.setNoDelay(true); if (typeof node_process.default.stdin.setKeepAlive === "function") node_process.default.stdin.setKeepAlive(true); node_process.default.stdin.resume(); this.cli = node_readline.default.createInterface({ input: node_process.default.stdin, output: node_process.default.stdout, terminal: true, prompt: "> ", tabSize: 4, removeHistoryDuplicates: true, completer: this.complete.bind(this) }); this.server.on("chat", async (evt) => { if (evt.isCancelled()) return; await this.sendMessage(evt.getChat().getMessage()); }); this.server.getLogger().setConsole(this); this.cli.on("keypress", async (_, key) => { switch (key.name) { case "c": if (key.ctrl) await this.server.shutdown(); break; default: break; } }); this.cli.on("line", (input) => { if (input.trim() === "") return; this.cli?.output.write(`\x1b[2D`); this.server.getCommandManager().dispatchCommand(this, this, input); }); } /** * On disable hook. * @group Lifecycle */ async disable() { this.cli?.close(); this.cli?.removeAllListeners(); } async complete(line, callback) { const completions = Array.from(this.server.getCommandManager().getCommands().values()).map((command) => command.name).reverse().filter((value, index, self) => self.indexOf(value) === index).reverse(); const hits = completions.filter((c) => c.startsWith(line)); return callback(null, [hits.length ? hits : completions, line]); } write(line) { this.cli?.output.write(`\x1b[${this.cli.getPrompt().length}D`); this.cli?.output.write(`\r${line}\n\r`); this.cli?._refreshLine?.(); this.cli?.prompt(); } getName() { return "CONSOLE"; } getFormattedUsername() { return "[CONSOLE]"; } async sendMessage(message) { this.server.getLogger().info(message); } getWorld() { return this.server.getWorldManager().getDefaultWorld(); } isPlayer() { return false; } isOp() { return true; } getX() { return 0; } getY() { return 0; } getZ() { return 0; } getPosition() { return new _jsprismarine_math.Vector3(0, 0, 0); } getType() { return "jsprismarine:console"; } isConsole() { return true; } }; //#endregion exports.default = Console; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uc29sZS5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9Db25zb2xlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICdAanNwcmlzbWFyaW5lL21hdGgnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXIsIFNlcnZpY2UgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBFbnRpdHlMaWtlIH0gZnJvbSAnLi9lbnRpdHkvJztcbmltcG9ydCB0eXBlIENoYXRFdmVudCBmcm9tICcuL2V2ZW50cy9jaGF0L0NoYXRFdmVudCc7XG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IENvbXBsZXRlclJlc3VsdCB9IGZyb20gJ25vZGU6cmVhZGxpbmUnO1xuaW1wb3J0IHJlYWRsaW5lIGZyb20gJ25vZGU6cmVhZGxpbmUnO1xuXG4vLyBFeHRlbmQgYnVpbHRpbiBgcmVhZGxpbmUuSW50ZXJmYWNlYCB0eXBlXG5kZWNsYXJlIG1vZHVsZSAnbm9kZTpyZWFkbGluZScge1xuICAgIGludGVyZmFjZSBJbnRlcmZhY2Uge1xuICAgICAgICBzZXRSYXdNb2RlPyhtb2RlOiBib29sZWFuKTogdm9pZDtcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgX3JlZnJlc2hMaW5lPygpOiB2b2lkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTZXJ2ZXIgY29uc29sZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uc29sZSBleHRlbmRzIEVudGl0eUxpa2UgaW1wbGVtZW50cyBTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGNsaT86IHJlYWRsaW5lLkludGVyZmFjZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlciwgcnVudGltZUlkID0gQmlnSW50KC0xKSkge1xuICAgICAgICBjb25zdCB3b3JsZCA9IHNlcnZlci5nZXRXb3JsZE1hbmFnZXIoKS5nZXREZWZhdWx0V29ybGQoKSE7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIHNlcnZlcixcbiAgICAgICAgICAgIHJ1bnRpbWVJZCxcbiAgICAgICAgICAgIHdvcmxkXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGVuYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgZW5hYmxlIHRoZSBjb25zb2xlIHR3aWNlLlxuICAgICAgICBpZiAodGhpcy5jbGkpIHJldHVybjtcblxuICAgICAgICBpZiAoIXByb2Nlc3Muc3RkaW4uc2V0UmF3TW9kZSBhcyBhbnkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBoZWFkbGVzcyBtb2RlcyBiZXR0ZXIgKGVnIHVuaXQgdGVzdGluZykuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLnN0ZGluLnNldFJhd01vZGUodHJ1ZSk7XG4gICAgICAgIC8vIHNldE5vRGVsYXkgYW5kIHNldEtlZXBBbGl2ZSBhcmUgTm9kZS5qcy1zcGVjaWZpYyBhbmQgbm90IGF2YWlsYWJsZSBpbiBCdW5cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzLnN0ZGluLnNldE5vRGVsYXkgPT09ICdmdW5jdGlvbicpIHByb2Nlc3Muc3RkaW4uc2V0Tm9EZWxheSh0cnVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzLnN0ZGluLnNldEtlZXBBbGl2ZSA9PT0gJ2Z1bmN0aW9uJykgcHJvY2Vzcy5zdGRpbi5zZXRLZWVwQWxpdmUodHJ1ZSk7XG4gICAgICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG5cbiAgICAgICAgdGhpcy5jbGkgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgICAgICAgICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgICAgICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICAgICAgICAgICAgdGVybWluYWw6IHRydWUsXG4gICAgICAgICAgICBwcm9tcHQ6ICc+ICcsXG4gICAgICAgICAgICB0YWJTaXplOiA0LFxuICAgICAgICAgICAgcmVtb3ZlSGlzdG9yeUR1cGxpY2F0ZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wbGV0ZXI6IHRoaXMuY29tcGxldGUuYmluZCh0aGlzKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlcnZlci5vbignY2hhdCcsIGFzeW5jIChldnQ6IENoYXRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2dC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKGV2dC5nZXRDaGF0KCkuZ2V0TWVzc2FnZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpLnNldENvbnNvbGUodGhpcyk7XG5cbiAgICAgICAgdGhpcy5jbGkub24oJ2tleXByZXNzJywgYXN5bmMgKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChrZXkubmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2MnOiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuY3RybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xpLm9uKCdsaW5lJywgKGlucHV0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dC50cmltKCkgPT09ICcnKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIEZpeCBjdXJzb3IgcG9zaXRpb25pbmcuXG4gICAgICAgICAgICB0aGlzLmNsaT8ub3V0cHV0LndyaXRlKGBcXHgxYlsyRGApO1xuXG4gICAgICAgICAgICB2b2lkIHRoaXMuc2VydmVyLmdldENvbW1hbmRNYW5hZ2VyKCkuZGlzcGF0Y2hDb21tYW5kKHRoaXMgYXMgYW55LCB0aGlzIGFzIGFueSwgaW5wdXQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBkaXNhYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNsaT8uY2xvc2UoKTtcbiAgICAgICAgdGhpcy5jbGk/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29tcGxldGUobGluZTogc3RyaW5nLCBjYWxsYmFjazogKGVycj86IG51bGwgfCBFcnJvciwgcmVzdWx0PzogQ29tcGxldGVyUmVzdWx0KSA9PiB2b2lkKSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRzID0gQXJyYXkuZnJvbSh0aGlzLnNlcnZlci5nZXRDb21tYW5kTWFuYWdlcigpLmdldENvbW1hbmRzKCkudmFsdWVzKCkpLm1hcChcbiAgICAgICAgICAgIChjb21tYW5kKSA9PiBjb21tYW5kLm5hbWVcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNZXJnZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMuXG4gICAgICAgIGNvbnN0IGNvbXBsZXRpb25zID0gY29tbWFuZHNcbiAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gUmV2ZXJzZSB0byByZW1vdmUgZHVwbGljYXRlcyBhdCB0aGUgZW5kLlxuICAgICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleClcbiAgICAgICAgICAgIC5yZXZlcnNlKCk7IC8vIFJlc3RvcmUuXG5cbiAgICAgICAgLy8gVE9ETzogSGFuZGxlIGFyZ3VtZW50cy5cbiAgICAgICAgY29uc3QgaGl0cyA9IGNvbXBsZXRpb25zLmZpbHRlcigoYykgPT4gYy5zdGFydHNXaXRoKGxpbmUpKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIFtoaXRzLmxlbmd0aCA/IGhpdHMgOiBjb21wbGV0aW9ucywgbGluZV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZShsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9tcHQgdGhhdCdzIHByZWZpeGVkIHdoZW4gbG9nZ2luZy5cbiAgICAgICAgdGhpcy5jbGk/Lm91dHB1dC53cml0ZShgXFx4MWJbJHt0aGlzLmNsaS5nZXRQcm9tcHQoKS5sZW5ndGh9RGApO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBsaW5lLlxuICAgICAgICB0aGlzLmNsaT8ub3V0cHV0LndyaXRlKGBcXHIke2xpbmV9XFxuXFxyYCk7XG5cbiAgICAgICAgdGhpcy5jbGk/Ll9yZWZyZXNoTGluZT8uKCk7XG4gICAgICAgIHRoaXMuY2xpPy5wcm9tcHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0NPTlNPTEUnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRVc2VybmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ1tDT05TT0xFXSc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5pbmZvKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRXb3JsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmdldFdvcmxkTWFuYWdlcigpLmdldERlZmF1bHRXb3JsZCgpITtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQbGF5ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRZKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0WigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UG9zaXRpb24oKTogVmVjdG9yMyB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMygwLCAwLCAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuICdqc3ByaXNtYXJpbmU6Y29uc29sZSc7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29uc29sZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLElBQXFCLFVBQXJCLGNBQXFDLHNCQUFBLFdBQThCO0NBQy9EO0NBRUEsWUFBbUIsUUFBZ0IsWUFBWSxPQUFPLEVBQUUsR0FBRztFQUN2RCxNQUFNLFFBQVEsT0FBTyxnQkFBZ0IsRUFBRSxnQkFBZ0I7RUFDdkQsTUFBTTtHQUNGO0dBQ0E7R0FDQTtFQUNKLENBQUM7Q0FDTDs7Ozs7Q0FNQSxNQUFhLFNBQXdCO0VBRWpDLElBQUksS0FBSyxLQUFLO0VBRWQsSUFBSSxD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