UNPKG

karin-plugin-timechange

Version:

Karin智能头像切换插件 - 根据时间自动在白天和晚上切换不同的头像

303 lines (301 loc) 13.9 kB
import { AvatarConfig } from "./chunk-G5C6VDKH.js"; // src/web.config.ts import { defineConfig, components } from "node-karin"; import fs from "fs"; import { logger } from "node-karin"; var avatarConfig = new AvatarConfig(); var web_config_default = defineConfig({ /** 插件信息配置 */ info: { id: "karin-plugin-timechange", name: "\u5934\u50CF\u81EA\u52A8\u5207\u6362\u63D2\u4EF6", author: { name: "Eos-Hira", home: "https://github.com/Eos-Hira/karin-plugin-timechange", avatar: "https://github.com/Eos-Hira.png" }, icon: { /** @see https://fonts.google.com/icons */ name: "face", size: 24, color: "#4F46E5" }, version: "1.0.0", description: "\u667A\u80FD\u5934\u50CF\u5207\u6362\u63D2\u4EF6 - \u6839\u636E\u65F6\u95F4\u81EA\u52A8\u5728\u767D\u5929\u548C\u665A\u4E0A\u5207\u6362\u4E0D\u540C\u7684\u5934\u50CF" }, /** 动态渲染的组件 */ components: () => { const config = avatarConfig.getConfig(); return [ // 插件标题和说明 components.divider.create("title-divider", { description: "\u{1F3AD} \u5934\u50CF\u81EA\u52A8\u5207\u6362\u914D\u7F6E", descPosition: 50 }), // 基础设置区域 components.accordion.create("basic-settings", { label: "\u2699\uFE0F \u57FA\u7840\u8BBE\u7F6E", children: [ components.accordion.createItem("basic-item", { title: "\u57FA\u7840\u914D\u7F6E", subtitle: "\u5F00\u5173\u548C\u65F6\u95F4\u6BB5\u8BBE\u7F6E", children: [ // 自动切换开关 components.switch.create("autoSwitch", { label: "\u542F\u7528\u81EA\u52A8\u5207\u6362", description: "\u5F00\u542F\u540E\u5C06\u6839\u636E\u65F6\u95F4\u81EA\u52A8\u5207\u6362\u5934\u50CF", defaultSelected: config.autoSwitch, startText: "\u5DF2\u5F00\u542F", endText: "\u5DF2\u5173\u95ED", color: "success" }), // 分隔线 components.divider.create("settings-divider", { transparent: true }), // 时间段设置 components.input.number("dayStartHour", { label: "\u767D\u5929\u5F00\u59CB\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09", placeholder: "\u8BF7\u8F93\u51650-23\u4E4B\u95F4\u7684\u6570\u5B57", description: "\u8BBE\u7F6E\u767D\u5929\u5934\u50CF\u7684\u5F00\u59CB\u65F6\u95F4\uFF0C24\u5C0F\u65F6\u5236", defaultValue: config.dayStartHour.toString(), rules: [ { min: 0, max: 23, error: "\u65F6\u95F4\u5FC5\u987B\u57280-23\u4E4B\u95F4" } ], isRequired: true }), components.input.number("nightStartHour", { label: "\u665A\u4E0A\u5F00\u59CB\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09", placeholder: "\u8BF7\u8F93\u51650-23\u4E4B\u95F4\u7684\u6570\u5B57", description: "\u8BBE\u7F6E\u665A\u4E0A\u5934\u50CF\u7684\u5F00\u59CB\u65F6\u95F4\uFF0C24\u5C0F\u65F6\u5236", defaultValue: config.nightStartHour.toString(), rules: [ { min: 0, max: 23, error: "\u65F6\u95F4\u5FC5\u987B\u57280-23\u4E4B\u95F4" } ], isRequired: true }) ] }) ] }), // 头像设置区域 components.accordion.create("avatar-settings", { label: "\u{1F5BC}\uFE0F \u5934\u50CF\u8BBE\u7F6E", children: [ components.accordion.createItem("avatar-item", { title: "\u5934\u50CF\u6587\u4EF6\u914D\u7F6E", subtitle: "\u8BBE\u7F6E\u767D\u5929\u548C\u665A\u4E0A\u4F7F\u7528\u7684\u5934\u50CF", children: [ // 头像上传说明 components.input.string("uploadTip", { label: "\u{1F4A1} \u5934\u50CF\u4E0A\u4F20\u65B9\u5F0F", defaultValue: '\u65B9\u5F0F1: \u5728\u804A\u5929\u4E2D\u53D1\u9001 "#\u4E0A\u4F20\u5934\u50CF \u767D\u5929" \u6216 "#\u4E0A\u4F20\u5934\u50CF \u665A\u4E0A" \u7136\u540E\u53D1\u9001\u56FE\u7247\n\u65B9\u5F0F2: \u5728\u4E0B\u65B9\u8F93\u5165\u6846\u4E2D\u586B\u5199\u56FE\u7247\u6587\u4EF6\u7684\u5B8C\u6574\u8DEF\u5F84', isReadOnly: true, description: "\u63A8\u8350\u4F7F\u7528\u65B9\u5F0F1\uFF0C\u66F4\u52A0\u4FBF\u6377" }), // 分隔线 components.divider.create("upload-divider", { transparent: true }), // 白天头像路径 components.input.string("dayAvatarPath", { label: "\u767D\u5929\u5934\u50CF\u6587\u4EF6\u8DEF\u5F84", placeholder: "\u8BF7\u8F93\u5165\u5934\u50CF\u6587\u4EF6\u7684\u5B8C\u6574\u8DEF\u5F84\uFF0C\u6216\u4F7F\u7528 #\u4E0A\u4F20\u5934\u50CF \u767D\u5929 \u547D\u4EE4", description: "\u652F\u6301 jpg\u3001png\u3001gif\u3001bmp\u3001webp \u683C\u5F0F\uFF0C\u5EFA\u8BAE\u5927\u5C0F\u4E0D\u8D85\u8FC75MB", defaultValue: config.dayAvatarPath, isClearable: true, rules: [ { regex: /\.(jpg|jpeg|png|gif|bmp|webp)$/i, error: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u56FE\u7247\u6587\u4EF6\u8DEF\u5F84" } ] }), // 晚上头像路径 components.input.string("nightAvatarPath", { label: "\u665A\u4E0A\u5934\u50CF\u6587\u4EF6\u8DEF\u5F84", placeholder: "\u8BF7\u8F93\u5165\u5934\u50CF\u6587\u4EF6\u7684\u5B8C\u6574\u8DEF\u5F84\uFF0C\u6216\u4F7F\u7528 #\u4E0A\u4F20\u5934\u50CF \u665A\u4E0A \u547D\u4EE4", description: "\u652F\u6301 jpg\u3001png\u3001gif\u3001bmp\u3001webp \u683C\u5F0F\uFF0C\u5EFA\u8BAE\u5927\u5C0F\u4E0D\u8D85\u8FC75MB", defaultValue: config.nightAvatarPath, isClearable: true, rules: [ { regex: /\.(jpg|jpeg|png|gif|bmp|webp)$/i, error: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u56FE\u7247\u6587\u4EF6\u8DEF\u5F84" } ] }) ] }) ] }), // 状态信息区域 components.accordion.create("status-info", { label: "\u{1F4CA} \u72B6\u6001\u4FE1\u606F", children: [ components.accordion.createItem("status-item", { title: "\u5F53\u524D\u72B6\u6001", subtitle: "\u67E5\u770B\u63D2\u4EF6\u8FD0\u884C\u72B6\u6001\u548C\u914D\u7F6E\u4FE1\u606F", children: [ // 当前时间类型显示 components.input.string("currentTimeType", { label: "\u5F53\u524D\u65F6\u6BB5", defaultValue: getCurrentTimeTypeDisplay(), isReadOnly: true, description: "\u5F53\u524D\u65F6\u95F4\u5224\u65AD\u7684\u65F6\u6BB5\u7C7B\u578B" }), // 文件状态显示 components.input.string("dayAvatarStatus", { label: "\u767D\u5929\u5934\u50CF\u72B6\u6001", defaultValue: getFileStatus(config.dayAvatarPath), isReadOnly: true, color: config.dayAvatarPath && fs.existsSync(config.dayAvatarPath) ? "success" : "danger" }), components.input.string("nightAvatarStatus", { label: "\u665A\u4E0A\u5934\u50CF\u72B6\u6001", defaultValue: getFileStatus(config.nightAvatarPath), isReadOnly: true, color: config.nightAvatarPath && fs.existsSync(config.nightAvatarPath) ? "success" : "danger" }), // 上次切换信息 components.input.string("lastSwitchInfo", { label: "\u4E0A\u6B21\u5207\u6362\u4FE1\u606F", defaultValue: getLastSwitchInfo(config), isReadOnly: true, description: "\u663E\u793A\u6700\u540E\u4E00\u6B21\u5934\u50CF\u5207\u6362\u7684\u65F6\u95F4\u548C\u7C7B\u578B" }) ] }) ] }), // 使用说明 components.divider.create("help-divider", { description: "\u{1F4A1} \u4F7F\u7528\u8BF4\u660E", descPosition: 50 }), components.accordion.create("help-info", { label: "\u{1F4D6} \u4F7F\u7528\u5E2E\u52A9", children: [ components.accordion.createItem("help-item", { title: "\u4F7F\u7528\u8BF4\u660E", subtitle: "\u5982\u4F55\u6B63\u786E\u914D\u7F6E\u548C\u4F7F\u7528\u63D2\u4EF6", children: [ components.input.string("help-text", { label: "\u914D\u7F6E\u6B65\u9AA4", defaultValue: "1. \u4E0A\u4F20\u6216\u8BBE\u7F6E\u5934\u50CF\u6587\u4EF6\n2. \u914D\u7F6E\u65F6\u95F4\u6BB5\uFF08\u53EF\u9009\uFF09\n3. \u5F00\u542F\u81EA\u52A8\u5207\u6362\n4. \u4FDD\u5B58\u914D\u7F6E", isReadOnly: true, description: "\u6309\u7167\u6B65\u9AA4\u5B8C\u6210\u914D\u7F6E\u5373\u53EF\u4F7F\u7528" }), components.input.string("commands-help", { label: "\u53EF\u7528\u547D\u4EE4", defaultValue: "#\u4E0A\u4F20\u5934\u50CF \u767D\u5929/\u665A\u4E0A - \u4E0A\u4F20\u5934\u50CF\n#\u5934\u50CF\u9884\u89C8 \u767D\u5929/\u665A\u4E0A - \u9884\u89C8\u5934\u50CF\n#\u5934\u50CF\u4FE1\u606F - \u67E5\u770B\u5934\u50CF\u6587\u4EF6\u4FE1\u606F\n#\u5220\u9664\u5934\u50CF \u767D\u5929/\u665A\u4E0A - \u5220\u9664\u5934\u50CF\n#\u5934\u50CF\u72B6\u6001 - \u67E5\u770B\u63D2\u4EF6\u72B6\u6001", isReadOnly: true, description: "\u5728\u804A\u5929\u4E2D\u4F7F\u7528\u8FD9\u4E9B\u547D\u4EE4\u7BA1\u7406\u5934\u50CF" }) ] }) ] }) ]; }, /** 前端点击保存之后调用的方法 */ save: (config) => { try { logger.info("[\u5934\u50CF\u914D\u7F6E] \u6536\u5230\u914D\u7F6E\u4FDD\u5B58\u8BF7\u6C42:", JSON.stringify(config, null, 2)); const dayStart = parseInt(config.dayStartHour); const nightStart = parseInt(config.nightStartHour); if (isNaN(dayStart) || isNaN(nightStart)) { return { success: false, message: "\u65F6\u95F4\u8BBE\u7F6E\u65E0\u6548\uFF0C\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57" }; } if (dayStart < 0 || dayStart > 23 || nightStart < 0 || nightStart > 23) { return { success: false, message: "\u65F6\u95F4\u5FC5\u987B\u57280-23\u4E4B\u95F4" }; } if (dayStart === nightStart) { return { success: false, message: "\u767D\u5929\u548C\u665A\u4E0A\u7684\u5F00\u59CB\u65F6\u95F4\u4E0D\u80FD\u76F8\u540C" }; } if (config.dayAvatarPath && !fs.existsSync(config.dayAvatarPath)) { return { success: false, message: "\u767D\u5929\u5934\u50CF\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\u8DEF\u5F84\u662F\u5426\u6B63\u786E" }; } if (config.nightAvatarPath && !fs.existsSync(config.nightAvatarPath)) { return { success: false, message: "\u665A\u4E0A\u5934\u50CF\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u68C0\u67E5\u8DEF\u5F84\u662F\u5426\u6B63\u786E" }; } avatarConfig.setAutoSwitch(config.autoSwitch || false); avatarConfig.setTimeRange(dayStart, nightStart); if (config.dayAvatarPath) { avatarConfig.setDayAvatarPath(config.dayAvatarPath); } if (config.nightAvatarPath) { avatarConfig.setNightAvatarPath(config.nightAvatarPath); } logger.info("[\u5934\u50CF\u914D\u7F6E] \u914D\u7F6E\u4FDD\u5B58\u6210\u529F"); return { success: true, message: "\u914D\u7F6E\u4FDD\u5B58\u6210\u529F\uFF01\u63D2\u4EF6\u5C06\u6839\u636E\u65B0\u914D\u7F6E\u8FD0\u884C\u3002" }; } catch (error) { logger.error("[\u5934\u50CF\u914D\u7F6E] \u4FDD\u5B58\u914D\u7F6E\u65F6\u51FA\u9519:", error); return { success: false, message: `\u4FDD\u5B58\u5931\u8D25\uFF1A${error}` }; } } }); function getCurrentTimeTypeDisplay() { const now = /* @__PURE__ */ new Date(); const hour = now.getHours(); const config = avatarConfig.getConfig(); const timeType = hour >= config.dayStartHour && hour < config.nightStartHour ? "day" : "night"; const emoji = timeType === "day" ? "\u2600\uFE0F" : "\u{1F319}"; const text = timeType === "day" ? "\u767D\u5929" : "\u665A\u4E0A"; return `${text} ${emoji} (${hour}:${now.getMinutes().toString().padStart(2, "0")})`; } function getFileStatus(filePath) { if (!filePath) { return "\u274C \u672A\u914D\u7F6E"; } if (fs.existsSync(filePath)) { const stats = fs.statSync(filePath); const sizeInMB = (stats.size / (1024 * 1024)).toFixed(2); return `\u2705 \u6587\u4EF6\u5B58\u5728 (${sizeInMB}MB)`; } else { return "\u274C \u6587\u4EF6\u4E0D\u5B58\u5728"; } } function getLastSwitchInfo(config) { if (!config.lastSwitchType || !config.lastSwitchTime) { return "\u6682\u65E0\u5207\u6362\u8BB0\u5F55"; } const date = new Date(config.lastSwitchTime); const timeStr = date.toLocaleString("zh-CN"); const typeText = config.lastSwitchType === "day" ? "\u767D\u5929\u5934\u50CF" : "\u665A\u4E0A\u5934\u50CF"; return `${timeStr} - ${typeText}`; } export { web_config_default as default };