@atri-bot/core 2.0.0-beta.5 → 2.0.0-beta.7

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.mts CHANGED
@@ -36,6 +36,7 @@ interface CommandEvent<T extends keyof MessageHandler = keyof MessageHandler, K
36
36
  commander?: () => K;
37
37
  callback: (context: CommandContext<T, K>) => MaybePromise<void | 'quit'>;
38
38
  }
39
+ type MessageContext<T extends keyof MessageHandler> = MessageHandler[T];
39
40
  interface MessageEvent<T extends keyof MessageHandler = keyof MessageHandler> {
40
41
  type: 'message';
41
42
  endPoint?: T;
@@ -44,21 +45,23 @@ interface MessageEvent<T extends keyof MessageHandler = keyof MessageHandler> {
44
45
  needReply?: boolean;
45
46
  needAdmin?: boolean;
46
47
  pluginName: string;
47
- callback: (context: MessageHandler[T]) => MaybePromise<void | 'quit'>;
48
+ callback: (context: MessageContext<T>) => MaybePromise<void | 'quit'>;
48
49
  }
50
+ type NoticeContext<T extends keyof NoticeHandler> = NoticeHandler[T];
49
51
  interface NoticeEvent<T extends keyof NoticeHandler = keyof NoticeHandler> {
50
52
  type: 'notice';
51
53
  endPoint?: T;
52
54
  priority?: number;
53
55
  pluginName: string;
54
- callback: (context: NoticeHandler[T]) => MaybePromise<void | 'quit'>;
56
+ callback: (context: NoticeContext<T>) => MaybePromise<void | 'quit'>;
55
57
  }
58
+ type RequestContext<T extends keyof RequestHandler> = RequestHandler[T];
56
59
  interface RequestEvent<T extends keyof RequestHandler = keyof RequestHandler> {
57
60
  type: 'request';
58
61
  endPoint?: T;
59
62
  priority?: number;
60
63
  pluginName: string;
61
- callback: (context: RequestHandler[T]) => MaybePromise<void | 'quit'>;
64
+ callback: (context: RequestContext<T>) => MaybePromise<void | 'quit'>;
62
65
  }
63
66
  type RegEventOptions = CommandEvent | MessageEvent | NoticeEvent | RequestEvent;
64
67
  interface BotEvents {
@@ -204,4 +207,4 @@ declare class ATRI {
204
207
  saveConfig<T extends object>(pluginName: string, config: T): Promise<void>;
205
208
  }
206
209
  //#endregion
207
- export { ATRI, ATRIConfig, Bot, BotConfig, BotEvents, CommandContext, CommandEvent, MaybePromise, MessageEvent, NonEmptyArray, NoticeEvent, Plugin, PluginOptions, PluginRuntime, RegEventOptions, RequestEvent, definePlugin, definePluginReturnType, sortObjectArray };
210
+ export { ATRI, ATRIConfig, Bot, BotConfig, BotEvents, CommandContext, CommandEvent, MaybePromise, MessageContext, MessageEvent, NonEmptyArray, NoticeContext, NoticeEvent, Plugin, PluginOptions, PluginRuntime, RegEventOptions, RequestContext, RequestEvent, definePlugin, definePluginReturnType, sortObjectArray };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:path";import{LogLevel as t,Logger as n,defaultTransformer as r,saveFileTransformer as i}from"@huan_kong/logger";import a from"fs-extra";import o from"node:process";import{NCWebsocket as s,Structs as c}from"node-napcat-ts";function l(e,t,n=`up`){return e.sort((e,r)=>e[t]>r[t]?n===`up`?1:-1:e[t]<r[t]?n===`up`?-1:1:0)}var u=class{atri;config;logger;ws;events={command:[],message:[],notice:[],request:[]};unloaders={};constructor(e,t){this.atri=e,this.config=t,this.logger=this.atri.logger.clone({title:`Bot`,...t.logLevel?{level:t.logLevel}:{}}),this.ws=new s(t)}async init(){this.ws.on(`socket.connecting`,e=>this.logger.INFO(`连接中 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.open`,e=>this.logger.INFO(`连接成功 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.error`,e=>{e.error_type===`connect_error`?(this.logger.ERROR(`连接失败 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e)):e.error_type===`response_error`&&(this.logger.ERROR(`NapCat 服务端返回错误 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e.info),o.exit(1)),e.reconnection.nowAttempts>=e.reconnection.attempts&&(this.logger.ERROR(`重试次数超过设置的${e.reconnection.attempts}次!`),o.exit(1))}),this.ws.on(`api.preSend`,e=>this.logger.DEBUG(`发送API请求`,e)),this.ws.on(`api.response.success`,e=>this.logger.DEBUG(`收到API成功响应`,e)),this.ws.on(`api.response.failure`,e=>this.logger.DEBUG(`收到API失败响应`,e)),this.ws.on(`message`,async e=>{if(e.message.length===0){this.logger.DEBUG(`收到空消息, 已跳过处理流程:`,e);return}let n=`message.${e.message_type}.${e.sub_type}`,r=this.config.adminId.includes(e.user_id),i=e.message[0].type===`reply`;if(this.logger.DEBUG(`收到消息:`,e),this.config.logLevel===t.DEBUG&&!r){this.logger.DEBUG(`当前处于调试模式, 非管理员消息, 已跳过处理流程:`,e);return}for(let t of this.events.message)if(!(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r||t.trigger&&!(typeof t.trigger==`string`?e.raw_message.includes(t.trigger):t.trigger.test(e.raw_message))))try{if(await t.callback(e)===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}let a=this.config.prefix.find(t=>e.raw_message.startsWith(t));if(!a)return;let o=e.raw_message.slice(a.length).trim();for(let t of this.events.command){if(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r)continue;let a=this.extractCommandBody(o,t.trigger);if(a!==null)try{let r=this.splitArgs(a),i=t.commander?t.commander().fail(!1).parseSync(r):{_:[],$0:``};if(await t.callback({context:e,options:i})===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){if(r instanceof Error&&r.stack?.toString().includes(`yargs`)){await this.sendMsg(e,[c.text(`命令使用错误:\n${r.message}\n\n`),c.text(await t.commander?.()?.getHelp()??`无帮助信息`)]);continue}this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}}}),this.ws.on(`request`,async e=>{this.logger.DEBUG(`收到请求:`,e);let t=`request.${e.request_type}.${`sub_type`in e?e.sub_type:``}`;for(let n of this.events.request)if(t.includes(n.endPoint??`request`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),this.ws.on(`notice`,async e=>{this.logger.DEBUG(`收到通知:`,e);let t=`notice.${e.notice_type}.${`sub_type`in e?e.sub_type:``}`;e.notice_type===`notify`&&(e.sub_type===`input_status`?t+=`.${e.group_id===0?`friend`:`group`}`:e.sub_type===`poke`&&(t+=`.${`group_id`in e?`group`:`friend`}`));for(let n of this.events.notice)if(t.includes(n.endPoint??`notice`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),await this.ws.connect(),this.logger.INFO(`Bot 初始化完成`)}splitArgsRegex=/"([^"]*)"|'([^']*)'|(\S+)/g;splitArgs(e){let t=e.matchAll(this.splitArgsRegex),n=[];for(let e of t)n.push(e[1]||e[2]||e[3]);return n}extractCommandBody(e,t){return typeof t==`string`?e.startsWith(t)?e.slice(t.length).trim():null:t.test(e)?e.replace(t,``).trim():null}regCommandEvent(e){let t={...e,type:`command`};if(t.commander){let e=typeof t.commander==`function`?t.commander():t.commander;`exitProcess`in e&&e.exitProcess(!1).usage(`用法: ${t.trigger} [选项]`).locale(this.config.yargsLocale??`zh_CN`).help(!1).version(!1)}this.events.command=l([...this.events.command,t],`priority`,`down`);let n=()=>{let e=this.events.command.indexOf(t);e!==-1&&this.events.command.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regMessageEvent(e){let t={...e,type:`message`};this.events.message=l([...this.events.message,t],`priority`,`down`);let n=()=>{let e=this.events.message.indexOf(t);e!==-1&&this.events.message.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regNoticeEvent(e){let t={...e,type:`notice`};this.events.notice=l([...this.events.notice,t],`priority`,`down`);let n=()=>{let e=this.events.notice.indexOf(t);e!==-1&&this.events.notice.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regRequestEvent(e){let t={...e,type:`request`};this.events.request=l([...this.events.request,t],`priority`,`down`);let n=()=>{let e=this.events.request.indexOf(t);e!==-1&&this.events.request.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}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(c.reply(e.message_id)),r&&e.user_id&&i.push(c.at(e.user_id),c.text(`
1
+ import e from"node:path";import{LogLevel as t,Logger as n,defaultTransformer as r,saveFileTransformer as i}from"@huan_kong/logger";import a from"fs-extra";import o from"node:process";import{NCWebsocket as s,Structs as c}from"node-napcat-ts";function l(e,t,n=`up`){return e.sort((e,r)=>e[t]>r[t]?n===`up`?1:-1:e[t]<r[t]?n===`up`?-1:1:0)}var u=class{atri;config;logger;ws;events={command:[],message:[],notice:[],request:[]};unloaders={};constructor(e,t){this.atri=e,this.config=t,this.logger=this.atri.logger.clone({title:`Bot`,...t.logLevel?{level:t.logLevel}:{}}),this.ws=new s(t)}async init(){this.ws.on(`socket.connecting`,e=>this.logger.INFO(`连接中 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.open`,e=>this.logger.INFO(`连接成功 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.error`,e=>{e.error_type===`connect_error`?(this.logger.ERROR(`连接失败 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e)):e.error_type===`response_error`&&(this.logger.ERROR(`NapCat 服务端返回错误 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e.info),o.exit(1)),e.reconnection.nowAttempts>=e.reconnection.attempts&&(this.logger.ERROR(`重试次数超过设置的${e.reconnection.attempts}次!`),o.exit(1))}),this.ws.on(`api.preSend`,e=>this.logger.DEBUG(`发送API请求`,e)),this.ws.on(`api.response.success`,e=>this.logger.DEBUG(`收到API成功响应`,e)),this.ws.on(`api.response.failure`,e=>this.logger.DEBUG(`收到API失败响应`,e)),this.ws.on(`message`,async e=>{if(e.message.length===0){this.logger.DEBUG(`收到空消息, 已跳过处理流程:`,e);return}let n=`message.${e.message_type}.${e.sub_type}`,r=this.config.adminId.includes(e.user_id),i=e.message[0].type===`reply`;if(this.logger.DEBUG(`收到消息:`,e),this.config.logLevel===t.DEBUG&&!r){this.logger.DEBUG(`当前处于调试模式, 非管理员消息, 已跳过处理流程:`,e);return}for(let t of this.events.message)if(!(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r||t.trigger&&!(typeof t.trigger==`string`?e.raw_message.includes(t.trigger):t.trigger.test(e.raw_message))))try{if(await t.callback(e)===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}let a=this.config.prefix.find(t=>e.raw_message.startsWith(t));if(!a)return;let o=e.raw_message.slice(a.length).trim();for(let t of this.events.command){if(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r)continue;let a=this.extractCommandBody(o,t.trigger);if(a!==null)try{let r=this.splitArgs(a),i=t.commander?t.commander().fail(!1).parseSync(r):{_:[],$0:``};if(await t.callback({context:e,options:i})===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){if(r instanceof Error&&r.stack?.toString().includes(`yargs`)){await this.sendMsg(e,[c.text(`命令使用错误:\n${r.message}\n\n`),c.text(await t.commander?.()?.getHelp()??`无帮助信息`)]);continue}this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}}}),this.ws.on(`request`,async e=>{this.logger.DEBUG(`收到请求:`,e);let t=`request.${e.request_type}.${`sub_type`in e?e.sub_type:``}`;for(let n of this.events.request)if(t.includes(n.endPoint??`request`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),this.ws.on(`notice`,async e=>{this.logger.DEBUG(`收到通知:`,e);let t=`notice.${e.notice_type}.${`sub_type`in e?e.sub_type:``}`;e.notice_type===`notify`&&(e.sub_type===`input_status`?t+=`.${e.group_id===0?`friend`:`group`}`:e.sub_type===`poke`&&(t+=`.${`group_id`in e?`group`:`friend`}`));for(let n of this.events.notice)if(t.includes(n.endPoint??`notice`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),await this.ws.connect(),this.logger.INFO(`Bot 初始化完成`)}splitArgsRegex=/"([^"]*)"|'([^']*)'|(\S+)/g;splitArgs(e){let t=e.matchAll(this.splitArgsRegex),n=[];for(let e of t)n.push(e[1]||e[2]||e[3]);return n}extractCommandBody(e,t){return typeof t==`string`?e.startsWith(t)?e.slice(t.length).trim():null:t.test(e)?e.replace(t,``).trim():null}regCommandEvent(e){let t={...e,type:`command`};t.commander&&(typeof t.commander!=`function`&&(t.commander=(e=>()=>e)(t.commander)),t.commander().exitProcess(!1).usage(`用法: ${t.trigger} [选项]`).locale(this.config.yargsLocale??`zh_CN`).help(!1).version(!1)),this.events.command=l([...this.events.command,t],`priority`,`down`);let n=()=>{let e=this.events.command.indexOf(t);e!==-1&&this.events.command.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regMessageEvent(e){let t={...e,type:`message`};this.events.message=l([...this.events.message,t],`priority`,`down`);let n=()=>{let e=this.events.message.indexOf(t);e!==-1&&this.events.message.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regNoticeEvent(e){let t={...e,type:`notice`};this.events.notice=l([...this.events.notice,t],`priority`,`down`);let n=()=>{let e=this.events.notice.indexOf(t);e!==-1&&this.events.notice.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regRequestEvent(e){let t={...e,type:`request`};this.events.request=l([...this.events.request,t],`priority`,`down`);let n=()=>{let e=this.events.request.indexOf(t);e!==-1&&this.events.request.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}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(c.reply(e.message_id)),r&&e.user_id&&i.push(c.at(e.user_id),c.text(`
2
2
  `)),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(t=>t.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(e=>e.nickname):this.ws.get_stranger_info({user_id:e.user_id}).then(e=>e.nickname)}},d=class{config;logger;bot;plugins={};configs={};normalizeConfigKey(e){return e.replaceAll(`/`,`__`)}async removeUselessLogs(){let t=await Array.fromAsync(a.promises.glob(`${this.config.logDir}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.log`)),n=this.config.maxFiles??30;if(t.length<=n)return;let r=t.length-n+1;t.sort().slice(0,r).map(t=>a.promises.rm(e.join(this.config.logDir,t)).catch())}constructor(e){this.config=e,this.logger=new n({title:`ATRI`,transformers:[r,...this.config.saveLogs?[i({filename:()=>(this.removeUselessLogs(),`./logs/${new Date().toISOString().slice(0,10)}.log`)})]:[]]}),this.bot=new u(this,{logLevel:e.logLevel,...e.botConfig})}async init(){console.log(`%c __ .__
3
3
  _____ _/ |_ _______ |__|
4
4
  \\__ \\ \\ __\\ \\_ __ \\ | |
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@atri-bot/core",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.5",
4
+ "version": "2.0.0-beta.7",
5
5
  "description": "QQBOT TypeScript framework",
6
6
  "author": "huankong233",
7
7
  "license": "MIT",