@atri-bot/core 1.1.0 → 1.1.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.
Files changed (2) hide show
  1. package/dist/index.js +4 -574
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,578 +1,8 @@
1
- // src/atri.ts
2
- import { InjectLogger as InjectLogger2, Logger as Logger2, LogLevel as LogLevel2 } from "@huan_kong/logger";
3
- import fs from "fs";
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 C}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 _(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?C.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?C.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 R=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=_(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}reg_command_event(e){let t=this.bot.regEvent({...e,type:"command",pluginName:this.pluginName});return this.unregHandlers.push(t),t}reg_message_event(e){let t=this.bot.regEvent({...e,type:"message",pluginName:this.pluginName});return this.unregHandlers.push(t),t}reg_request_event(e){let t=this.bot.regEvent({...e,type:"request",pluginName:this.pluginName});return this.unregHandlers.push(t),t}reg_notice_event(e){let t=this.bot.regEvent({...e,type:"notice",pluginName:this.pluginName});return this.unregHandlers.push(t),t}};export{R as ATRI,b as BasePlugin,p as Bot,_ as getImportItemName,c as performanceCounter,u as sortObjectArray};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atri-bot/core",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "QQBOT TypeScript framework",
5
5
  "author": "huankong233",
6
6
  "license": "MIT",