karin-plugin-timechange
Version:
Karin智能头像切换插件 - 根据时间自动在白天和晚上切换不同的头像
303 lines (301 loc) • 13.9 kB
JavaScript
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
};