-
Notifications
You must be signed in to change notification settings - Fork 2
/
guoba.support.js
247 lines (235 loc) · 8.46 KB
/
guoba.support.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
import path from 'path'
import fs from 'fs'
import {
pluginName,
pluginNameReadable,
pluginAuthor,
pluginRepo,
pluginDesc,
pluginThemeColor,
_ResPath,
_CfgPath,
_DataPath,
} from './data/system/pluginConstants.js'
import kuroLogger from './components/logger.js'
import { sendMsgFriend } from './model/utils.js'
import cfg from '../../lib/config/config.js'
// 支持锅巴
export function supportGuoba() {
const configPath = path.join(_CfgPath, 'config.json')
const defaultConfigPath = path.join(_DataPath, 'system/default_config.json')
let configJson
getConfigFromFile()
return {
// 插件信息,将会显示在前端页面
// 如果你的插件没有在插件库里,那么需要填上补充信息
// 如果存在的话,那么填不填就无所谓了,填了就以你的信息为准
pluginInfo: {
name: pluginName,
title: pluginNameReadable,
author: pluginAuthor,
authorLink: pluginRepo,
link: pluginRepo,
isV3: true,
isV2: false,
description: pluginDesc,
// 显示图标,此为个性化配置
// 图标可在 https://icon-sets.iconify.design 这里进行搜索
icon: 'arcticons:kuro-reader',
// 图标颜色,例:#FF0000 或 rgb(255, 0, 0)
iconColor: pluginThemeColor,
// 如果想要显示成图片,也可以填写图标路径(绝对路径)
iconPath: _ResPath + '/img/common/icon/pns.png',
},
// 配置项信息
configInfo: {
// 配置项 schemas
schemas: [
{
component: 'Divider',
label: '日志设置',
},
{
field: 'logger.logLevel',
label: '日志等级',
helpMessage: '库洛插件的日志等级, 与 Yunzai 的独立',
bottomHelpMessage: '请选择日志等级, 通常应选择 info',
component: 'Select',
componentProps: {
options: [
{ label: 'debug', value: 'debug' },
{ label: 'info', value: 'info' },
{ label: 'warn', value: 'warn' },
{ label: 'error', value: 'error' },
],
placeholder: '读取失败',
},
},
{
field: 'logger.saveToFile',
label: '保存日志',
helpMessage:
'独立保存库洛插件的日志, 保存目录位于插件根目录 ./data/logs/',
bottomHelpMessage: '是否将日志保存到文件',
component: 'Switch',
},
{
component: 'Divider',
label: '自动任务设置',
},
{
field: 'autoTask.enabled',
label: '启用自动任务',
helpMessage:
'若关闭, 将一同关闭插件的检查更新任务, 但是插件每次被载入仍会检查更新',
bottomHelpMessage: '是否启用自动任务, 重启 Yunzai 生效',
component: 'Switch',
},
{
field: 'autoTask.execTime',
label: '任务执行时间',
helpMessage:
'默认为每天 00:02:00 自动执行, 暂不可配置检查更新任务(默认每天 6/18 点检查)和游戏体力推送任务(默认每小时刷新一次)',
bottomHelpMessage:
'任务执行时间, <a href="https://www.runoob.com/linux/linux-comm-crontab.html" target="_blank">corntab 表达式</a>, 请<a href="https://tool.lu/crontab/" target="_blank">检查</a>后再保存, 重启 Yunzai 生效',
component: 'Input',
},
{
component: 'Divider',
label: '其他设置',
},
{
field: 'useRandomBgInCard',
label: '随机背景图',
helpMessage: '卡片是否使用随机背景图',
bottomHelpMessage:
'背景图 API: https://api.tomys.top/api/pnsWallPaper 均为战双官方壁纸, 获取失败会回退到最后一张图或者本地背景图, 本地默认背景图: /resources/img/common/bg/Alisa-Echo_0.jpg',
component: 'Switch',
},
{
field: 'attemptSendNonFriend',
label: '发送非好友',
helpMessage: '是否尝试向非好友发送消息',
bottomHelpMessage: '是否尝试向非好友发送消息',
component: 'Switch',
},
{
field: 'botQQ',
label: '机器人QQ',
helpMessage:
'如果使用第三方适配器, 请设置, 否则 bot 的自动任务消息将无法推送, 留空则为自动获取',
bottomHelpMessage:
'如果使用第三方适配器, 请设置, 否则 bot 的自动任务消息将无法推送, 留空则为自动获取',
component: 'Input',
},
],
// 获取配置数据方法(用于前端填充显示数据)
getConfigData() {
return configJson
},
// 设置配置的方法(前端点确定后调用的方法)
setConfigData(data, { Result }) {
configJson = flattenObject(data)
kuroLogger.debug('欲保存的新配置数据:', JSON.stringify(configJson))
let saveRst = updateConfigFile()
if (saveRst) return Result.error(saveRst)
else return Result.ok({}, '保存成功辣ε(*´・ω・)з')
},
},
}
function getConfigFromFile() {
try {
// 尝试读取config.json
const rawData = fs.readFileSync(configPath)
configJson = JSON.parse(rawData)
// 读取 default_config.json
const defaultRawData = fs.readFileSync(defaultConfigPath)
const defaultConfigJson = JSON.parse(defaultRawData)
// 比较配置文件更新
let testConfigJson = mergeObjects(defaultConfigJson, configJson)
if (JSON.stringify(testConfigJson) !== JSON.stringify(configJson)) {
kuroLogger.warn('配置文件有更新, 建议检查是否有新的项目需要配置!')
kuroLogger.debug('testConfigJson:', JSON.stringify(testConfigJson))
kuroLogger.debug('configJson:', JSON.stringify(configJson))
configJson = testConfigJson
updateConfigFile()
sendMsgFriend(
cfg.masterQQ[0],
`[库洛插件] 配置文件有更新, 建议检查是否有新的项目需要配置!`
)
}
} catch (error) {
if (error.code === 'ENOENT') {
// 如果config.json不存在,则从default_config.json复制一份
kuroLogger.warn('config.json 不存在, 生成默认配置...')
const defaultRawData = fs.readFileSync(defaultConfigPath)
fs.writeFileSync(configPath, defaultRawData)
configJson = JSON.parse(defaultRawData)
} else {
// 处理其他可能的读取错误
kuroLogger.error('读取 config.json 出错:', error.message)
}
}
}
/**
* 更新配置文件
* @returns {string | null} 返回错误信息,如果成功则返回null
*/
function updateConfigFile() {
try {
fs.writeFileSync(configPath, JSON.stringify(configJson, null, 2))
kuroLogger.info('更新配置文件成功')
return null
} catch (error) {
let errMsg = '更新配置文件失败: ' + error.message
kuroLogger.error('更新配置文件失败:', errMsg)
return errMsg
}
}
/**
* 展开 json
* @param {Object} inputJson 输入的 json
* @returns {Object} 展开后的 json
*/
function flattenObject(inputJson) {
const outputJson = {}
for (const key in inputJson) {
const keys = key.split('.')
let currentObject = outputJson
for (let i = 0; i < keys.length; i++) {
const currentKey = keys[i]
if (!currentObject[currentKey]) {
currentObject[currentKey] = {}
}
if (i === keys.length - 1) {
// 最后一个键,赋予值
currentObject[currentKey] = inputJson[key]
} else {
// 还不是最后一个键,继续进入下一层对象
currentObject = currentObject[currentKey]
}
}
}
return outputJson
}
/**
* 使用 newObj 补充 oldObj 缺失的字段
* @param {Object} newObj 新对象
* @param {Object} oldObj 旧对象
* @returns {Object} 合并后的对象
*/
function mergeObjects(newObj, oldObj) {
let mergedObj = { ...oldObj }
for (const key in newObj) {
if (typeof newObj[key] === 'object') {
if (!(key in mergedObj)) {
mergedObj[key] = {}
}
mergedObj[key] = mergeObjects(newObj[key], mergedObj[key])
} else if (!(key in mergedObj)) {
mergedObj[key] = newObj[key]
}
}
return mergedObj
}
}