UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

117 lines (116 loc) 12.4 kB
import { EntityLike } from "./entity/Entity.es.js"; import process from "node:process"; import { Vector3 } from "@jsprismarine/math"; import readline from "node:readline"; //#region src/Console.ts /** * Server console. */ var Console = class extends 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 (!process.stdin.setRawMode) return; process.stdin.setRawMode(true); if (typeof process.stdin.setNoDelay === "function") process.stdin.setNoDelay(true); if (typeof process.stdin.setKeepAlive === "function") process.stdin.setKeepAlive(true); process.stdin.resume(); this.cli = readline.createInterface({ input: process.stdin, output: process.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 Vector3(0, 0, 0); } getType() { return "jsprismarine:console"; } isConsole() { return true; } }; //#endregion export { Console as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uc29sZS5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvQ29uc29sZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnQGpzcHJpc21hcmluZS9tYXRoJztcbmltcG9ydCB0eXBlIHsgU2VydmVyLCBTZXJ2aWNlIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgRW50aXR5TGlrZSB9IGZyb20gJy4vZW50aXR5Lyc7XG5pbXBvcnQgdHlwZSBDaGF0RXZlbnQgZnJvbSAnLi9ldmVudHMvY2hhdC9DaGF0RXZlbnQnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBDb21wbGV0ZXJSZXN1bHQgfSBmcm9tICdub2RlOnJlYWRsaW5lJztcbmltcG9ydCByZWFkbGluZSBmcm9tICdub2RlOnJlYWRsaW5lJztcblxuLy8gRXh0ZW5kIGJ1aWx0aW4gYHJlYWRsaW5lLkludGVyZmFjZWAgdHlwZVxuZGVjbGFyZSBtb2R1bGUgJ25vZGU6cmVhZGxpbmUnIHtcbiAgICBpbnRlcmZhY2UgSW50ZXJmYWNlIHtcbiAgICAgICAgc2V0UmF3TW9kZT8obW9kZTogYm9vbGVhbik6IHZvaWQ7XG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgICAgd3JpdGU6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgIH07XG4gICAgICAgIGlucHV0OiBhbnk7XG4gICAgICAgIF9yZWZyZXNoTGluZT8oKTogdm9pZDtcbiAgICB9XG59XG5cbi8qKlxuICogU2VydmVyIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnNvbGUgZXh0ZW5kcyBFbnRpdHlMaWtlIGltcGxlbWVudHMgU2VydmljZSB7XG4gICAgcHJpdmF0ZSBjbGk/OiByZWFkbGluZS5JbnRlcmZhY2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIsIHJ1bnRpbWVJZCA9IEJpZ0ludCgtMSkpIHtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBzZXJ2ZXIuZ2V0V29ybGRNYW5hZ2VyKCkuZ2V0RGVmYXVsdFdvcmxkKCkhO1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBzZXJ2ZXIsXG4gICAgICAgICAgICBydW50aW1lSWQsXG4gICAgICAgICAgICB3b3JsZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBlbmFibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGVuYWJsZSB0aGUgY29uc29sZSB0d2ljZS5cbiAgICAgICAgaWYgKHRoaXMuY2xpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLnNldFJhd01vZGUgYXMgYW55KSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgaGVhZGxlc3MgbW9kZXMgYmV0dGVyIChlZyB1bml0IHRlc3RpbmcpLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5zZXRSYXdNb2RlKHRydWUpO1xuICAgICAgICAvLyBzZXROb0RlbGF5IGFuZCBzZXRLZWVwQWxpdmUgYXJlIE5vZGUuanMtc3BlY2lmaWMgYW5kIG5vdCBhdmFpbGFibGUgaW4gQnVuXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzcy5zdGRpbi5zZXROb0RlbGF5ID09PSAnZnVuY3Rpb24nKSBwcm9jZXNzLnN0ZGluLnNldE5vRGVsYXkodHJ1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzcy5zdGRpbi5zZXRLZWVwQWxpdmUgPT09ICdmdW5jdGlvbicpIHByb2Nlc3Muc3RkaW4uc2V0S2VlcEFsaXZlKHRydWUpO1xuICAgICAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuXG4gICAgICAgIHRoaXMuY2xpID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICAgICAgICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgICAgICAgICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgICAgICAgICAgIHRlcm1pbmFsOiB0cnVlLFxuICAgICAgICAgICAgcHJvbXB0OiAnPiAnLFxuICAgICAgICAgICAgdGFiU2l6ZTogNCxcbiAgICAgICAgICAgIHJlbW92ZUhpc3RvcnlEdXBsaWNhdGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcGxldGVyOiB0aGlzLmNvbXBsZXRlLmJpbmQodGhpcylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIub24oJ2NoYXQnLCBhc3luYyAoZXZ0OiBDaGF0RXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldnQuaXNDYW5jZWxsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShldnQuZ2V0Q2hhdCgpLmdldE1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5zZXRDb25zb2xlKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuY2xpLm9uKCdrZXlwcmVzcycsIGFzeW5jIChfLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjJzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmN0cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VydmVyLnNodXRkb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsaS5vbignbGluZScsIChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQudHJpbSgpID09PSAnJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBGaXggY3Vyc29yIHBvc2l0aW9uaW5nLlxuICAgICAgICAgICAgdGhpcy5jbGk/Lm91dHB1dC53cml0ZShgXFx4MWJbMkRgKTtcblxuICAgICAgICAgICAgdm9pZCB0aGlzLnNlcnZlci5nZXRDb21tYW5kTWFuYWdlcigpLmRpc3BhdGNoQ29tbWFuZCh0aGlzIGFzIGFueSwgdGhpcyBhcyBhbnksIGlucHV0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZGlzYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jbGk/LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY2xpPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbXBsZXRlKGxpbmU6IHN0cmluZywgY2FsbGJhY2s6IChlcnI/OiBudWxsIHwgRXJyb3IsIHJlc3VsdD86IENvbXBsZXRlclJlc3VsdCkgPT4gdm9pZCkge1xuICAgICAgICBjb25zdCBjb21tYW5kcyA9IEFycmF5LmZyb20odGhpcy5zZXJ2ZXIuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRDb21tYW5kcygpLnZhbHVlcygpKS5tYXAoXG4gICAgICAgICAgICAoY29tbWFuZCkgPT4gY29tbWFuZC5uYW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTWVyZ2UgYW5kIHJlbW92ZSBkdXBsaWNhdGVzLlxuICAgICAgICBjb25zdCBjb21wbGV0aW9ucyA9IGNvbW1hbmRzXG4gICAgICAgICAgICAucmV2ZXJzZSgpIC8vIFJldmVyc2UgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgYXQgdGhlIGVuZC5cbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXG4gICAgICAgICAgICAucmV2ZXJzZSgpOyAvLyBSZXN0b3JlLlxuXG4gICAgICAgIC8vIFRPRE86IEhhbmRsZSBhcmd1bWVudHMuXG4gICAgICAgIGNvbnN0IGhpdHMgPSBjb21wbGV0aW9ucy5maWx0ZXIoKGMpID0+IGMuc3RhcnRzV2l0aChsaW5lKSk7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBbaGl0cy5sZW5ndGggPyBoaXRzIDogY29tcGxldGlvbnMsIGxpbmVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcHJvbXB0IHRoYXQncyBwcmVmaXhlZCB3aGVuIGxvZ2dpbmcuXG4gICAgICAgIHRoaXMuY2xpPy5vdXRwdXQud3JpdGUoYFxceDFiWyR7dGhpcy5jbGkuZ2V0UHJvbXB0KCkubGVuZ3RofURgKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGluZS5cbiAgICAgICAgdGhpcy5jbGk/Lm91dHB1dC53cml0ZShgXFxyJHtsaW5lfVxcblxccmApO1xuXG4gICAgICAgIHRoaXMuY2xpPy5fcmVmcmVzaExpbmU/LigpO1xuICAgICAgICB0aGlzLmNsaT8ucHJvbXB0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdDT05TT0xFJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkVXNlcm5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdbQ09OU09MRV0nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkuaW5mbyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V29ybGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZlci5nZXRXb3JsZE1hbmFnZXIoKS5nZXREZWZhdWx0V29ybGQoKSE7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUGxheWVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzT3AoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRYKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0WSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcHVibGljIGdldFooKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBvc2l0aW9uKCk6IFZlY3RvcjMge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFR5cGUoKSB7XG4gICAgICAgIHJldHVybiAnanNwcmlzbWFyaW5lOmNvbnNvbGUnO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnNvbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUF3QkEsSUFBcUIsVUFBckIsY0FBcUMsV0FBOEI7Q0FDL0Q7Q0FFQSxZQUFtQixRQUFnQixZQUFZLE9BQU8sRUFBRSxHQUFHO0VBQ3ZELE1BQU0sUUFBUSxPQUFPLGdCQUFnQixFQUFFLGdCQUFnQjtFQUN2RCxNQUFNO0dBQ0Y7R0FDQTtHQUNBO0VBQ0osQ0FBQztDQUNMOzs7OztDQU1BLE1BQWEsU0FBd0I7RUFFakMsSUFBSSxLQUFLLEtBQUs7RUFFZCxJQUFJLENBQUMsUUFBUSxNQUFNLFlB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