@atri-bot/core 1.1.0 → 1.1.2
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/dist/index.d.ts +8 -8
- package/dist/index.js +4 -574
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -116,14 +116,14 @@ declare abstract class BasePlugin<TConfig extends object = object> {
|
|
|
116
116
|
getDefaultConfig(): TConfig;
|
|
117
117
|
getUnregHandlers(): UnRegHandler[];
|
|
118
118
|
getPluginName(): string;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
119
|
+
regCommandEvent<Opts extends CommandContext = CommandContext>(options: AutoInferCommandEndPoint<Opts>): () => void;
|
|
120
|
+
regCommandEvent<Opts extends CommandContext = CommandContext>(options: RemoveField<CommandEvent<Opts, 'message'>, 'pluginName' | 'type'>): () => void;
|
|
121
|
+
regMessageEvent(options: AutoInferMessageEndPoint): () => void;
|
|
122
|
+
regMessageEvent(options: RemoveField<MessageEvent<'message'>, 'pluginName' | 'type'>): () => void;
|
|
123
|
+
regRequestEvent(options: AutoInferRequestEndPoint): () => void;
|
|
124
|
+
regRequestEvent(options: RemoveField<RequestEvent<'request'>, 'pluginName' | 'type'>): () => void;
|
|
125
|
+
regNoticeEvent(options: AutoInferNoticeEndPoint): () => void;
|
|
126
|
+
regNoticeEvent(options: RemoveField<NoticeEvent<'notice'>, 'pluginName' | 'type'>): () => void;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
type BotConfig = {
|
package/dist/index.js
CHANGED
|
@@ -1,578 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import path from "path";
|
|
5
|
-
|
|
6
|
-
// src/bot.ts
|
|
7
|
-
import { InjectLogger, Logger, LogLevel } from "@huan_kong/logger";
|
|
8
|
-
import { CommanderError } from "commander";
|
|
9
|
-
import { NCWebsocket, Structs } from "node-napcat-ts";
|
|
10
|
-
|
|
11
|
-
// src/utils.ts
|
|
12
|
-
function performanceCounter() {
|
|
13
|
-
const startTime = performance.now();
|
|
14
|
-
return () => {
|
|
15
|
-
const endTime = performance.now();
|
|
16
|
-
return (endTime - startTime).toFixed(2);
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
function sortObjectArray(arr, property, sortType = "up") {
|
|
20
|
-
return arr.sort((a, b) => {
|
|
21
|
-
if (a[property] > b[property]) return sortType === "up" ? 1 : -1;
|
|
22
|
-
if (a[property] < b[property]) return sortType === "up" ? -1 : 1;
|
|
23
|
-
return 0;
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
function getImportItemName(importFunction) {
|
|
27
|
-
const match = importFunction.toString().match(/import\(([^)]+)\)/);
|
|
28
|
-
return match ? match[1].replace(/['"]/g, "") : "\u83B7\u53D6\u5931\u8D25";
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// src/bot.ts
|
|
32
|
-
var Bot = class _Bot extends InjectLogger {
|
|
33
|
-
ws;
|
|
34
|
-
config;
|
|
35
|
-
events = {
|
|
36
|
-
command: [],
|
|
37
|
-
message: [],
|
|
38
|
-
notice: [],
|
|
39
|
-
request: []
|
|
40
|
-
};
|
|
41
|
-
constructor(config, ws) {
|
|
42
|
-
super({ level: config.debug ? LogLevel.DEBUG : config.logLevel });
|
|
43
|
-
this.ws = ws;
|
|
44
|
-
this.config = config;
|
|
45
|
-
if (config.debug) {
|
|
46
|
-
ws.on("api.preSend", (context) => this.logger.DEBUG("\u53D1\u9001API\u8BF7\u6C42", context));
|
|
47
|
-
ws.on("api.response.success", (context) => this.logger.DEBUG("\u6536\u5230API\u6210\u529F\u54CD\u5E94", context));
|
|
48
|
-
ws.on("api.response.failure", (context) => this.logger.DEBUG("\u6536\u5230API\u5931\u8D25\u54CD\u5E94", context));
|
|
49
|
-
ws.on("message", (context) => this.logger.DEBUG("\u6536\u5230\u6D88\u606F:", context));
|
|
50
|
-
ws.on("request", (context) => this.logger.DEBUG("\u6536\u5230\u8BF7\u6C42:", context));
|
|
51
|
-
ws.on("notice", (context) => this.logger.DEBUG("\u6536\u5230\u901A\u77E5:", context));
|
|
52
|
-
}
|
|
53
|
-
ws.on("message", async (context) => {
|
|
54
|
-
const endpoint = `message.${context.message_type}.${context.sub_type}`;
|
|
55
|
-
const isAdmin = this.config.adminId.includes(context.user_id);
|
|
56
|
-
const isReply = context.message[0].type === "reply";
|
|
57
|
-
for (const event of this.events.message) {
|
|
58
|
-
if (endpoint.includes(event.endPoint ?? "message") && (event.needReply ? isReply : true) && (event.needAdmin ? isAdmin : true) && (event.regexp ? event.regexp.test(context.raw_message) : true)) {
|
|
59
|
-
try {
|
|
60
|
-
const result = await event.callback({ context });
|
|
61
|
-
if (result === "quit") {
|
|
62
|
-
this.logger.DEBUG(`\u63D2\u4EF6 ${event.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
} catch (error) {
|
|
66
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${event.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`, error);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
for (const event of this.events.command) {
|
|
71
|
-
if (endpoint.includes(event.endPoint ?? "message") && (event.needAdmin ? isAdmin : true) && (event.needReply ? isReply : true)) {
|
|
72
|
-
const [retCode, dataOrMessage] = this.parseCommand(
|
|
73
|
-
context.raw_message,
|
|
74
|
-
event.commandName,
|
|
75
|
-
event.commander
|
|
76
|
-
);
|
|
77
|
-
if (retCode === 1) continue;
|
|
78
|
-
if (retCode === 2) {
|
|
79
|
-
await this.sendMsg(context, [Structs.text(dataOrMessage)]);
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
const { prefix, commandName, params, args } = dataOrMessage;
|
|
83
|
-
try {
|
|
84
|
-
const result = await event.callback({
|
|
85
|
-
context,
|
|
86
|
-
prefix,
|
|
87
|
-
commandName,
|
|
88
|
-
params,
|
|
89
|
-
args
|
|
90
|
-
});
|
|
91
|
-
if (result === "quit") {
|
|
92
|
-
this.logger.DEBUG(`\u63D2\u4EF6 ${event.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
} catch (error) {
|
|
96
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${event.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`, error);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
ws.on("request", async (context) => {
|
|
102
|
-
const endpoint = `request.${context.request_type}.${"sub_type" in context ? context.sub_type : ""}`;
|
|
103
|
-
for (const event of this.events.request) {
|
|
104
|
-
if (endpoint.includes(event.endPoint ?? "request")) {
|
|
105
|
-
try {
|
|
106
|
-
const result = await event.callback({ context });
|
|
107
|
-
if (result === "quit") {
|
|
108
|
-
this.logger.DEBUG(`\u63D2\u4EF6 ${event.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
} catch (error) {
|
|
112
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${event.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`, error);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
ws.on("notice", async (context) => {
|
|
118
|
-
let endpoint = `notice.${context.notice_type}.${"sub_type" in context ? context.sub_type : ""}`;
|
|
119
|
-
if (context.notice_type === "notify") {
|
|
120
|
-
if (context.sub_type === "input_status") {
|
|
121
|
-
endpoint += `.${context.group_id !== 0 ? "group" : "friend"}`;
|
|
122
|
-
} else if (context.sub_type === "poke") {
|
|
123
|
-
endpoint += `.${"group_id" in context ? "group" : "friend"}`;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
for (const event of this.events.notice) {
|
|
127
|
-
if (endpoint.includes(event.endPoint ?? "notice")) {
|
|
128
|
-
try {
|
|
129
|
-
const result = await event.callback({ context });
|
|
130
|
-
if (result === "quit") {
|
|
131
|
-
this.logger.DEBUG(`\u63D2\u4EF6 ${event.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
} catch (error) {
|
|
135
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${event.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`, error);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
this.logger.INFO(`Bot \u521D\u59CB\u5316\u5B8C\u6210`);
|
|
141
|
-
}
|
|
142
|
-
static async init(config) {
|
|
143
|
-
return new Promise((resolve, reject) => {
|
|
144
|
-
const logger = new Logger({
|
|
145
|
-
title: "Bot",
|
|
146
|
-
level: config.debug ? LogLevel.DEBUG : config.logLevel
|
|
147
|
-
});
|
|
148
|
-
const ws = new NCWebsocket({
|
|
149
|
-
...config.connection,
|
|
150
|
-
reconnection: config.reconnection
|
|
151
|
-
});
|
|
152
|
-
let getElapsedTimeMs = performanceCounter();
|
|
153
|
-
ws.on("socket.connecting", (context) => {
|
|
154
|
-
getElapsedTimeMs = performanceCounter();
|
|
155
|
-
logger.INFO(
|
|
156
|
-
`\u8FDE\u63A5\u4E2D [#${context.reconnection.nowAttempts}/${context.reconnection.attempts}]`
|
|
157
|
-
);
|
|
158
|
-
});
|
|
159
|
-
ws.on("socket.error", (context) => {
|
|
160
|
-
logger.ERROR(
|
|
161
|
-
`\u8FDE\u63A5\u5931\u8D25 [#${context.reconnection.nowAttempts}/${context.reconnection.attempts}]`
|
|
162
|
-
);
|
|
163
|
-
logger.ERROR(`\u9519\u8BEF\u4FE1\u606F:`, context);
|
|
164
|
-
if (context.error_type === "response_error") {
|
|
165
|
-
logger.ERROR(`NapCat \u670D\u52A1\u7AEF\u8FD4\u56DE\u9519\u8BEF, \u53EF\u80FD\u662F AccessToken \u9519\u8BEF`);
|
|
166
|
-
process.exit(1);
|
|
167
|
-
}
|
|
168
|
-
if (context.reconnection.nowAttempts >= context.reconnection.attempts) {
|
|
169
|
-
reject(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${context.reconnection.attempts}\u6B21!`);
|
|
170
|
-
throw new Error(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${context.reconnection.attempts}\u6B21!`);
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
ws.on("socket.open", async (context) => {
|
|
174
|
-
logger.INFO(
|
|
175
|
-
`\u8FDE\u63A5\u6210\u529F [#${context.reconnection.nowAttempts}/${context.reconnection.attempts}]`
|
|
176
|
-
);
|
|
177
|
-
logger.INFO(`\u8FDE\u63A5 NapCat \u8017\u65F6: ${getElapsedTimeMs()}ms`);
|
|
178
|
-
resolve(new _Bot(config, ws));
|
|
179
|
-
});
|
|
180
|
-
ws.connect();
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* 注册事件
|
|
185
|
-
*/
|
|
186
|
-
regEvent(_options) {
|
|
187
|
-
const options = { ..._options, priority: _options.priority ?? 1 };
|
|
188
|
-
switch (options.type) {
|
|
189
|
-
case "command":
|
|
190
|
-
this.events.command = sortObjectArray([...this.events.command, options], "priority", "down");
|
|
191
|
-
return () => {
|
|
192
|
-
const index = this.events.command.indexOf(options);
|
|
193
|
-
if (index !== -1) this.events.command.splice(index, 1);
|
|
194
|
-
};
|
|
195
|
-
case "message":
|
|
196
|
-
this.events.message = sortObjectArray([...this.events.message, options], "priority", "down");
|
|
197
|
-
return () => {
|
|
198
|
-
const index = this.events.message.indexOf(options);
|
|
199
|
-
if (index !== -1) this.events.message.splice(index, 1);
|
|
200
|
-
};
|
|
201
|
-
case "notice":
|
|
202
|
-
this.events.notice = sortObjectArray([...this.events.notice, options], "priority", "down");
|
|
203
|
-
return () => {
|
|
204
|
-
const index = this.events.notice.indexOf(options);
|
|
205
|
-
if (index !== -1) this.events.notice.splice(index, 1);
|
|
206
|
-
};
|
|
207
|
-
case "request":
|
|
208
|
-
this.events.request = sortObjectArray([...this.events.request, options], "priority", "down");
|
|
209
|
-
return () => {
|
|
210
|
-
const index = this.events.request.indexOf(options);
|
|
211
|
-
if (index !== -1) this.events.request.splice(index, 1);
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* 解析命令
|
|
217
|
-
* @param rawMessage 原始消息
|
|
218
|
-
* @param commandName 命令名称
|
|
219
|
-
* @param command 命令对象
|
|
220
|
-
* @returns 解析结果
|
|
221
|
-
*/
|
|
222
|
-
parseCommand(rawMessage, commandName, command) {
|
|
223
|
-
const firstChar = rawMessage.charAt(0);
|
|
224
|
-
const prefix = this.config.prefix.find((p) => p === firstChar);
|
|
225
|
-
if (!prefix) return [1, "\u672A\u5339\u914D\u5230\u524D\u7F00"];
|
|
226
|
-
const parts = rawMessage.split(" ");
|
|
227
|
-
if (parts.length === 0) return [1, "\u547D\u4EE4\u4FE1\u606F\u672A\u7A7A"];
|
|
228
|
-
const cmdName = parts[0].slice(prefix.length);
|
|
229
|
-
const args = parts.slice(1).filter((arg) => arg !== "");
|
|
230
|
-
if (commandName !== "*" && (typeof commandName === "string" && commandName !== cmdName || commandName instanceof RegExp && cmdName.match(commandName) === null)) {
|
|
231
|
-
return [1, "\u547D\u4EE4\u540D\u4E0D\u5339\u914D"];
|
|
232
|
-
}
|
|
233
|
-
if (command) {
|
|
234
|
-
try {
|
|
235
|
-
const parsedCommand = command.configureOutput({ writeErr: () => {
|
|
236
|
-
}, writeOut: () => {
|
|
237
|
-
} }).exitOverride().parse(args, { from: "user" });
|
|
238
|
-
return [
|
|
239
|
-
0,
|
|
240
|
-
{
|
|
241
|
-
prefix,
|
|
242
|
-
commandName: cmdName,
|
|
243
|
-
params: parsedCommand.opts(),
|
|
244
|
-
args: parsedCommand.processedArgs
|
|
245
|
-
}
|
|
246
|
-
];
|
|
247
|
-
} catch (error) {
|
|
248
|
-
if (error instanceof CommanderError) {
|
|
249
|
-
if (error.code === "commander.helpDisplayed") {
|
|
250
|
-
const helpInformation = this.getCommandHelpInformation(commandName.toString());
|
|
251
|
-
return [2, helpInformation ?? ""];
|
|
252
|
-
}
|
|
253
|
-
error.message = error.message.replace("error:", "\u9519\u8BEF:").replace("unknown option", "\u672A\u77E5\u9009\u9879").replace("missing required argument", "\u7F3A\u5C11\u5FC5\u8981\u53C2\u6570").replace("too many arguments", "\u53C2\u6570\u8FC7\u591A").replace("invalid argument", "\u65E0\u6548\u53C2\u6570").replace("option '", "\u9009\u9879 '").replace("argument missing", "\u7F3A\u5C11\u53C2\u6570").replace("Did you mean", "\u4F60\u662F\u60F3\u8981");
|
|
254
|
-
return [
|
|
255
|
-
2,
|
|
256
|
-
error.message + (error.message.includes("\u4F60\u662F\u60F3\u8981") ? "" : "\n(\u4F7F\u7528 -h \u83B7\u53D6\u5E2E\u52A9\u4FE1\u606F)")
|
|
257
|
-
];
|
|
258
|
-
} else {
|
|
259
|
-
this.logger.ERROR(error);
|
|
260
|
-
return [2, error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"];
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
return [
|
|
265
|
-
0,
|
|
266
|
-
{
|
|
267
|
-
prefix,
|
|
268
|
-
commandName: cmdName,
|
|
269
|
-
params: {},
|
|
270
|
-
args: []
|
|
271
|
-
}
|
|
272
|
-
];
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* 获取命令信息
|
|
276
|
-
* @param command 命令对象
|
|
277
|
-
* @param fallback 后备值
|
|
278
|
-
* @param field 字段名
|
|
279
|
-
* @returns 命令信息
|
|
280
|
-
*/
|
|
281
|
-
getCommandInfo(command, fallback, field = "name") {
|
|
282
|
-
const commandInfo = command[field]().replace("/", "");
|
|
283
|
-
return commandInfo === "" || commandInfo === "program" ? fallback : commandInfo;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* 获取命令帮助信息
|
|
287
|
-
* @param commandName 命令名称
|
|
288
|
-
*/
|
|
289
|
-
getCommandHelpInformation(commandName) {
|
|
290
|
-
const foundEvent = this.events.command.find((cmd) => cmd.commandName.toString() === commandName);
|
|
291
|
-
if (!foundEvent || !foundEvent.commander) return void 0;
|
|
292
|
-
const resolvedCommandName = this.getCommandInfo(
|
|
293
|
-
foundEvent.commander,
|
|
294
|
-
foundEvent.commandName.toString()
|
|
295
|
-
);
|
|
296
|
-
const defaultPrefix = this.config.prefix[0];
|
|
297
|
-
const helpInformation = foundEvent.commander.name(
|
|
298
|
-
resolvedCommandName.includes(defaultPrefix) ? resolvedCommandName : `${defaultPrefix}${resolvedCommandName}`
|
|
299
|
-
).helpOption("-h, --help", "\u5C55\u793A\u5E2E\u52A9\u4FE1\u606F").helpInformation().replace("default:", "\u9ED8\u8BA4\u503C:").replace("Arguments:", "\u53C2\u6570:").replace("Options:", "\u9009\u9879:").replace("Usage:", "\u7528\u6CD5:");
|
|
300
|
-
return helpInformation;
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* 发送普通消息
|
|
304
|
-
*/
|
|
305
|
-
async sendMsg(context, message, { reply = true, at = true } = {}) {
|
|
306
|
-
try {
|
|
307
|
-
if (context.message_type === "private") {
|
|
308
|
-
return await this.ws.send_private_msg({ user_id: context.user_id, message });
|
|
309
|
-
} else {
|
|
310
|
-
const prefix = [];
|
|
311
|
-
if (reply && context.message_id) prefix.push(Structs.reply(context.message_id));
|
|
312
|
-
if (at && context.user_id) prefix.push(Structs.at(context.user_id), Structs.text("\n"));
|
|
313
|
-
message = [...prefix, ...message];
|
|
314
|
-
return await this.ws.send_group_msg({ group_id: context.group_id, message });
|
|
315
|
-
}
|
|
316
|
-
} catch {
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* 发送合并转发
|
|
322
|
-
*/
|
|
323
|
-
async sendForwardMsg(context, message) {
|
|
324
|
-
try {
|
|
325
|
-
if (context.message_type === "private") {
|
|
326
|
-
return await this.ws.send_private_forward_msg({
|
|
327
|
-
user_id: context.user_id,
|
|
328
|
-
message
|
|
329
|
-
});
|
|
330
|
-
} else {
|
|
331
|
-
return await this.ws.send_group_forward_msg({
|
|
332
|
-
group_id: context.group_id,
|
|
333
|
-
message
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
} catch {
|
|
337
|
-
return null;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* 判断是否是机器人的好友
|
|
342
|
-
*/
|
|
343
|
-
async isFriend(context) {
|
|
344
|
-
return this.ws.get_friend_list().then((res) => res.find((value) => value.user_id === context.user_id));
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* 获取用户名
|
|
348
|
-
*/
|
|
349
|
-
async getUsername(context) {
|
|
350
|
-
if ("group_id" in context) {
|
|
351
|
-
return this.ws.get_group_member_info({ group_id: context.group_id, user_id: context.user_id }).then((res) => res.nickname);
|
|
352
|
-
} else {
|
|
353
|
-
return this.ws.get_stranger_info({ user_id: context.user_id }).then((res) => res.nickname);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
// src/atri.ts
|
|
359
|
-
var ATRI = class _ATRI extends InjectLogger2 {
|
|
360
|
-
config;
|
|
361
|
-
configDir;
|
|
362
|
-
bot;
|
|
363
|
-
loadedPlugins = {};
|
|
364
|
-
loadPluginHooks = {};
|
|
365
|
-
constructor(config, bot) {
|
|
366
|
-
super({ level: config.debug ? LogLevel2.DEBUG : config.logLevel });
|
|
367
|
-
this.config = config;
|
|
368
|
-
this.bot = bot;
|
|
369
|
-
this.configDir = config.configDir ?? path.join(config.baseDir, "config");
|
|
370
|
-
this.logger.INFO(`ATRI \u521D\u59CB\u5316\u5B8C\u6210`);
|
|
371
|
-
}
|
|
372
|
-
static async init(config) {
|
|
373
|
-
if (config.debug) config.logLevel = LogLevel2.DEBUG;
|
|
374
|
-
const logger = new Logger2({
|
|
375
|
-
title: "ATRI",
|
|
376
|
-
level: config.debug ? LogLevel2.DEBUG : config.logLevel
|
|
377
|
-
});
|
|
378
|
-
if (!config.disableClearTerminal) console.log("\x1Bc");
|
|
379
|
-
if (!config.disableStartupMessage) {
|
|
380
|
-
console.log(
|
|
381
|
-
`%c __ .__
|
|
1
|
+
import{InjectLogger as w,Logger as I,LogLevel as f}from"@huan_kong/logger";import m from"fs";import h from"path";import{InjectLogger as O,Logger as T,LogLevel as R}from"@huan_kong/logger";import{CommanderError as x}from"commander";import{NCWebsocket as P,Structs as d}from"node-napcat-ts";function c(){let g=performance.now();return()=>(performance.now()-g).toFixed(2)}function u(g,e,t="up"){return g.sort((n,o)=>n[e]>o[e]?t==="up"?1:-1:n[e]<o[e]?t==="up"?-1:1:0)}function C(g){let e=g.toString().match(/import\(([^)]+)\)/);return e?e[1].replace(/['"]/g,""):"\u83B7\u53D6\u5931\u8D25"}var p=class g extends O{ws;config;events={command:[],message:[],notice:[],request:[]};constructor(e,t){super({level:e.debug?R.DEBUG:e.logLevel}),this.ws=t,this.config=e,e.debug&&(t.on("api.preSend",n=>this.logger.DEBUG("\u53D1\u9001API\u8BF7\u6C42",n)),t.on("api.response.success",n=>this.logger.DEBUG("\u6536\u5230API\u6210\u529F\u54CD\u5E94",n)),t.on("api.response.failure",n=>this.logger.DEBUG("\u6536\u5230API\u5931\u8D25\u54CD\u5E94",n)),t.on("message",n=>this.logger.DEBUG("\u6536\u5230\u6D88\u606F:",n)),t.on("request",n=>this.logger.DEBUG("\u6536\u5230\u8BF7\u6C42:",n)),t.on("notice",n=>this.logger.DEBUG("\u6536\u5230\u901A\u77E5:",n))),t.on("message",async n=>{let o=`message.${n.message_type}.${n.sub_type}`,s=this.config.adminId.includes(n.user_id),i=n.message[0].type==="reply";for(let r of this.events.message)if(o.includes(r.endPoint??"message")&&(!r.needReply||i)&&(!r.needAdmin||s)&&(!r.regexp||r.regexp.test(n.raw_message)))try{if(await r.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${r.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(l){this.logger.ERROR(`\u63D2\u4EF6 ${r.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,l)}for(let r of this.events.command)if(o.includes(r.endPoint??"message")&&(!r.needAdmin||s)&&(!r.needReply||i)){let[l,a]=this.parseCommand(n.raw_message,r.commandName,r.commander);if(l===1)continue;if(l===2){await this.sendMsg(n,[d.text(a)]);continue}let{prefix:y,commandName:E,params:N,args:k}=a;try{if(await r.callback({context:n,prefix:y,commandName:E,params:N,args:k})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${r.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(v){this.logger.ERROR(`\u63D2\u4EF6 ${r.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,v)}}}),t.on("request",async n=>{let o=`request.${n.request_type}.${"sub_type"in n?n.sub_type:""}`;for(let s of this.events.request)if(o.includes(s.endPoint??"request"))try{if(await s.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${s.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(i){this.logger.ERROR(`\u63D2\u4EF6 ${s.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,i)}}),t.on("notice",async n=>{let o=`notice.${n.notice_type}.${"sub_type"in n?n.sub_type:""}`;n.notice_type==="notify"&&(n.sub_type==="input_status"?o+=`.${n.group_id!==0?"group":"friend"}`:n.sub_type==="poke"&&(o+=`.${"group_id"in n?"group":"friend"}`));for(let s of this.events.notice)if(o.includes(s.endPoint??"notice"))try{if(await s.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${s.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(i){this.logger.ERROR(`\u63D2\u4EF6 ${s.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,i)}}),this.logger.INFO("Bot \u521D\u59CB\u5316\u5B8C\u6210")}static async init(e){return new Promise((t,n)=>{let o=new T({title:"Bot",level:e.debug?R.DEBUG:e.logLevel}),s=new P({...e.connection,reconnection:e.reconnection}),i=c();s.on("socket.connecting",r=>{i=c(),o.INFO(`\u8FDE\u63A5\u4E2D [#${r.reconnection.nowAttempts}/${r.reconnection.attempts}]`)}),s.on("socket.error",r=>{if(o.ERROR(`\u8FDE\u63A5\u5931\u8D25 [#${r.reconnection.nowAttempts}/${r.reconnection.attempts}]`),o.ERROR("\u9519\u8BEF\u4FE1\u606F:",r),r.error_type==="response_error"&&(o.ERROR("NapCat \u670D\u52A1\u7AEF\u8FD4\u56DE\u9519\u8BEF, \u53EF\u80FD\u662F AccessToken \u9519\u8BEF"),process.exit(1)),r.reconnection.nowAttempts>=r.reconnection.attempts)throw n(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${r.reconnection.attempts}\u6B21!`),new Error(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${r.reconnection.attempts}\u6B21!`)}),s.on("socket.open",async r=>{o.INFO(`\u8FDE\u63A5\u6210\u529F [#${r.reconnection.nowAttempts}/${r.reconnection.attempts}]`),o.INFO(`\u8FDE\u63A5 NapCat \u8017\u65F6: ${i()}ms`),t(new g(e,s))}),s.connect()})}regEvent(e){let t={...e,priority:e.priority??1};switch(t.type){case"command":return this.events.command=u([...this.events.command,t],"priority","down"),()=>{let n=this.events.command.indexOf(t);n!==-1&&this.events.command.splice(n,1)};case"message":return this.events.message=u([...this.events.message,t],"priority","down"),()=>{let n=this.events.message.indexOf(t);n!==-1&&this.events.message.splice(n,1)};case"notice":return this.events.notice=u([...this.events.notice,t],"priority","down"),()=>{let n=this.events.notice.indexOf(t);n!==-1&&this.events.notice.splice(n,1)};case"request":return this.events.request=u([...this.events.request,t],"priority","down"),()=>{let n=this.events.request.indexOf(t);n!==-1&&this.events.request.splice(n,1)}}}parseCommand(e,t,n){let o=e.charAt(0),s=this.config.prefix.find(a=>a===o);if(!s)return[1,"\u672A\u5339\u914D\u5230\u524D\u7F00"];let i=e.split(" ");if(i.length===0)return[1,"\u547D\u4EE4\u4FE1\u606F\u672A\u7A7A"];let r=i[0].slice(s.length),l=i.slice(1).filter(a=>a!=="");if(t!=="*"&&(typeof t=="string"&&t!==r||t instanceof RegExp&&r.match(t)===null))return[1,"\u547D\u4EE4\u540D\u4E0D\u5339\u914D"];if(n)try{let a=n.configureOutput({writeErr:()=>{},writeOut:()=>{}}).exitOverride().parse(l,{from:"user"});return[0,{prefix:s,commandName:r,params:a.opts(),args:a.processedArgs}]}catch(a){return a instanceof x?a.code==="commander.helpDisplayed"?[2,this.getCommandHelpInformation(t.toString())??""]:(a.message=a.message.replace("error:","\u9519\u8BEF:").replace("unknown option","\u672A\u77E5\u9009\u9879").replace("missing required argument","\u7F3A\u5C11\u5FC5\u8981\u53C2\u6570").replace("too many arguments","\u53C2\u6570\u8FC7\u591A").replace("invalid argument","\u65E0\u6548\u53C2\u6570").replace("option '","\u9009\u9879 '").replace("argument missing","\u7F3A\u5C11\u53C2\u6570").replace("Did you mean","\u4F60\u662F\u60F3\u8981"),[2,a.message+(a.message.includes("\u4F60\u662F\u60F3\u8981")?"":`
|
|
2
|
+
(\u4F7F\u7528 -h \u83B7\u53D6\u5E2E\u52A9\u4FE1\u606F)`)]):(this.logger.ERROR(a),[2,a instanceof Error?a.message:"\u672A\u77E5\u9519\u8BEF"])}return[0,{prefix:s,commandName:r,params:{},args:[]}]}getCommandInfo(e,t,n="name"){let o=e[n]().replace("/","");return o===""||o==="program"?t:o}getCommandHelpInformation(e){let t=this.events.command.find(i=>i.commandName.toString()===e);if(!t||!t.commander)return;let n=this.getCommandInfo(t.commander,t.commandName.toString()),o=this.config.prefix[0];return t.commander.name(n.includes(o)?n:`${o}${n}`).helpOption("-h, --help","\u5C55\u793A\u5E2E\u52A9\u4FE1\u606F").helpInformation().replace("default:","\u9ED8\u8BA4\u503C:").replace("Arguments:","\u53C2\u6570:").replace("Options:","\u9009\u9879:").replace("Usage:","\u7528\u6CD5:")}async sendMsg(e,t,{reply:n=!0,at:o=!0}={}){try{if(e.message_type==="private")return await this.ws.send_private_msg({user_id:e.user_id,message:t});{let s=[];return n&&e.message_id&&s.push(d.reply(e.message_id)),o&&e.user_id&&s.push(d.at(e.user_id),d.text(`
|
|
3
|
+
`)),t=[...s,...t],await this.ws.send_group_msg({group_id:e.group_id,message:t})}}catch{return null}}async sendForwardMsg(e,t){try{return e.message_type==="private"?await this.ws.send_private_forward_msg({user_id:e.user_id,message:t}):await this.ws.send_group_forward_msg({group_id:e.group_id,message:t})}catch{return null}}async isFriend(e){return this.ws.get_friend_list().then(t=>t.find(n=>n.user_id===e.user_id))}async getUsername(e){return"group_id"in e?this.ws.get_group_member_info({group_id:e.group_id,user_id:e.user_id}).then(t=>t.nickname):this.ws.get_stranger_info({user_id:e.user_id}).then(t=>t.nickname)}};var _=class g extends w{config;configDir;bot;loadedPlugins={};loadPluginHooks={};constructor(e,t){super({level:e.debug?f.DEBUG:e.logLevel}),this.config=e,this.bot=t,this.configDir=e.configDir??h.join(e.baseDir,"config"),this.logger.INFO("ATRI \u521D\u59CB\u5316\u5B8C\u6210")}static async init(e){e.debug&&(e.logLevel=f.DEBUG);let t=new I({title:"ATRI",level:e.debug?f.DEBUG:e.logLevel});e.disableClearTerminal||console.log("\x1Bc"),e.disableStartupMessage||(console.log(`%c __ .__
|
|
382
4
|
_____ _/ |_ _______ |__|
|
|
383
5
|
\\__ \\ \\ __\\ \\_ __ \\ | |
|
|
384
6
|
/ __ \\_ | | | | \\/ | |
|
|
385
7
|
(____ / |__| |__| |__|
|
|
386
|
-
\\/`,
|
|
387
|
-
`font-family: Consolas;`
|
|
388
|
-
);
|
|
389
|
-
logger.INFO(`\u30A2\u30C8\u30EA\u306F\u3001\u9AD8\u6027\u80FD\u3067\u3059\u304B\u3089\uFF01`);
|
|
390
|
-
}
|
|
391
|
-
if (!("debug" in config.bot)) config.bot.debug = config.debug;
|
|
392
|
-
if (!("logLevel" in config.bot)) config.bot.logLevel = config.logLevel;
|
|
393
|
-
const bot = await Bot.init(config.bot);
|
|
394
|
-
const atri = new _ATRI(config, bot);
|
|
395
|
-
return atri;
|
|
396
|
-
}
|
|
397
|
-
async loadPlugin(importFunction) {
|
|
398
|
-
const pluginName = getImportItemName(importFunction);
|
|
399
|
-
if (pluginName === "\u83B7\u53D6\u5931\u8D25") {
|
|
400
|
-
this.logger.ERROR(`\u65E0\u6CD5\u4ECE import \u51FD\u6570\u4E2D\u83B7\u53D6\u63D2\u4EF6\u540D\u79F0\u3002\u8BF7\u786E\u4FDD\u4F20\u5165\u7684\u51FD\u6570\u662F\u4E00\u4E2A import \u8BED\u53E5\u3002`);
|
|
401
|
-
return false;
|
|
402
|
-
}
|
|
403
|
-
this.logger.INFO(`\u52A0\u8F7D\u63D2\u4EF6: ${pluginName}`);
|
|
404
|
-
let module;
|
|
405
|
-
try {
|
|
406
|
-
module = await importFunction();
|
|
407
|
-
} catch (error) {
|
|
408
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${pluginName} \u52A0\u8F7D\u5931\u8D25:`, error);
|
|
409
|
-
return false;
|
|
410
|
-
}
|
|
411
|
-
if (!module.Plugin) {
|
|
412
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${pluginName} \u52A0\u8F7D\u5931\u8D25: \u672A\u627E\u5230 Plugin \u7C7B`);
|
|
413
|
-
return false;
|
|
414
|
-
}
|
|
415
|
-
try {
|
|
416
|
-
const plugin = new module.Plugin(this);
|
|
417
|
-
if (!plugin.pluginName) {
|
|
418
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${pluginName} \u52A0\u8F7D\u5931\u8D25: \u7F3A\u5C11\u5FC5\u8981\u53C2\u6570: pluginName`);
|
|
419
|
-
return false;
|
|
420
|
-
}
|
|
421
|
-
for (const hookName in this.loadPluginHooks) {
|
|
422
|
-
const hook = this.loadPluginHooks[hookName];
|
|
423
|
-
const result = await hook(plugin);
|
|
424
|
-
if (!result) {
|
|
425
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${plugin.pluginName} \u52A0\u8F7D\u5931\u8D25: \u52A0\u8F7D\u94A9\u5B50 ${hookName} \u8FD4\u56DE false`);
|
|
426
|
-
return false;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
if (!plugin.getDisableAutoLoadConfig()) {
|
|
430
|
-
const config = await this.loadConfig(plugin.getConfigName(), plugin.getDefaultConfig());
|
|
431
|
-
plugin.setConfig(config);
|
|
432
|
-
}
|
|
433
|
-
await plugin.load();
|
|
434
|
-
this.loadedPlugins[plugin.pluginName] = plugin;
|
|
435
|
-
this.logger.INFO(`\u63D2\u4EF6 ${plugin.pluginName} \u52A0\u8F7D\u6210\u529F`);
|
|
436
|
-
} catch (error) {
|
|
437
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${pluginName} \u52A0\u8F7D\u5931\u8D25:`, error);
|
|
438
|
-
return false;
|
|
439
|
-
}
|
|
440
|
-
return true;
|
|
441
|
-
}
|
|
442
|
-
async unloadPlugin(pluginName) {
|
|
443
|
-
if (!this.loadedPlugins[pluginName]) {
|
|
444
|
-
this.logger.WARN(`\u63D2\u4EF6 ${pluginName} \u672A\u52A0\u8F7D`);
|
|
445
|
-
return true;
|
|
446
|
-
}
|
|
447
|
-
const plugin = this.loadedPlugins[pluginName];
|
|
448
|
-
try {
|
|
449
|
-
plugin.getUnregHandlers().forEach((unreg) => unreg());
|
|
450
|
-
await plugin.unload();
|
|
451
|
-
delete this.loadedPlugins[pluginName];
|
|
452
|
-
this.logger.INFO(`\u63D2\u4EF6 ${pluginName} \u5378\u8F7D\u6210\u529F`);
|
|
453
|
-
} catch (error) {
|
|
454
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${pluginName} \u5378\u8F7D\u5931\u8D25:`, error);
|
|
455
|
-
return false;
|
|
456
|
-
}
|
|
457
|
-
return true;
|
|
458
|
-
}
|
|
459
|
-
async loadConfig(pluginName, defaultConfig) {
|
|
460
|
-
if (!fs.existsSync(this.configDir)) fs.mkdirSync(this.configDir, { recursive: true });
|
|
461
|
-
const configPath = path.join(this.configDir, `${pluginName}.json`);
|
|
462
|
-
if (!fs.existsSync(configPath)) {
|
|
463
|
-
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
|
|
464
|
-
return defaultConfig;
|
|
465
|
-
}
|
|
466
|
-
try {
|
|
467
|
-
const currentJson = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
468
|
-
return { ...defaultConfig, ...currentJson };
|
|
469
|
-
} catch (error) {
|
|
470
|
-
this.logger.ERROR(`\u63D2\u4EF6 ${pluginName} \u914D\u7F6E\u52A0\u8F7D\u5931\u8D25:`, error);
|
|
471
|
-
return {};
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
async saveConfig(pluginName, config) {
|
|
475
|
-
if (!fs.existsSync(this.configDir)) fs.mkdirSync(this.configDir, { recursive: true });
|
|
476
|
-
const configPath = path.join(this.configDir, `${pluginName}.json`);
|
|
477
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
478
|
-
}
|
|
479
|
-
addPluginLoadHook(hookName, hook) {
|
|
480
|
-
this.loadPluginHooks[hookName] = hook;
|
|
481
|
-
}
|
|
482
|
-
removePluginLoadHook(hookName) {
|
|
483
|
-
delete this.loadPluginHooks[hookName];
|
|
484
|
-
}
|
|
485
|
-
};
|
|
486
|
-
|
|
487
|
-
// src/types/plugin.ts
|
|
488
|
-
import { Logger as Logger3, LogLevel as LogLevel3 } from "@huan_kong/logger";
|
|
489
|
-
var BasePlugin = class {
|
|
490
|
-
disableAutoLoadConfig;
|
|
491
|
-
configName;
|
|
492
|
-
defaultConfig;
|
|
493
|
-
config;
|
|
494
|
-
atri;
|
|
495
|
-
bot;
|
|
496
|
-
ws;
|
|
497
|
-
unregHandlers = [];
|
|
498
|
-
// 构造完成后通过 initLogger 初始化
|
|
499
|
-
logger;
|
|
500
|
-
constructor(atri) {
|
|
501
|
-
this.atri = atri;
|
|
502
|
-
this.bot = atri.bot;
|
|
503
|
-
this.ws = atri.bot.ws;
|
|
504
|
-
this.config = {};
|
|
505
|
-
}
|
|
506
|
-
initLogger() {
|
|
507
|
-
const config = this.atri.config;
|
|
508
|
-
this.logger = new Logger3({
|
|
509
|
-
title: this.pluginName,
|
|
510
|
-
level: config.debug ? LogLevel3.DEBUG : config.logLevel
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
setConfig(config) {
|
|
514
|
-
this.config = config;
|
|
515
|
-
}
|
|
516
|
-
saveConfig(config) {
|
|
517
|
-
this.atri.saveConfig(this.configName ?? this.pluginName, config ?? this.config);
|
|
518
|
-
}
|
|
519
|
-
getDisableAutoLoadConfig() {
|
|
520
|
-
return this.disableAutoLoadConfig;
|
|
521
|
-
}
|
|
522
|
-
getConfigName() {
|
|
523
|
-
return this.configName ?? this.pluginName;
|
|
524
|
-
}
|
|
525
|
-
getDefaultConfig() {
|
|
526
|
-
return this.defaultConfig ?? {};
|
|
527
|
-
}
|
|
528
|
-
getUnregHandlers() {
|
|
529
|
-
return this.unregHandlers;
|
|
530
|
-
}
|
|
531
|
-
getPluginName() {
|
|
532
|
-
return this.pluginName;
|
|
533
|
-
}
|
|
534
|
-
reg_command_event(options) {
|
|
535
|
-
const unreg = this.bot.regEvent({
|
|
536
|
-
...options,
|
|
537
|
-
type: "command",
|
|
538
|
-
pluginName: this.pluginName
|
|
539
|
-
});
|
|
540
|
-
this.unregHandlers.push(unreg);
|
|
541
|
-
return unreg;
|
|
542
|
-
}
|
|
543
|
-
reg_message_event(options) {
|
|
544
|
-
const unreg = this.bot.regEvent({
|
|
545
|
-
...options,
|
|
546
|
-
type: "message",
|
|
547
|
-
pluginName: this.pluginName
|
|
548
|
-
});
|
|
549
|
-
this.unregHandlers.push(unreg);
|
|
550
|
-
return unreg;
|
|
551
|
-
}
|
|
552
|
-
reg_request_event(options) {
|
|
553
|
-
const unreg = this.bot.regEvent({
|
|
554
|
-
...options,
|
|
555
|
-
type: "request",
|
|
556
|
-
pluginName: this.pluginName
|
|
557
|
-
});
|
|
558
|
-
this.unregHandlers.push(unreg);
|
|
559
|
-
return unreg;
|
|
560
|
-
}
|
|
561
|
-
reg_notice_event(options) {
|
|
562
|
-
const unreg = this.bot.regEvent({
|
|
563
|
-
...options,
|
|
564
|
-
type: "notice",
|
|
565
|
-
pluginName: this.pluginName
|
|
566
|
-
});
|
|
567
|
-
this.unregHandlers.push(unreg);
|
|
568
|
-
return unreg;
|
|
569
|
-
}
|
|
570
|
-
};
|
|
571
|
-
export {
|
|
572
|
-
ATRI,
|
|
573
|
-
BasePlugin,
|
|
574
|
-
Bot,
|
|
575
|
-
getImportItemName,
|
|
576
|
-
performanceCounter,
|
|
577
|
-
sortObjectArray
|
|
578
|
-
};
|
|
8
|
+
\\/`,"font-family: Consolas;"),t.INFO("\u30A2\u30C8\u30EA\u306F\u3001\u9AD8\u6027\u80FD\u3067\u3059\u304B\u3089\uFF01")),"debug"in e.bot||(e.bot.debug=e.debug),"logLevel"in e.bot||(e.bot.logLevel=e.logLevel);let n=await p.init(e.bot);return new g(e,n)}async loadPlugin(e){let t=C(e);if(t==="\u83B7\u53D6\u5931\u8D25")return this.logger.ERROR("\u65E0\u6CD5\u4ECE import \u51FD\u6570\u4E2D\u83B7\u53D6\u63D2\u4EF6\u540D\u79F0\u3002\u8BF7\u786E\u4FDD\u4F20\u5165\u7684\u51FD\u6570\u662F\u4E00\u4E2A import \u8BED\u53E5\u3002"),!1;this.logger.INFO(`\u52A0\u8F7D\u63D2\u4EF6: ${t}`);let n;try{n=await e()}catch(o){return this.logger.ERROR(`\u63D2\u4EF6 ${t} \u52A0\u8F7D\u5931\u8D25:`,o),!1}if(!n.Plugin)return this.logger.ERROR(`\u63D2\u4EF6 ${t} \u52A0\u8F7D\u5931\u8D25: \u672A\u627E\u5230 Plugin \u7C7B`),!1;try{let o=new n.Plugin(this);if(!o.pluginName)return this.logger.ERROR(`\u63D2\u4EF6 ${t} \u52A0\u8F7D\u5931\u8D25: \u7F3A\u5C11\u5FC5\u8981\u53C2\u6570: pluginName`),!1;for(let s in this.loadPluginHooks){let i=this.loadPluginHooks[s];if(!await i(o))return this.logger.ERROR(`\u63D2\u4EF6 ${o.pluginName} \u52A0\u8F7D\u5931\u8D25: \u52A0\u8F7D\u94A9\u5B50 ${s} \u8FD4\u56DE false`),!1}if(!o.getDisableAutoLoadConfig()){let s=await this.loadConfig(o.getConfigName(),o.getDefaultConfig());o.setConfig(s)}await o.load(),this.loadedPlugins[o.pluginName]=o,this.logger.INFO(`\u63D2\u4EF6 ${o.pluginName} \u52A0\u8F7D\u6210\u529F`)}catch(o){return this.logger.ERROR(`\u63D2\u4EF6 ${t} \u52A0\u8F7D\u5931\u8D25:`,o),!1}return!0}async unloadPlugin(e){if(!this.loadedPlugins[e])return this.logger.WARN(`\u63D2\u4EF6 ${e} \u672A\u52A0\u8F7D`),!0;let t=this.loadedPlugins[e];try{t.getUnregHandlers().forEach(n=>n()),await t.unload(),delete this.loadedPlugins[e],this.logger.INFO(`\u63D2\u4EF6 ${e} \u5378\u8F7D\u6210\u529F`)}catch(n){return this.logger.ERROR(`\u63D2\u4EF6 ${e} \u5378\u8F7D\u5931\u8D25:`,n),!1}return!0}async loadConfig(e,t){m.existsSync(this.configDir)||m.mkdirSync(this.configDir,{recursive:!0});let n=h.join(this.configDir,`${e}.json`);if(!m.existsSync(n))return m.writeFileSync(n,JSON.stringify(t,null,2)),t;try{let o=JSON.parse(m.readFileSync(n,"utf-8"));return{...t,...o}}catch(o){return this.logger.ERROR(`\u63D2\u4EF6 ${e} \u914D\u7F6E\u52A0\u8F7D\u5931\u8D25:`,o),{}}}async saveConfig(e,t){m.existsSync(this.configDir)||m.mkdirSync(this.configDir,{recursive:!0});let n=h.join(this.configDir,`${e}.json`);m.writeFileSync(n,JSON.stringify(t,null,2))}addPluginLoadHook(e,t){this.loadPluginHooks[e]=t}removePluginLoadHook(e){delete this.loadPluginHooks[e]}};import{Logger as H,LogLevel as A}from"@huan_kong/logger";var b=class{disableAutoLoadConfig;configName;defaultConfig;config;atri;bot;ws;unregHandlers=[];logger;constructor(e){this.atri=e,this.bot=e.bot,this.ws=e.bot.ws,this.config={}}initLogger(){let e=this.atri.config;this.logger=new H({title:this.pluginName,level:e.debug?A.DEBUG:e.logLevel})}setConfig(e){this.config=e}saveConfig(e){this.atri.saveConfig(this.configName??this.pluginName,e??this.config)}getDisableAutoLoadConfig(){return this.disableAutoLoadConfig}getConfigName(){return this.configName??this.pluginName}getDefaultConfig(){return this.defaultConfig??{}}getUnregHandlers(){return this.unregHandlers}getPluginName(){return this.pluginName}regCommandEvent(e){let t=this.bot.regEvent({...e,type:"command",pluginName:this.pluginName});return this.unregHandlers.push(t),t}regMessageEvent(e){let t=this.bot.regEvent({...e,type:"message",pluginName:this.pluginName});return this.unregHandlers.push(t),t}regRequestEvent(e){let t=this.bot.regEvent({...e,type:"request",pluginName:this.pluginName});return this.unregHandlers.push(t),t}regNoticeEvent(e){let t=this.bot.regEvent({...e,type:"notice",pluginName:this.pluginName});return this.unregHandlers.push(t),t}};export{_ as ATRI,b as BasePlugin,p as Bot,C as getImportItemName,c as performanceCounter,u as sortObjectArray};
|