@atri-bot/core 1.1.8 → 1.1.10

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 CHANGED
@@ -13,6 +13,11 @@ type RemoveField<T, KToRemove extends keyof T> = {
13
13
  [K in keyof T as K extends KToRemove ? never : K]: T[K];
14
14
  };
15
15
 
16
+ interface PackageJson {
17
+ name: string;
18
+ version: string;
19
+ [key: string]: unknown;
20
+ }
16
21
  type CallbackReturnType = void | 'quit';
17
22
  type CallbackReturn = Promise<CallbackReturnType> | CallbackReturnType;
18
23
  type OptionParams = Record<string, any>;
@@ -95,8 +100,7 @@ type AutoInferNoticeEndPoint = {
95
100
  };
96
101
  }[keyof NoticeHandler];
97
102
  declare abstract class BasePlugin<TConfig extends object = object> {
98
- abstract pluginName: string;
99
- pluginVersion: string;
103
+ packageJson: PackageJson;
100
104
  disableAutoLoadConfig?: boolean;
101
105
  configName?: string;
102
106
  defaultConfig?: TConfig;
@@ -104,19 +108,12 @@ declare abstract class BasePlugin<TConfig extends object = object> {
104
108
  atri: ATRI;
105
109
  bot: Bot;
106
110
  ws: NCWebsocket;
107
- private unregHandlers;
111
+ unregHandlers: UnRegHandler[];
108
112
  logger: Logger;
109
- constructor(atri: ATRI);
110
- initLogger(): void;
113
+ constructor(atri: ATRI, packageJson: PackageJson);
111
114
  abstract load(): void | Promise<void>;
112
115
  abstract unload(): void | Promise<void>;
113
- setConfig(config: TConfig): void;
114
116
  saveConfig(config?: TConfig): void;
115
- getDisableAutoLoadConfig(): boolean | undefined;
116
- getConfigName(): string;
117
- getDefaultConfig(): TConfig;
118
- getUnregHandlers(): UnRegHandler[];
119
- getPluginName(): string;
120
117
  regCommandEvent<Opts extends CommandContext = CommandContext>(options: AutoInferCommandEndPoint<Opts>): () => void;
121
118
  regCommandEvent<Opts extends CommandContext = CommandContext>(options: RemoveField<CommandEvent<Opts, 'message'>, 'pluginName' | 'type'>): () => void;
122
119
  regMessageEvent(options: AutoInferMessageEndPoint): () => void;
@@ -253,11 +250,14 @@ type ATRIConfig = {
253
250
  interface PluginModule {
254
251
  Plugin?: new (...args: ConstructorParameters<typeof BasePlugin>) => BasePlugin;
255
252
  }
256
- type LoadPluginHook = (plugin: BasePlugin) => Promise<boolean> | boolean;
253
+ interface LoadPluginHookContext {
254
+ plugin: BasePlugin;
255
+ packageName: string;
256
+ }
257
+ type LoadPluginHook = (context: LoadPluginHookContext) => Promise<boolean> | boolean;
257
258
  interface LoadPluginOptions {
258
259
  initPlugin?: boolean;
259
260
  quiet?: boolean;
260
- ignoreHooks?: boolean;
261
261
  }
262
262
 
263
263
  declare class ATRI extends InjectLogger {
@@ -269,10 +269,14 @@ declare class ATRI extends InjectLogger {
269
269
  loadPluginHooks: Record<string, LoadPluginHook>;
270
270
  private constructor();
271
271
  static init(config: ATRIConfig): Promise<ATRI>;
272
- loadPlugin(pluginName: string, options?: LoadPluginOptions): Promise<false | BasePlugin<object>>;
273
- loadPlugins(pluginNames: string[]): Promise<boolean>;
274
- unloadPlugin(pluginName: string): Promise<boolean>;
275
- loadConfig<TConfig extends object>(pluginName: string, defaultConfig: TConfig): Promise<{}>;
272
+ /**
273
+ * 0 - 成功 (返回 插件实例化后的对象)
274
+ * 1 - 失败 (返回 错误信息)
275
+ * 2 - 加载钩子返回 false (返回 钩子名)
276
+ */
277
+ loadPlugin(packageName: string, options?: LoadPluginOptions): Promise<[0, BasePlugin] | [1 | 2, string]>;
278
+ unloadPlugin(packageName: string): Promise<[0] | [1, string]>;
279
+ loadConfig<TConfig extends object>(packageName: string, defaultConfig: TConfig): Promise<{}>;
276
280
  saveConfig<TConfig extends object>(pluginName: string, config: TConfig): Promise<void>;
277
281
  addPluginLoadHook(hookName: string, hook: LoadPluginHook): void;
278
282
  removePluginLoadHook(hookName: string): void;
@@ -295,4 +299,4 @@ declare function performanceCounter(): () => string;
295
299
  */
296
300
  declare function sortObjectArray<T extends object>(arr: T[], property: keyof T, sortType?: 'up' | 'down'): T[];
297
301
 
298
- export { ATRI, type ATRIConfig, type AutoInferCommandEndPoint, type AutoInferMessageEndPoint, type AutoInferNoticeEndPoint, type AutoInferRequestEndPoint, BasePlugin, Bot, type BotConfig, type BotEvents, type CallbackReturn, type CallbackReturnType, type CommandCallback, type CommandContext, type CommandData, type CommandEvent, CommanderUtils, type LoadPluginHook, type LoadPluginOptions, type MessageCallback, type MessageEvent, type NonEmptyArray, type NoticeCallback, type NoticeEvent, type OptionArgs, type OptionParams, type PluginModule, type RegEventOptions, type RemoveField, type RequestCallback, type RequestEvent, type UnRegHandler, performanceCounter, sortObjectArray };
302
+ export { ATRI, type ATRIConfig, type AutoInferCommandEndPoint, type AutoInferMessageEndPoint, type AutoInferNoticeEndPoint, type AutoInferRequestEndPoint, BasePlugin, Bot, type BotConfig, type BotEvents, type CallbackReturn, type CallbackReturnType, type CommandCallback, type CommandContext, type CommandData, type CommandEvent, CommanderUtils, type LoadPluginHook, type LoadPluginHookContext, type LoadPluginOptions, type MessageCallback, type MessageEvent, type NonEmptyArray, type NoticeCallback, type NoticeEvent, type OptionArgs, type OptionParams, type PackageJson, type PluginModule, type RegEventOptions, type RemoveField, type RequestCallback, type RequestEvent, type UnRegHandler, performanceCounter, sortObjectArray };
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import{InjectLogger as w,Logger as q,LogLevel as C}from"@huan_kong/logger";import{createRequire as H}from"module";import l from"fs";import f from"path";import A from"process";import{InjectLogger as P,Logger as O,LogLevel as b}from"@huan_kong/logger";import{CommanderError as T}from"commander";import{NCWebsocket as x,Structs as p}from"node-napcat-ts";function v(){let g=performance.now();return()=>(performance.now()-g).toFixed(2)}function u(g,e,t="up"){return g.sort((n,r)=>n[e]>r[e]?t==="up"?1:-1:n[e]<r[e]?t==="up"?-1:1:0)}var c=class g extends P{ws;config;events={command:[],message:[],notice:[],request:[]};constructor(e,t){super({level:e.debug?b.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=>{if(n.message.length===0){this.logger.DEBUG("\u6536\u5230\u7A7A\u6D88\u606F, \u5DF2\u8DF3\u8FC7\u5904\u7406\u6D41\u7A0B:",n);return}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=>{if(n.message.length===0)return;let r=`message.${n.message_type}.${n.sub_type}`,i=this.config.adminId.includes(n.user_id),s=n.message[0].type==="reply";for(let o of this.events.message)if(r.includes(o.endPoint??"message")&&(!o.needReply||s)&&(!o.needAdmin||i)&&(!o.regexp||o.regexp.test(n.raw_message)))try{if(await o.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${o.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(m){this.logger.ERROR(`\u63D2\u4EF6 ${o.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,m)}for(let o of this.events.command)if(r.includes(o.endPoint??"message")&&(!o.needAdmin||i)&&(!o.needReply||s)){let[m,a]=this.parseCommand(n.raw_message,o.commandName,o.commander);if(m===1)continue;if(m===2){await this.sendMsg(n,[p.text(a)]);continue}let{prefix:h,commandName:y,params:d,args:R}=a;try{if(await o.callback({context:n,prefix:h,commandName:y,params:d,args:R})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${o.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(_){this.logger.ERROR(`\u63D2\u4EF6 ${o.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,_)}}}),t.on("request",async n=>{let r=`request.${n.request_type}.${"sub_type"in n?n.sub_type:""}`;for(let i of this.events.request)if(r.includes(i.endPoint??"request"))try{if(await i.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${i.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(s){this.logger.ERROR(`\u63D2\u4EF6 ${i.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,s)}}),t.on("notice",async n=>{let r=`notice.${n.notice_type}.${"sub_type"in n?n.sub_type:""}`;n.notice_type==="notify"&&(n.sub_type==="input_status"?r+=`.${n.group_id!==0?"group":"friend"}`:n.sub_type==="poke"&&(r+=`.${"group_id"in n?"group":"friend"}`));for(let i of this.events.notice)if(r.includes(i.endPoint??"notice"))try{if(await i.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${i.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(s){this.logger.ERROR(`\u63D2\u4EF6 ${i.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,s)}}),this.logger.INFO("Bot \u521D\u59CB\u5316\u5B8C\u6210")}static async init(e){return new Promise((t,n)=>{let r=new O({title:"Bot",level:e.debug?b.DEBUG:e.logLevel}),i=new x({...e.connection,reconnection:e.reconnection}),s=v();i.on("socket.connecting",o=>{s=v(),r.INFO(`\u8FDE\u63A5\u4E2D [#${o.reconnection.nowAttempts}/${o.reconnection.attempts}]`)}),i.on("socket.error",o=>{if(r.ERROR(`\u8FDE\u63A5\u5931\u8D25 [#${o.reconnection.nowAttempts}/${o.reconnection.attempts}]`),r.ERROR("\u9519\u8BEF\u4FE1\u606F:",o),o.error_type==="response_error"&&(r.ERROR("NapCat \u670D\u52A1\u7AEF\u8FD4\u56DE\u9519\u8BEF, \u53EF\u80FD\u662F AccessToken \u9519\u8BEF"),process.exit(1)),o.reconnection.nowAttempts>=o.reconnection.attempts)throw n(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${o.reconnection.attempts}\u6B21!`),new Error(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${o.reconnection.attempts}\u6B21!`)}),i.on("socket.open",async o=>{r.INFO(`\u8FDE\u63A5\u6210\u529F [#${o.reconnection.nowAttempts}/${o.reconnection.attempts}]`),r.INFO(`\u8FDE\u63A5 NapCat \u8017\u65F6: ${s()}ms`),t(new g(e,i))}),i.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 r=e.charAt(0),i=this.config.prefix.find(a=>a===r);if(!i)return[1,"\u672A\u5339\u914D\u5230\u524D\u7F00"];let s=e.split(" ");if(s.length===0)return[1,"\u547D\u4EE4\u4FE1\u606F\u672A\u7A7A"];let o=s[0].slice(i.length),m=s.slice(1).filter(a=>a!=="");if(t!=="*"&&(typeof t=="string"&&t!==o||t instanceof RegExp&&o.match(t)===null))return[1,"\u547D\u4EE4\u540D\u4E0D\u5339\u914D"];if(n)try{let a=n.configureOutput({writeErr:()=>{},writeOut:()=>{}}).exitOverride().parse(m,{from:"user"});return[0,{prefix:i,commandName:o,params:a.opts(),args:a.processedArgs}]}catch(a){if(a instanceof T||"code"in a&&"message"in a){let{code:h,message:y}=a;if(h==="commander.helpDisplayed")return[2,this.getCommandHelpInformation(t.toString())??""];let d=y.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");return[2,d+(d.includes("\u4F60\u662F\u60F3\u8981")?"":`
2
- (\u4F7F\u7528 -h \u83B7\u53D6\u5E2E\u52A9\u4FE1\u606F)`)]}else return this.logger.ERROR("\u547D\u4EE4\u5904\u7406\u51FA\u9519:",a),[2,a instanceof Error?a.message:"\u672A\u77E5\u9519\u8BEF"]}return[0,{prefix:i,commandName:o,params:{},args:[]}]}getCommandInfo(e,t,n="name"){let r=e[n]().replace("/","");return r===""||r==="program"?t:r}getCommandHelpInformation(e){let t=this.events.command.find(s=>s.commandName.toString()===e);if(!t||!t.commander)return;let n=this.getCommandInfo(t.commander,t.commandName.toString()),r=this.config.prefix[0];return t.commander.name(n.includes(r)?n:`${r}${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:r=!0}={}){try{if(e.message_type==="private")return await this.ws.send_private_msg({user_id:e.user_id,message:t});{let i=[];return n&&e.message_id&&i.push(p.reply(e.message_id)),r&&e.user_id&&i.push(p.at(e.user_id),p.text(`
3
- `)),t=[...i,...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 E=class g extends w{config;configDir;bot;import;loadedPlugins={};loadPluginHooks={};constructor(e,t){super({level:e.debug?C.DEBUG:e.logLevel}),this.config=e,this.bot=t,this.configDir=e.configDir??f.join(e.baseDir,"config"),this.import=H(e.baseDir)}static async init(e){e.debug&&(e.logLevel=C.DEBUG);let t=new q({title:"ATRI",level:e.debug?C.DEBUG:e.logLevel});e.disableClearTerminal||console.log("\x1Bc"),e.disableStartupMessage||(console.log(`%c __ .__
1
+ import{InjectLogger as q,Logger as w,LogLevel as R}from"@huan_kong/logger";import{createRequire as A}from"module";import l from"fs";import f from"path";import $ from"process";import{InjectLogger as O,Logger as x,LogLevel as E}from"@huan_kong/logger";import{CommanderError as N}from"commander";import{NCWebsocket as T,Structs as p}from"node-napcat-ts";function v(){let g=performance.now();return()=>(performance.now()-g).toFixed(2)}function u(g,e,t="up"){return g.sort((n,s)=>n[e]>s[e]?t==="up"?1:-1:n[e]<s[e]?t==="up"?-1:1:0)}var c=class g extends O{ws;config;events={command:[],message:[],notice:[],request:[]};constructor(e,t){super({level:e.debug?E.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=>{if(n.message.length===0){this.logger.DEBUG("\u6536\u5230\u7A7A\u6D88\u606F, \u5DF2\u8DF3\u8FC7\u5904\u7406\u6D41\u7A0B:",n);return}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=>{if(n.message.length===0)return;let s=`message.${n.message_type}.${n.sub_type}`,o=this.config.adminId.includes(n.user_id),r=n.message[0].type==="reply";for(let i of this.events.message)if(s.includes(i.endPoint??"message")&&(!i.needReply||r)&&(!i.needAdmin||o)&&(!i.regexp||i.regexp.test(n.raw_message)))try{if(await i.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${i.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(m){this.logger.ERROR(`\u63D2\u4EF6 ${i.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,m)}for(let i of this.events.command)if(s.includes(i.endPoint??"message")&&(!i.needAdmin||o)&&(!i.needReply||r)){let[m,a]=this.parseCommand(n.raw_message,i.commandName,i.commander);if(m===1)continue;if(m===2){await this.sendMsg(n,[p.text(a)]);continue}let{prefix:h,commandName:y,params:d,args:C}=a;try{if(await i.callback({context:n,prefix:h,commandName:y,params:d,args:C})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${i.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(_){this.logger.ERROR(`\u63D2\u4EF6 ${i.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,_)}}}),t.on("request",async n=>{let s=`request.${n.request_type}.${"sub_type"in n?n.sub_type:""}`;for(let o of this.events.request)if(s.includes(o.endPoint??"request"))try{if(await o.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${o.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(r){this.logger.ERROR(`\u63D2\u4EF6 ${o.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,r)}}),t.on("notice",async n=>{let s=`notice.${n.notice_type}.${"sub_type"in n?n.sub_type:""}`;n.notice_type==="notify"&&(n.sub_type==="input_status"?s+=`.${n.group_id!==0?"group":"friend"}`:n.sub_type==="poke"&&(s+=`.${"group_id"in n?"group":"friend"}`));for(let o of this.events.notice)if(s.includes(o.endPoint??"notice"))try{if(await o.callback({context:n})==="quit"){this.logger.DEBUG(`\u63D2\u4EF6 ${o.pluginName} \u8BF7\u6C42\u63D0\u524D\u7EC8\u6B62`);break}}catch(r){this.logger.ERROR(`\u63D2\u4EF6 ${o.pluginName} \u4E8B\u4EF6\u5904\u7406\u5931\u8D25:`,r)}}),this.logger.INFO("Bot \u521D\u59CB\u5316\u5B8C\u6210")}static async init(e){return new Promise((t,n)=>{let s=new x({title:"Bot",level:e.debug?E.DEBUG:e.logLevel}),o=new T({...e.connection,reconnection:e.reconnection}),r=v();o.on("socket.connecting",i=>{r=v(),s.INFO(`\u8FDE\u63A5\u4E2D [#${i.reconnection.nowAttempts}/${i.reconnection.attempts}]`)}),o.on("socket.error",i=>{if(s.ERROR(`\u8FDE\u63A5\u5931\u8D25 [#${i.reconnection.nowAttempts}/${i.reconnection.attempts}]`),s.ERROR("\u9519\u8BEF\u4FE1\u606F:",i),i.error_type==="response_error"&&(s.ERROR("NapCat \u670D\u52A1\u7AEF\u8FD4\u56DE\u9519\u8BEF, \u53EF\u80FD\u662F AccessToken \u9519\u8BEF"),process.exit(1)),i.reconnection.nowAttempts>=i.reconnection.attempts)throw n(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${i.reconnection.attempts}\u6B21!`),new Error(`\u91CD\u8BD5\u6B21\u6570\u8D85\u8FC7\u8BBE\u7F6E\u7684${i.reconnection.attempts}\u6B21!`)}),o.on("socket.open",async i=>{s.INFO(`\u8FDE\u63A5\u6210\u529F [#${i.reconnection.nowAttempts}/${i.reconnection.attempts}]`),s.INFO(`\u8FDE\u63A5 NapCat \u8017\u65F6: ${r()}ms`),t(new g(e,o))}),o.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 s=e.charAt(0),o=this.config.prefix.find(a=>a===s);if(!o)return[1,"\u672A\u5339\u914D\u5230\u524D\u7F00"];let r=e.split(" ");if(r.length===0)return[1,"\u547D\u4EE4\u4FE1\u606F\u672A\u7A7A"];let i=r[0].slice(o.length),m=r.slice(1).filter(a=>a!=="");if(t!=="*"&&(typeof t=="string"&&t!==i||t instanceof RegExp&&i.match(t)===null))return[1,"\u547D\u4EE4\u540D\u4E0D\u5339\u914D"];if(n)try{let a=n.configureOutput({writeErr:()=>{},writeOut:()=>{}}).exitOverride().parse(m,{from:"user"});return[0,{prefix:o,commandName:i,params:a.opts(),args:a.processedArgs}]}catch(a){if(a instanceof N||"code"in a&&"message"in a){let{code:h,message:y}=a;if(h==="commander.helpDisplayed")return[2,this.getCommandHelpInformation(t.toString())??""];let d=y.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");return[2,d+(d.includes("\u4F60\u662F\u60F3\u8981")?"":`
2
+ (\u4F7F\u7528 -h \u83B7\u53D6\u5E2E\u52A9\u4FE1\u606F)`)]}else return this.logger.ERROR("\u547D\u4EE4\u5904\u7406\u51FA\u9519:",a),[2,a instanceof Error?a.message:"\u672A\u77E5\u9519\u8BEF"]}return[0,{prefix:o,commandName:i,params:{},args:[]}]}getCommandInfo(e,t,n="name"){let s=e[n]().replace("/","");return s===""||s==="program"?t:s}getCommandHelpInformation(e){let t=this.events.command.find(r=>r.commandName.toString()===e);if(!t||!t.commander)return;let n=this.getCommandInfo(t.commander,t.commandName.toString()),s=this.config.prefix[0];return t.commander.name(n.includes(s)?n:`${s}${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:s=!0}={}){try{if(e.message_type==="private")return await this.ws.send_private_msg({user_id:e.user_id,message:t});{let o=[];return n&&e.message_id&&o.push(p.reply(e.message_id)),s&&e.user_id&&o.push(p.at(e.user_id),p.text(`
3
+ `)),t=[...o,...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 b=class g extends q{config;configDir;bot;import;loadedPlugins={};loadPluginHooks={};constructor(e,t){super({level:e.debug?R.DEBUG:e.logLevel}),this.config=e,this.bot=t,this.configDir=e.configDir??f.join(e.baseDir,"config"),this.import=A(e.baseDir)}static async init(e){e.debug&&(e.logLevel=R.DEBUG);let t=new w({title:"ATRI",level:e.debug?R.DEBUG:e.logLevel});e.disableClearTerminal||console.log("\x1Bc"),e.disableStartupMessage||(console.log(`%c __ .__
4
4
  _____ _/ |_ _______ |__|
5
5
  \\__ \\ \\ __\\ \\_ __ \\ | |
6
6
  / __ \\_ | | | | \\/ | |
7
7
  (____ / |__| |__| |__|
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 c.init(e.bot),r=new g(e,n);return e.plugins&&(await r.loadPlugins(e.plugins)||(t.ERROR("\u63D2\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF0C\u7A0B\u5E8F\u7EC8\u6B62"),A.exit(1))),t.INFO("ATRI \u521D\u59CB\u5316\u5B8C\u6210"),r}async loadPlugin(e,t){t={initPlugin:!0,quiet:!1,ignoreHooks:!1,...t??{}},t.quiet||this.logger.INFO(`\u52A0\u8F7D\u63D2\u4EF6: ${e}`);let n;try{n=await this.import(e)}catch(r){return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25:`,r),!1}if(!n.Plugin)return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25: \u672A\u627E\u5230 Plugin \u7C7B`),!1;try{let r=new n.Plugin(this);if(!r.pluginName)return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25: \u7F3A\u5C11\u5FC5\u8981\u53C2\u6570: pluginName`),!1;if(!r.pluginVersion)try{let i=this.import.resolve(f.join(e,"package.json")),s=JSON.parse(l.readFileSync(i,"utf-8"));r.pluginVersion=s.version??"\u672A\u77E5\u7248\u672C"}catch{r.pluginVersion="\u672A\u77E5\u7248\u672C"}if(t.initPlugin&&!t.ignoreHooks)for(let i in this.loadPluginHooks){let s=this.loadPluginHooks[i];if(!await s(r))return this.logger.ERROR(`\u63D2\u4EF6 ${r.pluginName} \u52A0\u8F7D\u5931\u8D25: \u52A0\u8F7D\u94A9\u5B50 ${i} \u8FD4\u56DE false`),!1}if(t.initPlugin){if(!r.getDisableAutoLoadConfig()){let i=await this.loadConfig(r.getConfigName(),r.getDefaultConfig());r.setConfig(i)}r.initLogger(),await r.load(),this.loadedPlugins[r.pluginName]=r,t.quiet||this.logger.INFO(`\u63D2\u4EF6 ${r.pluginName} \u52A0\u8F7D\u6210\u529F`)}return r}catch(r){return this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25:`,r),!1}}async loadPlugins(e){for(let t of e)if(!await this.loadPlugin(t))return!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){l.existsSync(this.configDir)||l.mkdirSync(this.configDir,{recursive:!0});let n=f.join(this.configDir,`${e}.json`);if(!l.existsSync(n))return l.writeFileSync(n,JSON.stringify(t,null,2)),t;try{let r=JSON.parse(l.readFileSync(n,"utf-8"));return{...t,...r}}catch(r){return this.logger.ERROR(`\u63D2\u4EF6 ${e} \u914D\u7F6E\u52A0\u8F7D\u5931\u8D25:`,r),{}}}async saveConfig(e,t){l.existsSync(this.configDir)||l.mkdirSync(this.configDir,{recursive:!0});let n=f.join(this.configDir,`${e}.json`);l.writeFileSync(n,JSON.stringify(t,null,2))}addPluginLoadHook(e,t){this.loadPluginHooks[e]=t}removePluginLoadHook(e){delete this.loadPluginHooks[e]}};var N=class{static enum(e){return function(t){if(!e.includes(t))throw new Error(`\u53C2\u6570 "${t}" \u4E0D\u662F\u6709\u6548\u53C2\u6570, \u6709\u6548\u53C2\u6570:
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 c.init(e.bot),s=new g(e,n);for(let o of e.plugins??[]){let[r]=await s.loadPlugin(o);r!==0&&(t.ERROR("\u63D2\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF0C\u7A0B\u5E8F\u7EC8\u6B62"),$.exit(1))}return t.INFO("ATRI \u521D\u59CB\u5316\u5B8C\u6210"),s}async loadPlugin(e,t){if(t={initPlugin:!0,quiet:!1,...t??{}},t.quiet||this.logger.INFO(`\u52A0\u8F7D\u63D2\u4EF6: ${e}`),this.loadedPlugins[e])return t.quiet||this.logger.WARN(`\u63D2\u4EF6 ${e} \u5DF2\u52A0\u8F7D\uFF0C\u8DF3\u8FC7\u52A0\u8F7D`),[0,this.loadedPlugins[e]];let n;try{n=await this.import(e)}catch(r){return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u5BFC\u5165\u5931\u8D25:`,r),[1,r instanceof Error?r.message:String(r)]}if(!n.Plugin)return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25: \u672A\u627E\u5230 Plugin \u7C7B`),[1,"\u672A\u627E\u5230 Plugin \u7C7B"];let s;try{let r=this.import.resolve(f.join(e,"package.json"));s=JSON.parse(l.readFileSync(r,"utf-8"))}catch(r){t.quiet||(this.logger.WARN(`\u63D2\u4EF6 ${e} \u672A\u627E\u5230 package.json, \u5C06\u4F7F\u7528\u672A\u77E5\u4EE3\u66FF`),this.logger.DEBUG(r)),s={name:"\u672A\u77E5",version:"\u672A\u77E5"}}let o;try{o=new n.Plugin(this,s)}catch(r){return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u5B9E\u4F8B\u5316\u5931\u8D25:`,r),[1,r instanceof Error?r.message:String(r)]}if(!t.initPlugin)return[0,o];try{for(let r in this.loadPluginHooks){let i=this.loadPluginHooks[r];if(!await i({plugin:o,packageName:e}))return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25: \u52A0\u8F7D\u94A9\u5B50 ${r} \u8FD4\u56DE false`),[2,r]}return o.disableAutoLoadConfig||(o.config=await this.loadConfig(o.configName??e,o.defaultConfig??{})),await o.load(),this.loadedPlugins[e]=o,t.quiet||this.logger.INFO(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u6210\u529F`),[0,o]}catch(r){return t.quiet||this.logger.ERROR(`\u63D2\u4EF6 ${e} \u52A0\u8F7D\u5931\u8D25:`,r),[1,r instanceof Error?r.message:String(r)]}}async unloadPlugin(e){let t=this.loadedPlugins[e];if(!t)return this.logger.WARN(`\u63D2\u4EF6 ${e} \u672A\u52A0\u8F7D`),[1,"\u63D2\u4EF6\u672A\u52A0\u8F7D"];try{return t.unregHandlers.forEach(n=>n()),await t.unload(),delete this.loadedPlugins[e],this.logger.INFO(`\u63D2\u4EF6 ${e} \u5378\u8F7D\u6210\u529F`),[0]}catch(n){return this.logger.ERROR(`\u63D2\u4EF6 ${e} \u5378\u8F7D\u5931\u8D25:`,n),[1,n instanceof Error?n.message:String(n)]}}async loadConfig(e,t){e=e.replaceAll("/","__"),l.existsSync(this.configDir)||l.mkdirSync(this.configDir,{recursive:!0});let n=f.join(this.configDir,`${e}.json`);if(!l.existsSync(n))return l.writeFileSync(n,JSON.stringify(t,null,2)),t;try{let s=JSON.parse(l.readFileSync(n,"utf-8"));return{...t,...s}}catch(s){return this.logger.ERROR(`\u63D2\u4EF6 ${e} \u914D\u7F6E\u52A0\u8F7D\u5931\u8D25:`,s),{}}}async saveConfig(e,t){l.existsSync(this.configDir)||l.mkdirSync(this.configDir,{recursive:!0});let n=f.join(this.configDir,`${e}.json`);l.writeFileSync(n,JSON.stringify(t,null,2))}addPluginLoadHook(e,t){this.loadPluginHooks[e]=t}removePluginLoadHook(e){delete this.loadPluginHooks[e]}};var P=class{static enum(e){return function(t){if(!e.includes(t))throw new Error(`\u53C2\u6570 "${t}" \u4E0D\u662F\u6709\u6548\u53C2\u6570, \u6709\u6548\u53C2\u6570:
9
9
  ${e.map(n=>` - ${n}`).join(`
10
- `)}`);return t}}};import{Logger as I,LogLevel as $}from"@huan_kong/logger";var k=class{pluginVersion;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 I({title:this.pluginName,level:e.debug?$.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{E as ATRI,k as BasePlugin,c as Bot,N as CommanderUtils,v as performanceCounter,u as sortObjectArray};
10
+ `)}`);return t}}};import{Logger as I,LogLevel as H}from"@huan_kong/logger";var k=class{packageJson;disableAutoLoadConfig;configName;defaultConfig;config;atri;bot;ws;unregHandlers=[];logger;constructor(e,t){this.atri=e,this.bot=e.bot,this.ws=e.bot.ws,this.config={},this.packageJson=t,this.logger=new I({title:this.packageJson.name,level:e.config.debug?H.DEBUG:e.config.logLevel})}saveConfig(e){this.atri.saveConfig(this.configName??this.packageJson.name,e??this.config)}regCommandEvent(e){let t=this.bot.regEvent({...e,type:"command",pluginName:this.packageJson.name});return this.unregHandlers.push(t),t}regMessageEvent(e){let t=this.bot.regEvent({...e,type:"message",pluginName:this.packageJson.name});return this.unregHandlers.push(t),t}regRequestEvent(e){let t=this.bot.regEvent({...e,type:"request",pluginName:this.packageJson.name});return this.unregHandlers.push(t),t}regNoticeEvent(e){let t=this.bot.regEvent({...e,type:"notice",pluginName:this.packageJson.name});return this.unregHandlers.push(t),t}};export{b as ATRI,k as BasePlugin,c as Bot,P as CommanderUtils,v 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.8",
3
+ "version": "1.1.10",
4
4
  "description": "QQBOT TypeScript framework",
5
5
  "author": "huankong233",
6
6
  "license": "MIT",