node-karin 0.0.3

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 (107) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +57 -0
  3. package/config/defSet/App.yaml +37 -0
  4. package/config/defSet/config.yaml +43 -0
  5. package/config/defSet/group.yaml +18 -0
  6. package/config/defSet/pm2.yaml +21 -0
  7. package/config/defSet/redis.yaml +18 -0
  8. package/config/defSet/server.yaml +42 -0
  9. package/config/view/App.yaml +74 -0
  10. package/config/view/config.yaml +100 -0
  11. package/config/view/group.yaml +62 -0
  12. package/config/view/pm2.yaml +41 -0
  13. package/config/view/redis.yaml +25 -0
  14. package/config/view/server.yaml +93 -0
  15. package/lib/adapter/onebot/onebot11.d.ts +430 -0
  16. package/lib/adapter/onebot/onebot11.js +1302 -0
  17. package/lib/core/init.d.ts +0 -0
  18. package/lib/core/init.js +4 -0
  19. package/lib/core/karin.d.ts +72 -0
  20. package/lib/core/karin.js +51 -0
  21. package/lib/core/listener.d.ts +121 -0
  22. package/lib/core/listener.js +188 -0
  23. package/lib/core/plugin.app.d.ts +15 -0
  24. package/lib/core/plugin.app.js +18 -0
  25. package/lib/core/plugin.d.ts +182 -0
  26. package/lib/core/plugin.js +138 -0
  27. package/lib/core/plugin.loader.d.ts +149 -0
  28. package/lib/core/plugin.loader.js +462 -0
  29. package/lib/core/server.d.ts +26 -0
  30. package/lib/core/server.js +213 -0
  31. package/lib/db/level.d.ts +20 -0
  32. package/lib/db/level.js +38 -0
  33. package/lib/db/redis.d.ts +41 -0
  34. package/lib/db/redis.js +137 -0
  35. package/lib/db/redis_level.d.ts +113 -0
  36. package/lib/db/redis_level.js +290 -0
  37. package/lib/event/event.d.ts +138 -0
  38. package/lib/event/event.handler.d.ts +29 -0
  39. package/lib/event/event.handler.js +142 -0
  40. package/lib/event/event.js +120 -0
  41. package/lib/event/message.d.ts +102 -0
  42. package/lib/event/message.handler.d.ts +25 -0
  43. package/lib/event/message.handler.js +240 -0
  44. package/lib/event/message.js +70 -0
  45. package/lib/event/notice.d.ts +49 -0
  46. package/lib/event/notice.js +15 -0
  47. package/lib/event/request.d.ts +49 -0
  48. package/lib/event/request.js +15 -0
  49. package/lib/event/review.handler.d.ts +54 -0
  50. package/lib/event/review.handler.js +382 -0
  51. package/lib/index.d.ts +23 -0
  52. package/lib/index.js +40 -0
  53. package/lib/renderer/app.d.ts +53 -0
  54. package/lib/renderer/app.js +93 -0
  55. package/lib/renderer/base.d.ts +30 -0
  56. package/lib/renderer/base.js +71 -0
  57. package/lib/renderer/client.d.ts +30 -0
  58. package/lib/renderer/client.js +159 -0
  59. package/lib/renderer/http.d.ts +19 -0
  60. package/lib/renderer/http.js +51 -0
  61. package/lib/renderer/server.d.ts +42 -0
  62. package/lib/renderer/server.js +112 -0
  63. package/lib/renderer/wormhole.d.ts +1 -0
  64. package/lib/renderer/wormhole.js +154 -0
  65. package/lib/types/adapter.d.ts +575 -0
  66. package/lib/types/adapter.js +1 -0
  67. package/lib/types/config.d.ts +327 -0
  68. package/lib/types/config.js +1 -0
  69. package/lib/types/element.d.ts +576 -0
  70. package/lib/types/element.js +1 -0
  71. package/lib/types/index.d.ts +8 -0
  72. package/lib/types/index.js +8 -0
  73. package/lib/types/logger.d.ts +109 -0
  74. package/lib/types/logger.js +1 -0
  75. package/lib/types/onebots11.d.ts +1371 -0
  76. package/lib/types/onebots11.js +1 -0
  77. package/lib/types/plugin.d.ts +282 -0
  78. package/lib/types/plugin.js +1 -0
  79. package/lib/types/render.d.ts +111 -0
  80. package/lib/types/render.js +1 -0
  81. package/lib/types/reply.d.ts +40 -0
  82. package/lib/types/reply.js +1 -0
  83. package/lib/types/types.d.ts +898 -0
  84. package/lib/types/types.js +1 -0
  85. package/lib/utils/YamlEditor.d.ts +62 -0
  86. package/lib/utils/YamlEditor.js +208 -0
  87. package/lib/utils/button.d.ts +49 -0
  88. package/lib/utils/button.js +79 -0
  89. package/lib/utils/common.d.ts +123 -0
  90. package/lib/utils/common.js +413 -0
  91. package/lib/utils/config.d.ts +72 -0
  92. package/lib/utils/config.js +254 -0
  93. package/lib/utils/exec.d.ts +22 -0
  94. package/lib/utils/exec.js +36 -0
  95. package/lib/utils/ffmpeg.d.ts +12 -0
  96. package/lib/utils/ffmpeg.js +25 -0
  97. package/lib/utils/handler.d.ts +76 -0
  98. package/lib/utils/handler.js +102 -0
  99. package/lib/utils/logger.d.ts +3 -0
  100. package/lib/utils/logger.js +104 -0
  101. package/lib/utils/segment.d.ts +276 -0
  102. package/lib/utils/segment.js +448 -0
  103. package/lib/utils/update.d.ts +69 -0
  104. package/lib/utils/update.js +151 -0
  105. package/lib/utils/updateVersion.d.ts +33 -0
  106. package/lib/utils/updateVersion.js +145 -0
  107. package/package.json +92 -0
