@karinjs/plugin-basic 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +31 -31
- package/dist/apps/logger.d.ts +6 -0
- package/dist/apps/logger.js +229 -0
- package/dist/apps/login.js +6 -5
- package/dist/apps/master.d.ts +3 -1
- package/dist/apps/master.js +21 -3
- package/dist/apps/restart.js +4 -3
- package/dist/apps/status.js +5 -6
- package/dist/apps/update.d.ts +4 -5
- package/dist/apps/update.js +167 -83
- package/dist/chunk-PHDIUMOH.js +127 -0
- package/dist/chunk-QUWYQJAF.js +131 -0
- package/dist/index.js +17 -0
- package/dist/web.config.d.ts +4 -0
- package/dist/web.config.js +29 -16
- package/package.json +56 -65
- package/resources/img/logger.png +0 -0
- package/resources/img/plugin.png +0 -0
- package/resources/logger/index.css +214 -0
- package/resources/logger/index.html +37 -0
- package/resources/plugins/index.css +210 -0
- package/resources/plugins/index.html +71 -0
- package/config/config.json +0 -7
- package/dist/chunk-BJBUGOWQ.js +0 -129
package/dist/apps/update.js
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cfg,
|
|
3
|
+
sendToFirstAdmin
|
|
4
|
+
} from "../chunk-PHDIUMOH.js";
|
|
5
|
+
import {
|
|
6
|
+
render
|
|
7
|
+
} from "../chunk-QUWYQJAF.js";
|
|
8
|
+
|
|
1
9
|
// src/apps/update.ts
|
|
2
|
-
import fs from "
|
|
3
|
-
import path from "
|
|
4
|
-
import { changelog, checkGitPluginUpdate, checkPkgUpdate, getCommit, getPlugins, getPkgVersion, karin, updateAllGitPlugin, updateAllPkg, updateGitPlugin, updatePkg } from "node-karin";
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { changelog, checkGitPluginUpdate, checkPkgUpdate, getCommit, getPlugins, getPkgVersion, karin, updateAllGitPlugin, updateAllPkg, updateGitPlugin, updatePkg, segment, restartDirect, db, logger, getPluginInfo } from "node-karin";
|
|
13
|
+
var NODE_KARIN_UPDATE_KEY = "basic:update:node-karin";
|
|
5
14
|
var cache = [];
|
|
6
15
|
var getAll = async () => {
|
|
7
16
|
if (cache.length) return cache;
|
|
@@ -19,19 +28,119 @@ var getAll = async () => {
|
|
|
19
28
|
return list;
|
|
20
29
|
};
|
|
21
30
|
var plugins = karin.command(/^#插件列表$/, async (e) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
try {
|
|
32
|
+
const allPlugins = await getPlugins("all", true);
|
|
33
|
+
const pluginsData = [];
|
|
34
|
+
let index = 1;
|
|
35
|
+
for (const plugin of allPlugins) {
|
|
36
|
+
if (plugin.type === "app") {
|
|
37
|
+
const apps = plugin.apps || [];
|
|
38
|
+
for (const appPath of apps) {
|
|
39
|
+
const fileName = path.basename(appPath, path.extname(appPath));
|
|
40
|
+
pluginsData.push({
|
|
41
|
+
index: index++,
|
|
42
|
+
name: fileName,
|
|
43
|
+
type: "app",
|
|
44
|
+
typeIcon: "\u{1F50C}",
|
|
45
|
+
version: "",
|
|
46
|
+
description: "",
|
|
47
|
+
author: "\u672A\u77E5",
|
|
48
|
+
dir: appPath
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
const pkgData = plugin.pkgData || {};
|
|
53
|
+
let author = "\u672A\u77E5";
|
|
54
|
+
if (typeof pkgData.author === "string") {
|
|
55
|
+
author = pkgData.author;
|
|
56
|
+
} else if (pkgData.author && typeof pkgData.author === "object" && "name" in pkgData.author) {
|
|
57
|
+
author = pkgData.author.name || "\u672A\u77E5";
|
|
58
|
+
}
|
|
59
|
+
const description = pkgData.description || "";
|
|
60
|
+
const version = pkgData.version || "";
|
|
61
|
+
const typeIcon = plugin.type === "npm" ? "\u{1F4E6}" : "\u{1F527}";
|
|
62
|
+
pluginsData.push({
|
|
63
|
+
index: index++,
|
|
64
|
+
name: plugin.name,
|
|
65
|
+
type: plugin.type,
|
|
66
|
+
typeIcon,
|
|
67
|
+
version,
|
|
68
|
+
description,
|
|
69
|
+
author,
|
|
70
|
+
dir: plugin.dir
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (pluginsData.length === 0) {
|
|
75
|
+
await e.reply("\n\u6682\u65E0\u63D2\u4EF6", { at: true });
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const img = await render("plugins/index", {
|
|
79
|
+
plugins: pluginsData,
|
|
80
|
+
total: pluginsData.length,
|
|
81
|
+
date: (/* @__PURE__ */ new Date()).toLocaleString("zh-CN")
|
|
82
|
+
});
|
|
83
|
+
await e.reply(img);
|
|
84
|
+
return true;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
logger.error("\u6E32\u67D3\u63D2\u4EF6\u5217\u8868\u5931\u8D25:", error);
|
|
87
|
+
try {
|
|
88
|
+
const list = await getAll();
|
|
89
|
+
const textList = list.map((item, index) => `${index + 1}. ${item}`);
|
|
90
|
+
await e.reply([
|
|
91
|
+
"\n\u63D2\u4EF6\u5217\u8868\uFF1A",
|
|
92
|
+
"\u66F4\u65B0\uFF1A#\u66F4\u65B0\u63D2\u4EF6 \u540D\u79F0",
|
|
93
|
+
"\u68C0\u67E5\u66F4\u65B0\uFF1A#\u68C0\u67E5\u66F4\u65B0 \u5E8F\u53F7\u6216\u540D\u79F0",
|
|
94
|
+
"\u65E5\u5FD7\uFF1A#\u66F4\u65B0\u65E5\u5FD7 \u6761\u6570 \u5E8F\u53F7\u6216\u540D\u79F0",
|
|
95
|
+
...textList
|
|
96
|
+
].join("\n"), { at: true });
|
|
97
|
+
} catch (fallbackError) {
|
|
98
|
+
logger.error("\u53D1\u9001\u6587\u672C\u63D2\u4EF6\u5217\u8868\u5931\u8D25:", fallbackError);
|
|
99
|
+
await e.reply("\n\u83B7\u53D6\u63D2\u4EF6\u5217\u8868\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u65E5\u5FD7", { at: true });
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
34
103
|
}, { name: "\u63D2\u4EF6\u5217\u8868", perm: "admin" });
|
|
104
|
+
var updatePlugin = karin.command(/^#(全部)?(强制)?更新(.*)?$/, async (e) => {
|
|
105
|
+
const [, all, force, name = "node-karin"] = e.msg.match(/^#(全部)?(强制)?更新(.*)?$/);
|
|
106
|
+
const cmd = force ? "git reset --hard && git pull --allow-unrelated-histories" : "git pull";
|
|
107
|
+
if (all) {
|
|
108
|
+
try {
|
|
109
|
+
const git = await updateAllGitPlugin(cmd);
|
|
110
|
+
const npm = await updateAllPkg();
|
|
111
|
+
await e.reply([
|
|
112
|
+
"\n\u5168\u90E8\u66F4\u65B0\u5B8C\u6210",
|
|
113
|
+
"-----",
|
|
114
|
+
git,
|
|
115
|
+
"-----",
|
|
116
|
+
npm
|
|
117
|
+
].join("\n"), { at: true });
|
|
118
|
+
} catch (error) {
|
|
119
|
+
await e.reply(`
|
|
120
|
+
\u66F4\u65B0\u5168\u90E8\u63D2\u4EF6\u5931\u8D25: ${error.message || "\u672A\u77E5\u9519\u8BEF"}`, { at: true });
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
let res;
|
|
124
|
+
if (name !== "node-karin") {
|
|
125
|
+
const info = getPluginInfo(name.trim());
|
|
126
|
+
if (!info) return await e.reply("\u63D2\u4EF6\u672A\u5B89\u88C5~", { reply: true });
|
|
127
|
+
if (info.type === "app") return await e.reply("\u5E94\u7528\u63D2\u4EF6\u4E0D\u652F\u6301\u66F4\u65B0~", { reply: true });
|
|
128
|
+
res = info.type === "git" ? await updateGitPlugin(info.dir, cmd, 120) : await updatePkg(info.name);
|
|
129
|
+
} else {
|
|
130
|
+
res = await updatePkg("node-karin");
|
|
131
|
+
}
|
|
132
|
+
if (res.status === "failed") {
|
|
133
|
+
const { data } = res;
|
|
134
|
+
const msg = typeof data === "string" ? data : `\u83B7\u53D6\u66F4\u65B0\u4FE1\u606F\u5931\u8D25: ${data.message || "\u672A\u77E5\u9519\u8BEF"}`;
|
|
135
|
+
await e.reply(`
|
|
136
|
+
${msg}`, { at: true });
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
return await e.reply(`
|
|
140
|
+
\u66F4\u65B0\u6210\u529F
|
|
141
|
+
${res.data}`, { at: true });
|
|
142
|
+
}
|
|
143
|
+
});
|
|
35
144
|
var check = karin.command(/^#检查更新/, async (e) => {
|
|
36
145
|
let name = e.msg.replace(/^#检查更新/, "").trim();
|
|
37
146
|
const index = Number(name);
|
|
@@ -94,54 +203,6 @@ ${tips}`, { at: true });
|
|
|
94
203
|
await e.reply("\n\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u63D2\u4EF6\u540D\u79F0\u6216\u5E8F\u53F7~", { at: true });
|
|
95
204
|
return true;
|
|
96
205
|
}, { name: "\u68C0\u67E5\u66F4\u65B0", perm: "admin" });
|
|
97
|
-
var update = karin.command(/^#(强制)?更新(插件)?(?!列表|日志)/, async (e) => {
|
|
98
|
-
let name = e.msg.replace(/^#(强制)?更新(插件)?(?!列表|日志)/, "").trim();
|
|
99
|
-
const index = Number(name);
|
|
100
|
-
if (index && typeof index === "number") {
|
|
101
|
-
const list = await getAll();
|
|
102
|
-
name = list[index - 1];
|
|
103
|
-
}
|
|
104
|
-
if (!name) {
|
|
105
|
-
await e.reply("\n\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u63D2\u4EF6\u540D\u79F0\u6216\u5E8F\u53F7~", { at: true });
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
if (name.includes("git:")) {
|
|
109
|
-
name = name.replace("git:", "");
|
|
110
|
-
const file = path.join(process.cwd(), "plugins", name.replace("git:", ""));
|
|
111
|
-
let cmd = "git pull";
|
|
112
|
-
if (e.msg.includes("\u5F3A\u5236")) cmd = "git reset --hard && git pull --allow-unrelated-histories";
|
|
113
|
-
const result = await updateGitPlugin(file, cmd, 120);
|
|
114
|
-
if (result.status === "failed") {
|
|
115
|
-
const { data } = result;
|
|
116
|
-
const msg = typeof data === "string" ? data : `\u83B7\u53D6\u66F4\u65B0\u4FE1\u606F\u5931\u8D25: ${data.message || "\u672A\u77E5\u9519\u8BEF"}`;
|
|
117
|
-
await e.reply(msg, { at: true });
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
await e.reply(`
|
|
121
|
-
${result.data}`, { at: true });
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
if (name.includes("npm:")) {
|
|
125
|
-
name = name.replace("npm:", "");
|
|
126
|
-
const result = await updatePkg(name);
|
|
127
|
-
if (result.status === "failed") {
|
|
128
|
-
const { data } = result;
|
|
129
|
-
const msg = typeof data === "string" ? data : `\u83B7\u53D6\u66F4\u65B0\u4FE1\u606F\u5931\u8D25: ${data.message || "\u672A\u77E5\u9519\u8BEF"}`;
|
|
130
|
-
await e.reply(`
|
|
131
|
-
${msg}`, { at: true });
|
|
132
|
-
return true;
|
|
133
|
-
}
|
|
134
|
-
const log2 = parseLog(name, result.local, result.remote);
|
|
135
|
-
await e.reply(`
|
|
136
|
-
\u66F4\u65B0\u6210\u529F
|
|
137
|
-
\u5F53\u524D\u7248\u672C: ${result.remote}
|
|
138
|
-
\u66F4\u65B0\u65E5\u5FD7:
|
|
139
|
-
${log2}`, { at: true });
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
await e.reply("\n\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u63D2\u4EF6\u540D\u79F0\u6216\u5E8F\u53F7~", { at: true });
|
|
143
|
-
return true;
|
|
144
|
-
}, { name: "\u66F4\u65B0\u63D2\u4EF6", perm: "admin" });
|
|
145
206
|
var log = karin.command(/^#更新日志/, async (e) => {
|
|
146
207
|
const [index, num] = e.msg.replace(/^#更新日志/, "").trim().split(" ");
|
|
147
208
|
if (!index || !num) {
|
|
@@ -181,24 +242,6 @@ ${result}`, { at: true });
|
|
|
181
242
|
await e.reply("\n\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u63D2\u4EF6\u540D\u79F0\u6216\u5E8F\u53F7~", { at: true });
|
|
182
243
|
return true;
|
|
183
244
|
}, { name: "\u66F4\u65B0\u65E5\u5FD7", perm: "admin" });
|
|
184
|
-
var updateAll = karin.command(/^#全部(强制)?更新$/, async (e) => {
|
|
185
|
-
const cmd = e.msg.includes("\u5F3A\u5236") ? "git reset --hard && git pull --allow-unrelated-histories" : "git pull";
|
|
186
|
-
try {
|
|
187
|
-
const git = await updateAllGitPlugin(cmd);
|
|
188
|
-
const npm = await updateAllPkg();
|
|
189
|
-
await e.reply([
|
|
190
|
-
"\n\u5168\u90E8\u66F4\u65B0\u5B8C\u6210",
|
|
191
|
-
"-----",
|
|
192
|
-
git,
|
|
193
|
-
"-----",
|
|
194
|
-
npm
|
|
195
|
-
].join("\n"), { at: true });
|
|
196
|
-
} catch (error) {
|
|
197
|
-
await e.reply(`
|
|
198
|
-
\u5168\u90E8\u66F4\u65B0\u5931\u8D25: ${error.message || "\u672A\u77E5\u9519\u8BEF"}`, { at: true });
|
|
199
|
-
}
|
|
200
|
-
return true;
|
|
201
|
-
}, { name: "\u5168\u90E8\u66F4\u65B0", perm: "admin" });
|
|
202
245
|
var parseLog = (pkg, local, count) => {
|
|
203
246
|
const file = path.join(process.cwd(), "node_modules", pkg, "CHANGELOG.md");
|
|
204
247
|
if (!fs.existsSync(file)) return "\u63D2\u4EF6\u672A\u63D0\u4F9B`CHANGELOG.md`\u6587\u4EF6";
|
|
@@ -208,10 +251,51 @@ var parseLog = (pkg, local, count) => {
|
|
|
208
251
|
}
|
|
209
252
|
return changelog.range(data, local, count) || "\u672A\u627E\u5230\u5BF9\u5E94\u7684\u66F4\u65B0\u65E5\u5FD7";
|
|
210
253
|
};
|
|
254
|
+
var TaskUpdate = karin.task("Karin-\u5B9A\u65F6\u66F4\u65B0\u68C0\u67E5", "*/10 * * * *", async () => {
|
|
255
|
+
if (process.env.NODE_ENV === "development") return true;
|
|
256
|
+
const res = await checkPkgUpdate("node-karin");
|
|
257
|
+
if (res.status !== "yes") return true;
|
|
258
|
+
const botIds = karin.getAllBotID();
|
|
259
|
+
const selfId = botIds.find((id) => id.toString() !== "console");
|
|
260
|
+
if (!selfId) return true;
|
|
261
|
+
const config = cfg.get();
|
|
262
|
+
if (config.autoupdate) {
|
|
263
|
+
const up = await updatePkg("node-karin");
|
|
264
|
+
if (up.status === "failed") {
|
|
265
|
+
await sendToFirstAdmin(selfId, [segment.text(`\u81EA\u52A8\u66F4\u65B0 node-karin \u5931\u8D25: ${String(up.data)}`)]);
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
await sendToFirstAdmin(selfId, [
|
|
269
|
+
segment.text(
|
|
270
|
+
`\u68C0\u6D4B\u5230\u63D2\u4EF6 [node-karin] \u6709\u65B0\u7248\u672C~
|
|
271
|
+
\u5DF2\u81EA\u52A8\u66F4\u65B0 (v${up.local} \u2192 v${up.remote})\uFF0C\u5373\u5C06\u91CD\u542F\u4EE5\u5E94\u7528\u66F4\u65B0`
|
|
272
|
+
)
|
|
273
|
+
]);
|
|
274
|
+
await restartDirect({ isPm2: false, reloadDeps: true });
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
const last = await db.get(NODE_KARIN_UPDATE_KEY);
|
|
278
|
+
if (last && last.lastRemote === res.remote) return true;
|
|
279
|
+
const msg = [
|
|
280
|
+
segment.text(
|
|
281
|
+
`\u68C0\u6D4B\u5230\u63D2\u4EF6 [node-karin] \u6709\u65B0\u7248\u672C~
|
|
282
|
+
\u5F53\u524D\u7248\u672C: v${res.local}
|
|
283
|
+
\u6700\u65B0\u7248\u672C: v${res.remote}
|
|
284
|
+
\u8BF7\u53D1\u9001 #\u66F4\u65B0 \u8FDB\u884C\u66F4\u65B0\u3002`
|
|
285
|
+
)
|
|
286
|
+
];
|
|
287
|
+
const messageId = await sendToFirstAdmin(selfId, msg);
|
|
288
|
+
if (!messageId) return false;
|
|
289
|
+
await db.set(NODE_KARIN_UPDATE_KEY, {
|
|
290
|
+
lastRemote: res.remote,
|
|
291
|
+
lastLocal: res.local
|
|
292
|
+
});
|
|
293
|
+
return true;
|
|
294
|
+
}, { name: "Karin-\u5B9A\u65F6\u66F4\u65B0\u68C0\u67E5", log: false });
|
|
211
295
|
export {
|
|
296
|
+
TaskUpdate,
|
|
212
297
|
check,
|
|
213
298
|
log,
|
|
214
299
|
plugins,
|
|
215
|
-
|
|
216
|
-
updateAll
|
|
300
|
+
updatePlugin
|
|
217
301
|
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
plugin
|
|
3
|
+
} from "./chunk-QUWYQJAF.js";
|
|
4
|
+
|
|
5
|
+
// src/utils/utils.ts
|
|
6
|
+
import karin, { config, logger } from "node-karin";
|
|
7
|
+
var sendToFirstAdmin = async (selfId, message) => {
|
|
8
|
+
const list = config.master();
|
|
9
|
+
let master = list[0];
|
|
10
|
+
if (master === "console") {
|
|
11
|
+
master = list[1];
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
if (!master) return false;
|
|
15
|
+
const a = await karin.sendMaster(selfId, master, message);
|
|
16
|
+
return a.messageId;
|
|
17
|
+
} catch (error) {
|
|
18
|
+
logger.bot("info", selfId, `[${master}] \u53D1\u9001\u4E3B\u52A8\u6D88\u606F\u5931\u8D25:`);
|
|
19
|
+
logger.error(error);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// src/config/config.ts
|
|
24
|
+
import fs from "fs";
|
|
25
|
+
import path from "path";
|
|
26
|
+
import { watch, filesByExt, requireFileSync, logger as logger2 } from "node-karin";
|
|
27
|
+
var Config = class {
|
|
28
|
+
/** 配置缓存 */
|
|
29
|
+
cache;
|
|
30
|
+
/** 用户配置目录 */
|
|
31
|
+
dir = plugin.ConfigDir;
|
|
32
|
+
/** 配置文件路径 */
|
|
33
|
+
configPath = path.join(this.dir, "config.json");
|
|
34
|
+
/** 默认配置 */
|
|
35
|
+
defaultConfig = {
|
|
36
|
+
status: true,
|
|
37
|
+
forward: true,
|
|
38
|
+
restartMode: true,
|
|
39
|
+
restart: true,
|
|
40
|
+
domain: "",
|
|
41
|
+
autoupdate: false,
|
|
42
|
+
autorestart: 0
|
|
43
|
+
};
|
|
44
|
+
constructor() {
|
|
45
|
+
this.init();
|
|
46
|
+
this.watchConfig();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 初始化配置文件
|
|
50
|
+
*/
|
|
51
|
+
init() {
|
|
52
|
+
if (!fs.existsSync(this.dir)) {
|
|
53
|
+
fs.mkdirSync(this.dir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
if (!fs.existsSync(this.configPath)) {
|
|
56
|
+
fs.writeFileSync(
|
|
57
|
+
this.configPath,
|
|
58
|
+
JSON.stringify(this.defaultConfig, null, 2)
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 监听配置文件变化
|
|
64
|
+
*/
|
|
65
|
+
watchConfig() {
|
|
66
|
+
setTimeout(() => {
|
|
67
|
+
const list = filesByExt(this.dir, ".json", "abs");
|
|
68
|
+
list.forEach((file) => {
|
|
69
|
+
watch(file, () => {
|
|
70
|
+
this.cache = void 0;
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}, 2e3);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 获取配置
|
|
77
|
+
* @returns 配置对象
|
|
78
|
+
*/
|
|
79
|
+
get() {
|
|
80
|
+
if (this.cache) {
|
|
81
|
+
return this.cache;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const userConfig = requireFileSync(this.configPath);
|
|
85
|
+
const result = { ...this.defaultConfig, ...userConfig };
|
|
86
|
+
this.cache = result;
|
|
87
|
+
return result;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
logger2.error("\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E:", error);
|
|
90
|
+
return { ...this.defaultConfig };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 写入配置
|
|
95
|
+
* @param config 配置对象
|
|
96
|
+
*/
|
|
97
|
+
write(config2) {
|
|
98
|
+
try {
|
|
99
|
+
const result = { ...this.defaultConfig, ...config2 };
|
|
100
|
+
this.cache = result;
|
|
101
|
+
fs.writeFileSync(this.configPath, JSON.stringify(result, null, 2));
|
|
102
|
+
} catch (error) {
|
|
103
|
+
logger2.error("\u5199\u5165\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:", error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 更新配置(合并现有配置)
|
|
109
|
+
* @param config 要更新的配置项
|
|
110
|
+
*/
|
|
111
|
+
update(config2) {
|
|
112
|
+
const current = this.get();
|
|
113
|
+
this.write({ ...current, ...config2 });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 重置为默认配置
|
|
117
|
+
*/
|
|
118
|
+
reset() {
|
|
119
|
+
this.write(this.defaultConfig);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var cfg = new Config();
|
|
123
|
+
|
|
124
|
+
export {
|
|
125
|
+
sendToFirstAdmin,
|
|
126
|
+
cfg
|
|
127
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// src/utils/dir.ts
|
|
2
|
+
import path from "path";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { karinPathBase } from "node-karin";
|
|
6
|
+
|
|
7
|
+
// package.json
|
|
8
|
+
var package_default = {
|
|
9
|
+
name: "@karinjs/plugin-basic",
|
|
10
|
+
version: "1.3.1",
|
|
11
|
+
description: "Karin\u7684\u57FA\u7840\u63D2\u4EF6,\u63D0\u4F9B\u6700\u57FA\u7840\u7684\u529F\u80FD",
|
|
12
|
+
homepage: "https://github.com/KarinJS/karin-plugin-basic",
|
|
13
|
+
bugs: {
|
|
14
|
+
url: "https://github.com/KarinJS/karin-plugin-basic/issues"
|
|
15
|
+
},
|
|
16
|
+
repository: {
|
|
17
|
+
type: "git",
|
|
18
|
+
url: "git+https://github.com/KarinJS/karin-plugin-basic.git"
|
|
19
|
+
},
|
|
20
|
+
author: "shijin",
|
|
21
|
+
type: "module",
|
|
22
|
+
main: "dist/index.js",
|
|
23
|
+
files: [
|
|
24
|
+
"dist",
|
|
25
|
+
"config",
|
|
26
|
+
"resources",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"package.json",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
scripts: {
|
|
32
|
+
build: "tsc && tsup",
|
|
33
|
+
pub: "npm publish --access public",
|
|
34
|
+
sort: "npx sort-package-json",
|
|
35
|
+
dev: "tsx src/app.ts",
|
|
36
|
+
watch: "tsx watch src/index.ts",
|
|
37
|
+
karin: "karin"
|
|
38
|
+
},
|
|
39
|
+
devDependencies: {
|
|
40
|
+
"@karinjs/plugin-puppeteer": "^1.1.2",
|
|
41
|
+
"@types/node": "^25.0.3",
|
|
42
|
+
eslint: "^9.39.2",
|
|
43
|
+
neostandard: "^0.12.2",
|
|
44
|
+
"node-karin": "^1.14.1",
|
|
45
|
+
tsup: "^8.5.1",
|
|
46
|
+
tsx: "^4.21.0",
|
|
47
|
+
typescript: "^5.9.3"
|
|
48
|
+
},
|
|
49
|
+
publishConfig: {
|
|
50
|
+
access: "public",
|
|
51
|
+
registry: "https://registry.npmjs.org"
|
|
52
|
+
},
|
|
53
|
+
karin: {
|
|
54
|
+
main: "src/index.ts",
|
|
55
|
+
apps: [
|
|
56
|
+
"dist/apps"
|
|
57
|
+
],
|
|
58
|
+
"ts-apps": [
|
|
59
|
+
"src/apps"
|
|
60
|
+
],
|
|
61
|
+
static: [
|
|
62
|
+
"resources"
|
|
63
|
+
],
|
|
64
|
+
files: [
|
|
65
|
+
"config"
|
|
66
|
+
],
|
|
67
|
+
"ts-web": "src/web.config.ts",
|
|
68
|
+
web: "dist/web.config.js"
|
|
69
|
+
},
|
|
70
|
+
dependencies: {
|
|
71
|
+
"internal-ip": "^8.0.1"
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// src/utils/dir.ts
|
|
76
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
77
|
+
var filePath = path.resolve(__filename.replace(/\\/g, "/"), "../../..");
|
|
78
|
+
if (!fs.existsSync(path.join(filePath, "package.json"))) {
|
|
79
|
+
filePath = path.resolve(__filename.replace(/\\/g, "/"), "../..");
|
|
80
|
+
}
|
|
81
|
+
var plugin = {
|
|
82
|
+
/** 插件名 */
|
|
83
|
+
name: package_default.name.replace(/\//g, "-"),
|
|
84
|
+
/** 插件版本 */
|
|
85
|
+
version: package_default.version,
|
|
86
|
+
/** 插件绝对路径 */
|
|
87
|
+
dir: filePath,
|
|
88
|
+
/** 插件 package.json */
|
|
89
|
+
pkg: package_default,
|
|
90
|
+
/** 插件在 @karinjs 中的目录 */
|
|
91
|
+
get BaseDir() {
|
|
92
|
+
return path.join(karinPathBase, this.name);
|
|
93
|
+
},
|
|
94
|
+
/** 配置文件路径 */
|
|
95
|
+
get ConfigDir() {
|
|
96
|
+
return path.join(this.BaseDir, "config");
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// src/utils/render.ts
|
|
101
|
+
import path2 from "path";
|
|
102
|
+
import { segment, karin, config } from "node-karin";
|
|
103
|
+
var copyright = `${plugin.name} ${plugin.pkg.version} - Copyright \xA9 2025 KarinJS | Powered by Karin v${config.pkg().version}`;
|
|
104
|
+
var render = async (name, params) => {
|
|
105
|
+
name = name.replace(/.html$/, "");
|
|
106
|
+
const root = path2.join(plugin.dir, "resources");
|
|
107
|
+
const img = await karin.render({
|
|
108
|
+
name: path2.basename(name),
|
|
109
|
+
type: "png",
|
|
110
|
+
file: path2.join(root, `${name}.html`),
|
|
111
|
+
data: {
|
|
112
|
+
pluResPath: `${root}/`,
|
|
113
|
+
sys: {
|
|
114
|
+
copyright
|
|
115
|
+
},
|
|
116
|
+
...params
|
|
117
|
+
},
|
|
118
|
+
pageGotoParams: {
|
|
119
|
+
waitUntil: "networkidle0"
|
|
120
|
+
},
|
|
121
|
+
setViewport: {
|
|
122
|
+
deviceScaleFactor: 3
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
return segment.image(`${img.includes("base64://") ? img : `base64://${img}`}`);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export {
|
|
129
|
+
plugin,
|
|
130
|
+
render
|
|
131
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,23 @@ import {
|
|
|
7
7
|
initStat,
|
|
8
8
|
uptime
|
|
9
9
|
} from "./chunk-ODFXVVIE.js";
|
|
10
|
+
import {
|
|
11
|
+
cfg
|
|
12
|
+
} from "./chunk-PHDIUMOH.js";
|
|
13
|
+
import {
|
|
14
|
+
plugin
|
|
15
|
+
} from "./chunk-QUWYQJAF.js";
|
|
16
|
+
|
|
17
|
+
// src/index.ts
|
|
18
|
+
import { logger, restartDirect } from "node-karin";
|
|
19
|
+
var autorestart = +cfg.get().autorestart;
|
|
20
|
+
if (autorestart && typeof autorestart === "number" && autorestart > 0) {
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
logger.info(`${logger.violet(`[\u63D2\u4EF6:${plugin.name}]`)} \u5F00\u59CB\u81EA\u52A8\u91CD\u542F...`);
|
|
23
|
+
restartDirect();
|
|
24
|
+
}, autorestart * 1e3);
|
|
25
|
+
}
|
|
26
|
+
logger.info(`${logger.violet(`[\u63D2\u4EF6:${plugin.name}]`)} ${logger.green(plugin.version)} \u521D\u59CB\u5316\u5B8C\u6210~`);
|
|
10
27
|
export {
|
|
11
28
|
MB,
|
|
12
29
|
createKey,
|
package/dist/web.config.d.ts
CHANGED
package/dist/web.config.js
CHANGED
|
@@ -1,65 +1,78 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
cfg
|
|
3
|
+
} from "./chunk-PHDIUMOH.js";
|
|
4
|
+
import {
|
|
5
|
+
plugin
|
|
6
|
+
} from "./chunk-QUWYQJAF.js";
|
|
6
7
|
|
|
7
8
|
// src/web.config.ts
|
|
8
9
|
import { components, defineConfig } from "node-karin";
|
|
9
10
|
var web_config_default = defineConfig({
|
|
10
11
|
info: {
|
|
11
|
-
id:
|
|
12
|
+
id: plugin.name,
|
|
12
13
|
name: "\u57FA\u7840\u63D2\u4EF6",
|
|
13
|
-
version:
|
|
14
|
-
description:
|
|
14
|
+
version: plugin.version,
|
|
15
|
+
description: plugin.pkg.description,
|
|
15
16
|
author: [
|
|
16
17
|
{
|
|
17
|
-
name:
|
|
18
|
+
name: plugin.pkg.author,
|
|
18
19
|
avatar: "https://github.com/sj817.png"
|
|
19
20
|
}
|
|
20
21
|
]
|
|
21
22
|
},
|
|
22
23
|
/** 动态渲染的组件 */
|
|
23
24
|
components: () => {
|
|
24
|
-
const
|
|
25
|
+
const config = cfg.get();
|
|
25
26
|
const list = [
|
|
26
27
|
components.switch.create("status", {
|
|
27
28
|
color: "success",
|
|
28
29
|
label: "\u7EDF\u8BA1\u72B6\u6001",
|
|
29
30
|
description: "\u5173\u95ED\u540E\u53EF\u964D\u4F4Eredis\u538B\u529B...",
|
|
30
|
-
defaultSelected:
|
|
31
|
+
defaultSelected: config.status
|
|
31
32
|
}),
|
|
32
33
|
components.switch.create("forward", {
|
|
33
34
|
color: "success",
|
|
34
35
|
label: "\u66F4\u65B0\u8F6C\u53D1",
|
|
35
36
|
description: "\u5168\u90E8\u66F4\u65B0\u662F\u5426\u4F7F\u7528\u8F6C\u53D1",
|
|
36
|
-
defaultSelected:
|
|
37
|
+
defaultSelected: config.forward
|
|
37
38
|
}),
|
|
38
39
|
components.switch.create("restartMode", {
|
|
39
40
|
color: "success",
|
|
40
41
|
label: "\u91CD\u542F\u65B9\u5F0F",
|
|
41
42
|
description: "\u6253\u5F00\u4E3A\u524D\u53F0\u91CD\u542F \u5173\u95ED\u4E3A\u540E\u53F0\u91CD\u542F",
|
|
42
|
-
defaultSelected:
|
|
43
|
+
defaultSelected: config.restartMode
|
|
43
44
|
}),
|
|
44
45
|
components.switch.create("restart", {
|
|
45
46
|
color: "success",
|
|
46
47
|
label: "\u81EA\u52A8\u91CD\u542F",
|
|
47
48
|
description: "\u66F4\u65B0\u5B8C\u6210\u662F\u5426\u81EA\u52A8\u91CD\u542F",
|
|
48
|
-
defaultSelected:
|
|
49
|
+
defaultSelected: config.restart
|
|
49
50
|
}),
|
|
50
51
|
components.input.string("domain", {
|
|
51
52
|
color: "success",
|
|
52
53
|
label: "\u81EA\u5B9A\u4E49\u57DF\u540D",
|
|
53
54
|
description: "Web\u767B\u5F55\u53D1\u9001\u7684\u81EA\u5B9A\u4E49\u57DF\u540D",
|
|
54
|
-
defaultValue:
|
|
55
|
+
defaultValue: config.domain,
|
|
55
56
|
isRequired: false
|
|
57
|
+
}),
|
|
58
|
+
components.switch.create("autoupdate", {
|
|
59
|
+
color: "success",
|
|
60
|
+
label: "\u81EA\u52A8\u66F4\u65B0",
|
|
61
|
+
description: "\u662F\u5426\u542F\u7528\u81EA\u52A8\u66F4\u65B0",
|
|
62
|
+
defaultSelected: config.autoupdate
|
|
63
|
+
}),
|
|
64
|
+
components.input.number("autorestart", {
|
|
65
|
+
color: "success",
|
|
66
|
+
label: "\u81EA\u52A8\u91CD\u542F\u5EF6\u8FDF\u65F6\u95F4",
|
|
67
|
+
description: "\u81EA\u52A8\u91CD\u542F\u5EF6\u8FDF\u65F6\u95F4\uFF0C\u5355\u4F4D\u79D2\uFF0C0\u8868\u793A\u4E0D\u81EA\u52A8\u91CD\u542F",
|
|
68
|
+
defaultValue: config.autorestart + ""
|
|
56
69
|
})
|
|
57
70
|
];
|
|
58
71
|
return list;
|
|
59
72
|
},
|
|
60
73
|
/** 前端点击保存之后调用的方法 */
|
|
61
|
-
save: (
|
|
62
|
-
|
|
74
|
+
save: (config) => {
|
|
75
|
+
cfg.write(config);
|
|
63
76
|
return {
|
|
64
77
|
success: true,
|
|
65
78
|
message: "\u4FDD\u5B58\u6210\u529F"
|