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