UNPKG

@kotori-bot/kotori-plugin-core

Version:

core plugin

302 lines (301 loc) 13.2 kB
/** * @Package @kotori-bot/kotori-plugin-core * @Version 1.5.2 * @Author Hotaru <me@hotaru.icu> * @Copyright 2024-2025 Hotaru. All rights reserved. * @License GPL-3.0 * @Link https://github.com/kotorijs/kotori * @Date 2026/2/14 16:26:20 */ "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var index_exports = {}; __export(index_exports, { config: () => config, lang: () => lang, main: () => main }); module.exports = __toCommonJS(index_exports); var import_kotori_bot = require("kotori-bot"); const lang = [__dirname, "../locales"]; const config = import_kotori_bot.Tsu.Object({ alias: import_kotori_bot.Tsu.String().optional().describe("Menu command alias"), keywords: import_kotori_bot.Tsu.Array(import_kotori_bot.Tsu.String()).default(["\u83DC\u5355", "\u529F\u80FD"]).describe("Menu command shortcuts"), content: import_kotori_bot.Tsu.String().optional().describe("Custom menu command content") }); function main(ctx, cfg) { ctx.on("before_command", (data) => { if (data.command.meta.options.some((val) => val.realname === "help" || val.name === "H")) return; if ([" --help", " -H", " -h"].some((val) => data.raw.includes(val))) { data.cancel(); ctx.emit( "on_message", Object.assign(data.session, { message: /* @__PURE__ */ kotoriHTs("text", null, `${data.session.api.adapter.config.commandPrefix}help ${data.command.meta.root}`) }) ); return; } const quick = data.session.quick.bind(data.session); if (!(data.result instanceof import_kotori_bot.CommandError)) { const { scope, access } = data.command.meta; if (scope && scope !== "all" && data.session.type !== scope) { quick("corei18n.template.scope"); data.cancel(); } else if (String(data.session.userId) !== String(data.session.api.adapter.config.master)) { if (access === import_kotori_bot.UserAccess.ADMIN) { quick("corei18n.template.no_access_admin"); data.cancel(); } else if (access === import_kotori_bot.UserAccess.MANGER && (data.session.type === import_kotori_bot.MessageScope.PRIVATE || data.session.type === import_kotori_bot.MessageScope.GROUP && !["owner", "admin"].includes(data.session.sender.role))) { quick("corei18n.template.no_access_manger"); data.cancel(); } } return; } data.cancel(); const { value } = data.result; switch (value.type) { case "arg_error": quick(["corei18n.template.args_error", [value.index, value.expected, value.reality]]); break; case "arg_few": quick(["corei18n.template.args_few", [value.expected, value.reality]]); break; case "arg_many": quick(["corei18n.template.args_many", [value.expected, value.reality]]); break; case "option_error": quick(["corei18n.template.option_error", [value.target, value.expected, value.reality]]); break; case "syntax": quick(["corei18n.template.syntax", [value.index, value.char]]); break; default: } }); if (cfg.content) { const cmd = ctx.command("menu - core.descr.menu").shortcut(cfg.keywords).action((_, session) => session.format(String(cfg.content), { at: session.userId })); if (cfg.alias) cmd.alias(cfg.alias); } ctx.on("command", ({ result, session }) => { if (!(result instanceof import_kotori_bot.CommandError)) return; const { value } = result; const quick = session.quick.bind(session); switch (value.type) { case "unknown": quick(["corei18n.template.unknown", [value.input]]); break; case "res_error": quick(["corei18n.template.res_error", [value.error.message]]); break; case "num_error": quick("corei18n.template.num_error"); break; case "no_access_manger": quick("corei18n.template.no_access_manger"); break; case "no_access_admin": quick("corei18n.template.no_access_admin"); break; case "disable": quick("corei18n.template.disable"); break; case "exists": quick(["corei18n.template.exists", [value.target]]); break; case "no_exists": quick(["corei18n.template.no_exists", [value.target]]); break; case "error": ctx.emit("error", value.error instanceof Error ? value.error : new import_kotori_bot.ModuleError(String(value.error))); if (value.error instanceof import_kotori_bot.TsuError) { quick(["corei18n.template.res_error", [value.error.message]]); return; } if (value.error instanceof Error) { quick(["corei18n.template.error", [`${value.error.name} ${value.error.message}`]]); return; } if (typeof value.error === "object") { quick(["corei18n.template.error", [JSON.stringify(value.error)]]); return; } quick(["corei18n.template.error", [String(value.error)]]); break; case "data_error": quick([`corei18n.template.data_error.${typeof value.target === "string" ? "options" : "args"}`, [value.target]]); break; default: } }); ctx.command("core - core.descr.core").action((_, session) => { const { config: config2, baseDir, options } = session.api.adapter.ctx; const botsLength = Array.from(ctx[import_kotori_bot.Symbols.bot].values()).map((set) => Array.from(set.values()).length).reduce((a, b) => a + b, 0); return session.format("core.msg.core", { lang: config2.global.lang, root: baseDir.root, mode: options.mode, modules: ctx[import_kotori_bot.Symbols.modules] ? ctx[import_kotori_bot.Symbols.modules].size : 0, services: ctx[import_kotori_bot.Symbols.adapter].size, bots: botsLength, midwares: ctx[import_kotori_bot.Symbols.midware].size, commands: ctx[import_kotori_bot.Symbols.command].size, regexps: ctx[import_kotori_bot.Symbols.regexp].size }); }); ctx.command("bot - core.descr.bot").action((_, session) => { const { identity, platform, selfId, config: config2, status } = session.api.adapter; return session.format("core.msg.bot", { identity, lang: config2.lang, platform, self_id: selfId, create_time: session.i18n.time(status.createTime), last_msg_time: status.lastMsgTime ? session.i18n.time(status.lastMsgTime) : "", received_msg: status.receivedMsg, sent_msg: status.sentMsg, offline_times: status.offlineTimes }); }); ctx.command("bots - core.descr.bots").action( (_, session) => session.format("core.msg.bots", { list: Array.from(ctx[import_kotori_bot.Symbols.bot].values()).map( (bots) => Array.from(bots.values()).map( ({ adapter: { identity, platform, config: config2, status } }) => session.format("core.msg.bots.list", { identity, lang: config2.lang, platform, status: status.value }) ).join("") ).join("") }) ); ctx.command("about - core.descr.about").alias("version").shortcut(["\u5C0F\u9E1F", "\u5C0F\u9CE5", "\u3053\u3068\u308A", "kotori", "Kotori"]).hide().action((_, session) => { const { version, license, coreVersion, loaderVersion } = session.api.adapter.ctx.meta; return session.format("core.msg.about", { version, license, core_version: coreVersion, loader_version: loaderVersion, node_version: process.version }); }); ctx.command("locale <lang> - core.descr.locale").option("G", "global:boolean core.option.locale.global").action(({ args: [lang2], options: { global } }, session) => { const { adapter } = session.api; if (!["en_US", "ja_JP", "zh_CN", "zh_TW"].includes(lang2)) return "core.msg.locale.invalid"; if (global) { adapter.ctx.root.config.global.lang = lang2; for (const apis of adapter.ctx[import_kotori_bot.Symbols.bot].values()) { for (const { adapter: adapter2 } of apis.values()) adapter2.config.lang = lang2; } } else { adapter.config.lang = lang2; } return session.format(`core.msg.locale${global ? ".global" : ""}`, { lang: lang2 }); }); ctx.command("module [name] - core.descr.module").action(({ args: [name] }, session) => { let modulesList = Array.from(ctx[import_kotori_bot.Symbols.modules].values()); if (name) { modulesList = modulesList.filter(([{ pkg }]) => pkg.name.startsWith(name)); if (modulesList.length === 0) return session.format("core.msg.module.not_found", { name }); } return session.format("core.msg.module", { list: modulesList.map( ([{ pkg }]) => session.format("core.msg.module.list", { name: pkg.name, version: pkg.version, description: pkg.description }) ).join("") }); }); ctx.command("restart - core.descr.restart").access(import_kotori_bot.UserAccess.ADMIN).action(async (_, session) => { if (!ctx.options.isDaemon) { session.quick("core.msg.restart.not_daemon"); return; } await session.quick("core.msg.restart"); setTimeout(() => process.exit(233), 1); }); ctx.command("help [...command] - core.descr.help").action((data, session) => { const args = data.args.join(" "); const filterResult = []; for (const command of ctx[import_kotori_bot.Symbols.command]) { if (command.meta.hide) continue; if (!command.meta.root.startsWith(args) && !command.meta.alias.some((alias) => alias.startsWith(args))) continue; filterResult.push(command.meta); } if (filterResult.length === 0) return "core.msg.descr.fail"; let commands = ""; const short = filterResult.length === 1; for (const cmd of filterResult) { const alias = cmd.alias.length > 0 ? session.format("core.template.alias", { content: cmd.alias.join(session.i18n.locale("core.template.alias.delimiter")) }) : ""; let args2 = ""; let options = ""; const handle = (values) => { for (const value of values) { let defaultValue = ""; if ("rest" in value) { const valueType = typeof value.default; if (valueType === "string" || valueType === "number") { defaultValue = session.format("core.template.default", { content: value.default }); } else if (valueType === "boolean") { defaultValue = session.format("core.template.default", { content: value.default ? "true" : "false" }); } args2 += session.format(`core.template.arg.${value.optional ? "optional" : "required"}`, { name: value.rest ? `...${value.name}` : value.name, type: value.type === "string" ? "" : session.format("core.template.arg.type", { content: value.type }), default: defaultValue }); } if (!("realname" in value) || !("description" in value)) return; options += session.format("core.template.option", { name: value.name, realname: value.realname, type: value.type === "string" ? "" : session.format("core.template.arg.type", { content: value.type }), description: value.description ? session.format("core.template.description", { content: session.i18n.locale(value.description) }) : "" }); } }; handle(cmd.args); if (short) handle(cmd.options); if (options) options = session.format("core.template.options", { content: options }); commands += session.format(`core.msg.descr.command${short ? "2" : ""}`, { root: `${session.api.adapter.config.commandPrefix}${cmd.root}`, args: args2, description: cmd.description ? session.format("core.template.description", { content: session.i18n.locale(cmd.description) }) : "", options, help: cmd.help && short ? session.format("core.template.help", { content: session.i18n.locale(cmd.help) }) : "", alias: short ? alias : "", shortcuts: cmd.shortcut.length > 0 ? session.format("core.template.shortcuts", { content: cmd.shortcut.join(session.i18n.locale("core.template.alias.delimiter")) }) : "" }); } return short ? commands : session.format("core.msg.help", { content: commands }); }); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { config, lang, main });