@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
117 lines (116 loc) • 12.4 kB
JavaScript
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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