@@ -0,0 +1,138 @@
1
+ import { Reply, replyCallback } from '../types/reply.js';
2
+ import { KarinAdapter } from '../types/adapter.js';
3
+ import { Event, contact, Sender, SubEventForEvent } from '../types/types.js';
4
+ /**
5
+ * - 事件基类 所有事件都继承自此类并且需要实现此类的所有属性
6
+ * @class KarinEvent
7
+ */
8
+ export declare class KarinEvent {
9
+ /**
10
+ * - 机器人ID 请尽量使用UID
11
+ */
12
+ self_id: string;
13
+ /**
14
+ * - 用户ID
15
+ */
16
+ user_id: string;
17
+ /**
18
+ * - 群ID 仅在群聊中存在
19
+ * @default ''
20
+ */
21
+ group_id: string;
22
+ /**
23
+ * - 事件类型
24
+ */
25
+ event: Event;
26
+ /**
27
+ * - 事件子类型
28
+ */
29
+ sub_event: SubEventForEvent<Event>;
30
+ /**
31
+ * - 事件ID
32
+ */
33
+ event_id: string;
34
+ /**
35
+ * - 事件触发时间戳
36
+ */
37
+ time: number;
38
+ /**
39
+ * - 事件联系人信息
40
+ */
41
+ contact: contact;
42
+ /**
43
+ * - 事件发送者信息
44
+ */
45
+ sender: Sender;
46
+ /**
47
+ * - 是否为主人
48
+ * @default false
49
+ */
50
+ isMaster: boolean;
51
+ /**
52
+ * - 是否为管理员
53
+ * @default false
54
+ */
55
+ isAdmin: boolean;
56
+ /**
57
+ * - 是否为私聊
58
+ * @default false
59
+ */
60
+ isPrivate: boolean;
61
+ /**
62
+ * - 是否为群聊
63
+ * @default false
64
+ */
65
+ isGroup: boolean;
66
+ /**
67
+ * - 是否为频道
68
+ * @default false
69
+ */
70
+ isGuild: boolean;
71
+ /**
72
+ * - 是否为群临时会话
73
+ * @default false
74
+ */
75
+ isGroupTemp: boolean;
76
+ /**
77
+ * - 日志函数字符串
78
+ */
79
+ logFnc: string;
80
+ /**
81
+ * - 日志用户字符串
82
+ */
83
+ logText: string;
84
+ /**
85
+ * - 存储器 由开发者自行调用
86
+ */
87
+ store: Map<string, any>;
88
+ /**
89
+ * - 回复函数
90
+ */
91
+ reply: Reply;
92
+ /**
93
+ * - 回复函数 由适配器实现,开发者不应该直接调用
94
+ */
95
+ replyCallback: replyCallback;
96
+ /**
97
+ * - bot实现
98
+ */
99
+ bot: KarinAdapter;
100
+ constructor({ event, self_id, user_id, group_id, time, contact, sender, sub_event, event_id, }: {
101
+ /**
102
+ * - 事件类型
103
+ */
104
+ event: Event;
105
+ /**
106
+ * - 机器人ID 请尽量使用UID
107
+ */
108
+ self_id: string;
109
+ /**
110
+ * - 用户ID
111
+ */
112
+ user_id: string;
113
+ /**
114
+ * - 群ID 仅在群聊中需要提供
115
+ */
116
+ group_id?: string;
117
+ /**
118
+ * - 事件触发时间戳
119
+ */
120
+ time: number;
121
+ /**
122
+ * - 事件联系人信息
123
+ */
124
+ contact: contact;
125
+ /**
126
+ * - 事件发送者信息
127
+ */
128
+ sender: Sender;
129
+ /**
130
+ * - 事件子类型
131
+ */
132
+ sub_event: SubEventForEvent<Event>;
133
+ /**
134
+ * - 事件ID
135
+ */
136
+ event_id: string;
137
+ });
138
+ }
@@ -0,0 +1,29 @@
1
+ import { GroupCfg } from '../types/config.js';
2
+ import { KarinMessage } from './message.js';
3
+ import { KarinNotice } from './notice.js';
4
+ import { KarinRequest } from './request.js';
5
+ import { Event, Permission, SubEvent } from '../types/types.js';
6
+ export default class EventHandler {
7
+ e: KarinMessage | KarinNotice | KarinRequest;
8
+ config: GroupCfg | {};
9
+ /**
10
+ * 处理事件,加入自定义字段
11
+ */
12
+ constructor(e: KarinMessage | KarinNotice | KarinRequest);
13
+ /**
14
+ * 事件处理
15
+ */
16
+ review(): boolean;
17
+ /**
18
+ * 根据事件类型过滤事件
19
+ */
20
+ filtEvent(event: Event | `${Event}.${SubEvent}`): boolean;
21
+ /**
22
+ * 判断权限
23
+ */
24
+ filterPermission(permission: Permission | undefined): boolean;
25
+ /**
26
+ * 快速回复
27
+ */
28
+ reply(): void;
29
+ }
@@ -0,0 +1,142 @@
1
+ import Review from './review.handler.js'
2
+ import config from '../utils/config.js'
3
+ import logger from '../utils/logger.js'
4
+ import Common from '../utils/common.js'
5
+ import Segment from '../utils/segment.js'
6
+ import Listeners from '../core/listener.js'
7
+ export default class EventHandler {
8
+ e
9
+ config
10
+ /**
11
+ * 处理事件,加入自定义字段
12
+ */
13
+ constructor (e) {
14
+ this.e = e
15
+ this.config = {}
16
+ /** 加入e.bot */
17
+ Object.defineProperty(this.e, 'bot', { value: Listeners.getBot(this.e.self_id) })
18
+ if (this.e.group_id) { this.config = config.group(this.e.group_id) }
19
+ }
20
+
21
+ /**
22
+ * 事件处理
23
+ */
24
+ review () {
25
+ /** 检查CD */
26
+ if (!Review.CD(this.e, this.config)) {
27
+ logger.debug('[消息拦截] 正在冷却中')
28
+ return true
29
+ }
30
+ /** 检查群聊黑白名单 */
31
+ if (!Review.GroupEnable(this.e)) {
32
+ logger.debug('[消息拦截] 未通过群聊黑白名单检查')
33
+ return true
34
+ }
35
+ /** 检查用户黑白名单 */
36
+ if (!Review.UserEnable(this.e)) {
37
+ logger.debug('[消息拦截] 未通过用户黑白名单检查')
38
+ return true
39
+ }
40
+ /** 都通过了 */
41
+ return false
42
+ }
43
+
44
+ /**
45
+ * 根据事件类型过滤事件
46
+ */
47
+ filtEvent (event) {
48
+ /** 事件映射表 */
49
+ const eventMap = {
50
+ message: () => `message.${this.e.sub_event}`,
51
+ message_sent: () => `message_sent.${this.e.sub_event}`,
52
+ meta_event: () => `message.${this.e.sub_event}`,
53
+ notice: () => `notice.${this.e.sub_event}`,
54
+ request: () => `request.${this.e.sub_event}`,
55
+ }
56
+ const eventType = eventMap[this.e.event]()
57
+ return eventType.includes(event)
58
+ }
59
+
60
+ /**
61
+ * 判断权限
62
+ */
63
+ filterPermission (permission) {
64
+ if (!permission || permission === 'all') { return true }
65
+ if (permission === 'master') {
66
+ if (!this.e.isMaster) {
67
+ this.e.reply('暂无权限,只有主人才能操作')
68
+ return false
69
+ }
70
+ return true
71
+ }
72
+ if (permission === 'admin') {
73
+ if (!this.e.isMaster && !this.e.isAdmin) {
74
+ this.e.reply('暂无权限,只有管理员才能操作')
75
+ return false
76
+ }
77
+ return true
78
+ }
79
+ if (this.e.isGroup) {
80
+ const list = {
81
+ 'group.owner': {
82
+ role: 'owner',
83
+ name: '群主',
84
+ },
85
+ 'group.admin': {
86
+ role: 'admin',
87
+ name: '群管理员',
88
+ },
89
+ }
90
+ const role = list[permission]
91
+ if (role && this.e.sender?.role !== role.role) {
92
+ this.e.reply(`暂无权限,只有${role.name}才能操作`)
93
+ return false
94
+ }
95
+ }
96
+ return true
97
+ }
98
+
99
+ /**
100
+ * 快速回复
101
+ */
102
+ reply () {
103
+ /**
104
+ * 快速回复
105
+ * @param elements 回复内容
106
+ * @param options 回复选项
107
+ */
108
+ this.e.reply = async (elements = '', options = { reply: false, recallMsg: 0, at: false, retry_count: 1 }) => {
109
+ const message = Common.makeMessage(elements)
110
+ const { reply = false, recallMsg = 0, at, retry_count = 1 } = options
111
+ /** 加入at */
112
+ if (at && this.e.isGroup) { message.unshift(Segment.at(this.e.user_id)) }
113
+ /** 加入引用回复 */
114
+ if (reply && 'message_id' in this.e) { message.unshift(Segment.reply(this.e.message_id)) }
115
+ /** 先发 提升速度 */
116
+ const result = this.e.replyCallback(message, retry_count)
117
+ const ReplyLog = Common.makeMessageLog(message)
118
+ if (this.e.isGroup) {
119
+ Review.GroupMsgPrint(this.e) && logger.bot('info', this.e.self_id, `${logger.green(`Send Group ${this.e.group_id}: `)}${ReplyLog}`)
120
+ } else {
121
+ logger.bot('info', this.e.self_id, `${logger.green(`Send private ${this.e.user_id}: `)}${ReplyLog}`)
122
+ }
123
+ let message_id = ''
124
+ try {
125
+ Listeners.emit('karin:count:send', 1)
126
+ /** 取结果 */
127
+ const Res = await result
128
+ message_id = Res.message_id || ''
129
+ logger.bot('debug', this.e.self_id, `回复消息结果:${JSON.stringify(result)}`)
130
+ } catch (error) {
131
+ logger.bot('error', this.e.self_id, `回复消息失败:${ReplyLog}`)
132
+ logger.bot('error', this.e.self_id, error.stack || error.message || JSON.stringify(error))
133
+ }
134
+ /** 快速撤回 */
135
+ if (recallMsg > 0 && message_id) {
136
+ setTimeout(() => this.e.bot.RecallMessage(this.e.contact, message_id), recallMsg * 1000)
137
+ }
138
+ return result
139
+ }
140
+ Object.freeze(this.e.reply)
141
+ }
142
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * - 事件基类 所有事件都继承自此类并且需要实现此类的所有属性
3
+ * @class KarinEvent
4
+ */
5
+ export class KarinEvent {
6
+ /**
7
+ * - 机器人ID 请尽量使用UID
8
+ */
9
+ self_id
10
+ /**
11
+ * - 用户ID
12
+ */
13
+ user_id
14
+ /**
15
+ * - 群ID 仅在群聊中存在
16
+ * @default ''
17
+ */
18
+ group_id
19
+ /**
20
+ * - 事件类型
21
+ */
22
+ event
23
+ /**
24
+ * - 事件子类型
25
+ */
26
+ sub_event
27
+ /**
28
+ * - 事件ID
29
+ */
30
+ event_id
31
+ /**
32
+ * - 事件触发时间戳
33
+ */
34
+ time
35
+ /**
36
+ * - 事件联系人信息
37
+ */
38
+ contact
39
+ /**
40
+ * - 事件发送者信息
41
+ */
42
+ sender
43
+ /**
44
+ * - 是否为主人
45
+ * @default false
46
+ */
47
+ isMaster
48
+ /**
49
+ * - 是否为管理员
50
+ * @default false
51
+ */
52
+ isAdmin
53
+ /**
54
+ * - 是否为私聊
55
+ * @default false
56
+ */
57
+ isPrivate
58
+ /**
59
+ * - 是否为群聊
60
+ * @default false
61
+ */
62
+ isGroup
63
+ /**
64
+ * - 是否为频道
65
+ * @default false
66
+ */
67
+ isGuild
68
+ /**
69
+ * - 是否为群临时会话
70
+ * @default false
71
+ */
72
+ isGroupTemp
73
+ /**
74
+ * - 日志函数字符串
75
+ */
76
+ logFnc
77
+ /**
78
+ * - 日志用户字符串
79
+ */
80
+ logText
81
+ /**
82
+ * - 存储器 由开发者自行调用
83
+ */
84
+ store
85
+ /**
86
+ * - 回复函数
87
+ */
88
+ reply
89
+ /**
90
+ * - 回复函数 由适配器实现,开发者不应该直接调用
91
+ */
92
+ replyCallback
93
+ /**
94
+ * - bot实现
95
+ */
96
+ bot
97
+ constructor ({ event, self_id, user_id, group_id = '', time, contact, sender, sub_event, event_id }) {
98
+ this.self_id = self_id
99
+ this.user_id = user_id
100
+ this.group_id = group_id
101
+ this.time = time
102
+ this.event = event
103
+ this.event_id = event_id
104
+ this.contact = contact
105
+ this.sender = sender
106
+ this.sub_event = sub_event
107
+ this.isMaster = false
108
+ this.isAdmin = false
109
+ this.isPrivate = false
110
+ this.isGroup = false
111
+ this.isGuild = false
112
+ this.isGroupTemp = false
113
+ this.logFnc = ''
114
+ this.logText = ''
115
+ this.store = new Map()
116
+ this.reply = (elements, options) => Promise.resolve({ message_id: '' })
117
+ this.replyCallback = (elements, options) => Promise.resolve({ message_id: '' })
118
+ this.bot = {}
119
+ }
120
+ }
@@ -0,0 +1,102 @@
1
+ import { KarinEvent } from './event.js';
2
+ import { KarinElement } from '../types/element.js';
3
+ import { contact, Sender } from '../types/types.js';
4
+ /**
5
+ * - 消息事件基类
6
+ */
7
+ export declare class KarinMessage extends KarinEvent {
8
+ constructor({ event, self_id, user_id, time, message_id, message_seq, raw_message, contact, sender, elements, group_id, }: {
9
+ /**
10
+ * - 事件类型
11
+ */
12
+ event: 'message' | 'message_sent';
13
+ /**
14
+ * - 机器人ID 请尽量使用UID
15
+ */
16
+ self_id: string;
17
+ /**
18
+ * - 用户ID
19
+ */
20
+ user_id: string;
21
+ /**
22
+ * - 事件触发时间戳
23
+ */
24
+ time: number;
25
+ /**
26
+ * - 消息ID
27
+ */
28
+ message_id: string;
29
+ /**
30
+ * - 消息序列号
31
+ */
32
+ message_seq?: string;
33
+ /**
34
+ * - 原始消息文本
35
+ */
36
+ raw_message: string;
37
+ /**
38
+ * 事件联系人信息
39
+ */
40
+ contact: contact;
41
+ /**
42
+ * 事件发送者信息
43
+ */
44
+ sender: Sender;
45
+ /**
46
+ * 消息体元素
47
+ */
48
+ elements: Array<KarinElement>;
49
+ /**
50
+ * 群ID
51
+ */
52
+ group_id: string;
53
+ });
54
+ /**
55
+ * - 消息ID
56
+ */
57
+ message_id: string;
58
+ /**
59
+ * - 消息序列号
60
+ */
61
+ message_seq?: string;
62
+ /**
63
+ * - 原始消息文本
64
+ */
65
+ raw_message: string;
66
+ /**
67
+ * - 消息体元素
68
+ */
69
+ elements: Array<KarinElement>;
70
+ /**
71
+ * - 框架处理后的文本
72
+ */
73
+ msg: string;
74
+ /**
75
+ * - 图片数组
76
+ */
77
+ image: Array<string>;
78
+ /**
79
+ * - AT数组
80
+ */
81
+ at: Array<string>;
82
+ /**
83
+ * - 是否AT机器人
84
+ */
85
+ atBot: boolean;
86
+ /**
87
+ * - 是否AT全体
88
+ */
89
+ atAll: boolean;
90
+ /**
91
+ * - 文件元素
92
+ */
93
+ file: object;
94
+ /**
95
+ * - 引用消息ID
96
+ */
97
+ reply_id: string;
98
+ /**
99
+ * - 消息别名
100
+ */
101
+ alias: string;
102
+ }
@@ -0,0 +1,25 @@
1
+ import { KarinMessage } from './message.js';
2
+ import EventHandler from './event.handler.js';
3
+ /**
4
+ * 消息事件
5
+ */
6
+ export default class Message extends EventHandler {
7
+ e: KarinMessage;
8
+ /**
9
+ * - 是否打印群消息日志
10
+ */
11
+ GroupMsgPrint: boolean;
12
+ constructor(e: KarinMessage);
13
+ /**
14
+ * 处理消息
15
+ */
16
+ deal(): Promise<void>;
17
+ /**
18
+ * 处理消息体
19
+ */
20
+ dealMsg(): void;
21
+ /**
22
+ * 处理上下文
23
+ */
24
+ context(): Promise<boolean>;
25
+ }