UNPKG

yoni-mcscripts-lib

Version:

为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。

116 lines (115 loc) 4.34 kB
import { ChatCommand } from "./command/ChatCommand.js"; import { Command } from "./command.js"; import { EntityUtils } from "./EntityUtils.js"; import { Logger } from "./util/Logger.js"; import { listenEvent, EventPriority } from "./event.js"; import { getErrorMsg } from "./lib/console.js"; import { runTask, Minecraft } from "./basis.js"; let logger = new Logger("debug_func"); let doEval; let doEvalFunctionInitizePromise = initEvalFunction(); ChatCommand.registerPrefixCommand("$", "geval", onRequestChatEventAsEval); ChatCommand.registerPrefixCommand("$", "eval", onEvalCommand); listenEvent({ event: Minecraft.ChatSendBeforeEvent, priority: EventPriority.HIGHEST, ignoreCancelled: true }, onChatEventAsEval); async function initEvalFunction() { let generateFunctionCodeLines = []; // yoni-mcscripts-lib const yonilib = await import("./index.js"); for (const variable in yonilib) { generateFunctionCodeLines.push(`let { ${variable} } = arguments[0];`); } // util generateFunctionCodeLines.push(`let { say, send } = YoniUtils;`); // ObjectUtils const { ObjectUtils } = await import("./lib/ObjectUtils.js"); generateFunctionCodeLines.push("let { getKeys } = arguments[1];"); // timeout lib const timeoutlib = await import("./lib/Timeout.js"); for (const variable in timeoutlib) { generateFunctionCodeLines.push(`let { ${variable} } = arguments[2];`); } // memory storage const s = Object.create(null); generateFunctionCodeLines.push("let s = arguments[3];"); // logger generateFunctionCodeLines.push("let logger = arguments[4];"); // dpEval Function Code generateFunctionCodeLines.push(` let doEval = async (sender, code) => { return eval(code); } `); generateFunctionCodeLines.push("return doEval;"); let generateFunction = new Function(generateFunctionCodeLines.join("\n")); //logger.info(generateFunctionCodeLines.join("\n")); doEval = generateFunction(yonilib, ObjectUtils, timeoutlib, s, logger); } const chatAsEvalPlayers = new Set(); function onEvalCommand(sender, command, label, args) { if (!hasPermission(sender)) { sender.sendMessage("§c没有权限"); return; } let code = command.slice(command.indexOf(" ") + 1); executeEval(sender, code); } function onChatEventAsEval(event) { const player = EntityUtils.from(event.sender); if (chatAsEvalPlayers.has(player)) { event.cancel = true; executeEval(player, event.message); } } function onRequestChatEventAsEval(sender, command, label, args) { if (!hasPermission(sender)) { sender.sendMessage("§c没有权限"); return; } if (chatAsEvalPlayers.has(sender)) { sender.sendMessage("§b已关闭聊天信息直接作为代码运行"); chatAsEvalPlayers.delete(sender); } else { sender.sendMessage("§e已开启聊天信息直接作为代码运行"); runTask(() => chatAsEvalPlayers.add(sender)); } } function hasPermission(player) { return player.isOp(); } async function executeEval(sender, code) { if (!hasPermission(sender)) { sender.sendMessage("§c没有权限"); return; } sender.sendMessage("> " + code); runTask(() => doEval(sender, code) .then(onSuccess) .catch(onError)); function onSuccess(result) { globalThis._ = result; sender.sendMessage("§7" + String(result)); } function onError(error) { globalThis._error = error; sender.sendMessage("§c" + getErrorMsg(error).errMsg); } } ChatCommand.registerPrefixCommand("$", "exec", async (sender, rawCommand, label, args) => { let cmd = rawCommand.slice(label.length + 1); sender.sendMessage("/" + cmd); let rt = await sender.fetchCommand(cmd); sender.sendMessage("§7" + JSON.stringify(rt)); }); ChatCommand.registerPrefixCommand("$", "run", (sender, rawCommand, label, args) => { let cmd = rawCommand.slice(label.length + 1); sender.sendMessage("/" + cmd); let rt = Command.run(cmd); sender.sendMessage("§7" + JSON.stringify(rt)); }); doEvalFunctionInitizePromise.then(() => logger.info("debug功能已加载,使用$eval可以执行代码")) .catch((e) => logger.info("debug功能加载出现错误", e));