@zhin.js/adapter-qq 1.0.16 → 1.0.18
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/CHANGELOG.md +17 -0
- package/README.md +282 -0
- package/lib/index.d.ts +23 -11
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +63 -43
- package/lib/index.js.map +1 -1
- package/package.json +3 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
# @zhin.js/adapter-qq
|
|
2
2
|
|
|
3
|
+
## 1.0.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d16a69c: fix: test trust publish
|
|
8
|
+
- Updated dependencies [d16a69c]
|
|
9
|
+
- @zhin.js/logger@0.1.2
|
|
10
|
+
- zhin.js@1.0.18
|
|
11
|
+
|
|
12
|
+
## 1.0.17
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- zhin.js@1.0.17
|
|
17
|
+
|
|
3
18
|
## 1.0.16
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
6
21
|
|
|
22
|
+
- 修复 $sendMessage 方法中重复的日志输出
|
|
23
|
+
- 添加完整的 README 文档和使用指南
|
|
7
24
|
- zhin.js@1.0.16
|
|
8
25
|
|
|
9
26
|
## 1.0.15
|
package/README.md
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# @zhin.js/adapter-qq
|
|
2
|
+
|
|
3
|
+
Zhin.js QQ 官方机器人适配器,基于 QQ 官方机器人 API 开发,支持频道、群聊和私聊消息。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @zhin.js/adapter-qq
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 配置
|
|
12
|
+
|
|
13
|
+
### 基础配置
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { defineConfig } from 'zhin.js';
|
|
17
|
+
|
|
18
|
+
export default defineConfig({
|
|
19
|
+
bots: [
|
|
20
|
+
{
|
|
21
|
+
context: 'qq',
|
|
22
|
+
name: '你的机器人ID', // 机器人的 AppID
|
|
23
|
+
appID: process.env.QQ_APP_ID,
|
|
24
|
+
token: process.env.QQ_TOKEN,
|
|
25
|
+
secret: process.env.QQ_SECRET,
|
|
26
|
+
mode: 'public', // 或 'private'
|
|
27
|
+
platform: 'qq', // 'qq' | 'qzone'
|
|
28
|
+
data_dir: './data' // 数据存储目录
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
plugins: [
|
|
32
|
+
'http',
|
|
33
|
+
'adapter-qq'
|
|
34
|
+
]
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 完整配置选项
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
const config: QQBotConfig = {
|
|
42
|
+
context: 'qq',
|
|
43
|
+
name: '机器人ID',
|
|
44
|
+
appID: 'YOUR_APP_ID', // 机器人 AppID(必需)
|
|
45
|
+
token: 'YOUR_TOKEN', // 机器人 Token(必需)
|
|
46
|
+
secret: 'YOUR_SECRET', // 机器人 Secret(必需)
|
|
47
|
+
mode: 'public', // 'public' | 'private' 接收模式
|
|
48
|
+
platform: 'qq', // 'qq' | 'qzone' 平台类型
|
|
49
|
+
intents: [ // 事件订阅意图
|
|
50
|
+
'GUILDS',
|
|
51
|
+
'GUILD_MEMBERS',
|
|
52
|
+
'DIRECT_MESSAGE',
|
|
53
|
+
'GROUP_AT_MESSAGE_CREATE'
|
|
54
|
+
],
|
|
55
|
+
data_dir: './data', // 数据目录(可选)
|
|
56
|
+
sandbox: false // 是否为沙箱环境(可选)
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 获取配置信息
|
|
61
|
+
|
|
62
|
+
### 1. 注册 QQ 机器人
|
|
63
|
+
|
|
64
|
+
1. 访问 [QQ 开放平台](https://q.qq.com/bot)
|
|
65
|
+
2. 登录并创建机器人应用
|
|
66
|
+
3. 在「开发设置」中获取:
|
|
67
|
+
- **AppID**: 机器人应用 ID
|
|
68
|
+
- **Token**: 机器人令牌
|
|
69
|
+
- **Secret**: 机器人密钥
|
|
70
|
+
|
|
71
|
+
### 2. 配置权限
|
|
72
|
+
|
|
73
|
+
在机器人设置中:
|
|
74
|
+
- 配置需要的事件订阅
|
|
75
|
+
- 设置消息接收模式(公域/私域)
|
|
76
|
+
- 添加频道/群聊白名单(如需要)
|
|
77
|
+
|
|
78
|
+
### 3. 事件订阅(Intents)
|
|
79
|
+
|
|
80
|
+
可订阅的事件类型:
|
|
81
|
+
- `GUILDS` - 频道事件
|
|
82
|
+
- `GUILD_MEMBERS` - 成员变动
|
|
83
|
+
- `GUILD_MESSAGES` - 频道消息
|
|
84
|
+
- `DIRECT_MESSAGE` - 私信消息
|
|
85
|
+
- `GROUP_AT_MESSAGE_CREATE` - 群聊 @ 消息
|
|
86
|
+
- `INTERACTION` - 互动事件
|
|
87
|
+
|
|
88
|
+
## 使用示例
|
|
89
|
+
|
|
90
|
+
### 基础消息处理
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { addCommand, MessageCommand } from 'zhin.js'
|
|
94
|
+
|
|
95
|
+
addCommand(new MessageCommand('hello <name:text>')
|
|
96
|
+
.action(async (message, result) => {
|
|
97
|
+
return `你好,${result.params.name}!`
|
|
98
|
+
})
|
|
99
|
+
)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 频道消息
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { onMessage } from 'zhin.js'
|
|
106
|
+
|
|
107
|
+
onMessage(async (message) => {
|
|
108
|
+
// 仅处理频道消息
|
|
109
|
+
if (message.$channel.type === 'channel') {
|
|
110
|
+
console.log(`频道消息:${message.$raw}`)
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 群聊消息
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { onGroupMessage } from 'zhin.js'
|
|
119
|
+
|
|
120
|
+
onGroupMessage(async (message) => {
|
|
121
|
+
console.log(`群聊消息来自:${message.$sender.name}`)
|
|
122
|
+
console.log(`消息内容:${message.$raw}`)
|
|
123
|
+
})
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 私聊消息
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { onPrivateMessage } from 'zhin.js'
|
|
130
|
+
|
|
131
|
+
onPrivateMessage(async (message) => {
|
|
132
|
+
await message.$reply('收到你的私信了!')
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 发送不同类型消息
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
addCommand(new MessageCommand('card')
|
|
140
|
+
.action(async (message) => {
|
|
141
|
+
// 发送 Ark 模板卡片
|
|
142
|
+
return {
|
|
143
|
+
type: 'ark',
|
|
144
|
+
template_id: 23,
|
|
145
|
+
kv: [
|
|
146
|
+
{ key: '#TITLE#', value: '标题' },
|
|
147
|
+
{ key: '#DESC#', value: '描述' },
|
|
148
|
+
{ key: '#PROMPT#', value: '提示' }
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
addCommand(new MessageCommand('embed')
|
|
155
|
+
.action(async (message) => {
|
|
156
|
+
// 发送 Embed 消息
|
|
157
|
+
return {
|
|
158
|
+
type: 'embed',
|
|
159
|
+
title: 'Embed 标题',
|
|
160
|
+
prompt: '消息提示',
|
|
161
|
+
thumbnail: { url: 'https://example.com/image.png' },
|
|
162
|
+
fields: [
|
|
163
|
+
{ name: '字段1', value: '值1' }
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
})
|
|
167
|
+
)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 消息类型支持
|
|
171
|
+
|
|
172
|
+
### 接收消息类型
|
|
173
|
+
|
|
174
|
+
- ✅ 文本消息
|
|
175
|
+
- ✅ @ 提及
|
|
176
|
+
- ✅ 图片消息
|
|
177
|
+
- ✅ 表情消息
|
|
178
|
+
- ✅ Ark 模板消息
|
|
179
|
+
- ✅ Embed 消息
|
|
180
|
+
- ✅ Markdown 消息
|
|
181
|
+
|
|
182
|
+
### 发送消息类型
|
|
183
|
+
|
|
184
|
+
- ✅ 文本消息
|
|
185
|
+
- ✅ 图片消息
|
|
186
|
+
- ✅ Ark 模板消息
|
|
187
|
+
- ✅ Embed 富文本消息
|
|
188
|
+
- ✅ Markdown 消息
|
|
189
|
+
- ✅ 消息引用(回复)
|
|
190
|
+
|
|
191
|
+
## API 方法
|
|
192
|
+
|
|
193
|
+
### 基础方法
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
const bot = app.adapters.get('qq')?.bots.get('你的机器人ID')
|
|
197
|
+
|
|
198
|
+
// 发送私信
|
|
199
|
+
await bot.sendPrivateMessage(userId, '消息内容')
|
|
200
|
+
|
|
201
|
+
// 发送群消息
|
|
202
|
+
await bot.sendGroupMessage(groupId, '消息内容')
|
|
203
|
+
|
|
204
|
+
// 发送频道消息
|
|
205
|
+
await bot.sendGuildMessage(channelId, '消息内容')
|
|
206
|
+
|
|
207
|
+
// 撤回消息
|
|
208
|
+
await bot.$recallMessage(messageId)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## 消息 ID 格式
|
|
212
|
+
|
|
213
|
+
本适配器使用特殊的消息 ID 格式来区分不同类型的消息:
|
|
214
|
+
|
|
215
|
+
- 私信:`private-{userId}:{messageId}`
|
|
216
|
+
- 群聊:`group-{groupId}:{messageId}`
|
|
217
|
+
- 频道:`channel-{channelId}:{messageId}`
|
|
218
|
+
- 私域频道:`direct-{guildId}:{messageId}`
|
|
219
|
+
|
|
220
|
+
## 注意事项
|
|
221
|
+
|
|
222
|
+
### 接收模式
|
|
223
|
+
|
|
224
|
+
- **公域模式 (public)**: 仅接收 @ 机器人的消息
|
|
225
|
+
- **私域模式 (private)**: 可接收频道内所有消息(需要申请权限)
|
|
226
|
+
|
|
227
|
+
### 频率限制
|
|
228
|
+
|
|
229
|
+
QQ 机器人有严格的频率限制:
|
|
230
|
+
- 主动消息:每个用户每天 5 条
|
|
231
|
+
- 被动消息(回复):无限制
|
|
232
|
+
- 建议在被动模式下使用(用户 @ 后回复)
|
|
233
|
+
|
|
234
|
+
### 沙箱环境
|
|
235
|
+
|
|
236
|
+
开发时可以使用沙箱环境测试:
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
{
|
|
240
|
+
context: 'qq',
|
|
241
|
+
sandbox: true, // 启用沙箱
|
|
242
|
+
// ...其他配置
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 常见问题
|
|
247
|
+
|
|
248
|
+
### Q: 机器人无法收到消息?
|
|
249
|
+
|
|
250
|
+
A: 检查以下几点:
|
|
251
|
+
1. AppID、Token、Secret 是否正确
|
|
252
|
+
2. 事件订阅(Intents)是否包含对应类型
|
|
253
|
+
3. 公域模式下消息是否 @ 了机器人
|
|
254
|
+
4. 机器人是否已加入对应频道/群聊
|
|
255
|
+
|
|
256
|
+
### Q: 发送消息失败?
|
|
257
|
+
|
|
258
|
+
A: 可能的原因:
|
|
259
|
+
1. 超过主动消息频率限制
|
|
260
|
+
2. 没有对应频道/群的发送权限
|
|
261
|
+
3. 消息格式不符合规范
|
|
262
|
+
4. Token 已过期或失效
|
|
263
|
+
|
|
264
|
+
### Q: 如何处理不同平台?
|
|
265
|
+
|
|
266
|
+
A: 使用 `platform` 配置:
|
|
267
|
+
- `qq`: QQ 频道和群聊
|
|
268
|
+
- `qzone`: QQ 空间(如支持)
|
|
269
|
+
|
|
270
|
+
## 相关链接
|
|
271
|
+
|
|
272
|
+
- [QQ 开放平台](https://q.qq.com/bot)
|
|
273
|
+
- [QQ 机器人开发文档](https://bot.q.qq.com/wiki/)
|
|
274
|
+
- [Zhin.js 官方文档](https://github.com/zhinjs/zhin)
|
|
275
|
+
|
|
276
|
+
## 许可证
|
|
277
|
+
|
|
278
|
+
MIT License
|
|
279
|
+
|
|
280
|
+
## 贡献
|
|
281
|
+
|
|
282
|
+
欢迎提交 Issue 和 Pull Request!
|
package/lib/index.d.ts
CHANGED
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
import { Bot, PrivateMessageEvent, GroupMessageEvent, ReceiverMode, ApplicationPlatform } from "qq-official-bot";
|
|
2
|
-
export { ReceiverMode
|
|
3
|
-
export type { ApplicationPlatform, Intent
|
|
4
|
-
import { Bot as ZhinBot, Adapter, Message, SendOptions } from "zhin.js";
|
|
5
|
-
declare module
|
|
2
|
+
export { ReceiverMode } from "qq-official-bot";
|
|
3
|
+
export type { ApplicationPlatform, Intent } from "qq-official-bot";
|
|
4
|
+
import { Bot as ZhinBot, Adapter, Plugin, Message, SendOptions } from "zhin.js";
|
|
5
|
+
declare module "zhin.js" {
|
|
6
|
+
namespace Plugin {
|
|
7
|
+
interface Contexts {
|
|
8
|
+
qq: QQAdapter;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
6
11
|
interface RegisteredAdapters {
|
|
7
|
-
qq:
|
|
12
|
+
qq: QQAdapter;
|
|
8
13
|
}
|
|
9
14
|
}
|
|
10
|
-
export type QQBotConfig<T extends ReceiverMode, M extends ApplicationPlatform = ApplicationPlatform> =
|
|
11
|
-
context:
|
|
12
|
-
name:
|
|
15
|
+
export type QQBotConfig<T extends ReceiverMode, M extends ApplicationPlatform = ApplicationPlatform> = Bot.Config<T, M> & {
|
|
16
|
+
context: "qq";
|
|
17
|
+
name: string;
|
|
18
|
+
data_dir?: string;
|
|
13
19
|
};
|
|
14
20
|
export interface QQBot<T extends ReceiverMode, M extends ApplicationPlatform = ApplicationPlatform> {
|
|
15
21
|
$config: QQBotConfig<T, M>;
|
|
16
22
|
}
|
|
17
|
-
export declare class QQBot<T extends ReceiverMode, M extends ApplicationPlatform = ApplicationPlatform> extends Bot implements ZhinBot<
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
export declare class QQBot<T extends ReceiverMode, M extends ApplicationPlatform = ApplicationPlatform> extends Bot implements ZhinBot<QQBotConfig<T, M>, PrivateMessageEvent | GroupMessageEvent> {
|
|
24
|
+
adapter: QQAdapter;
|
|
25
|
+
$connected: boolean;
|
|
26
|
+
get $id(): string;
|
|
27
|
+
constructor(adapter: QQAdapter, config: QQBotConfig<T, M>);
|
|
20
28
|
private handleQQMessage;
|
|
21
29
|
$connect(): Promise<void>;
|
|
22
30
|
$disconnect(): Promise<void>;
|
|
@@ -24,4 +32,8 @@ export declare class QQBot<T extends ReceiverMode, M extends ApplicationPlatform
|
|
|
24
32
|
$sendMessage(options: SendOptions): Promise<string>;
|
|
25
33
|
$recallMessage(id: string): Promise<void>;
|
|
26
34
|
}
|
|
35
|
+
declare class QQAdapter extends Adapter<QQBot<ReceiverMode>> {
|
|
36
|
+
constructor(plugin: Plugin);
|
|
37
|
+
createBot(config: QQBotConfig<ReceiverMode>): QQBot<ReceiverMode>;
|
|
38
|
+
}
|
|
27
39
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,GAAG,IAAI,OAAO,EAEd,OAAO,EACP,MAAM,EACN,OAAO,EACP,WAAW,EAGZ,MAAM,SAAS,CAAC;AAGjB,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,EAAE,EAAE,SAAS,CAAC;SACf;KACF;IAED,UAAU,kBAAkB;QAC1B,EAAE,EAAE,SAAS,CAAC;KACf;CACF;AAMD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IACjB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEJ,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,mBAAmB,GAAG,mBAAmB;IAChG,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5B;AAED,qBAAa,KAAK,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,CAC5F,SAAQ,GACR,YAAW,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IAQ3D,OAAO,EAAE,SAAS;IANrC,UAAU,EAAE,OAAO,CAAS;IAE5B,IAAI,GAAG,WAEN;gBAEkB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAMhE,OAAO,CAAC,eAAe;IAMjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,cAAc,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB;IAqCrD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUhD;AAED,cAAM,SAAU,SAAQ,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACtC,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;CAGlE"}
|
package/lib/index.js
CHANGED
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
import { Bot } from "qq-official-bot";
|
|
1
|
+
import { Bot, } from "qq-official-bot";
|
|
2
2
|
import path from "path";
|
|
3
|
-
export { ReceiverMode
|
|
4
|
-
import { usePlugin, Adapter,
|
|
3
|
+
export { ReceiverMode } from "qq-official-bot";
|
|
4
|
+
import { usePlugin, Adapter, Message, segment, } from "zhin.js";
|
|
5
5
|
const plugin = usePlugin();
|
|
6
|
+
const { provide, useContext } = plugin;
|
|
6
7
|
export class QQBot extends Bot {
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
adapter;
|
|
9
|
+
$connected = false;
|
|
10
|
+
get $id() {
|
|
11
|
+
return this.$config.name;
|
|
12
|
+
}
|
|
13
|
+
constructor(adapter, config) {
|
|
9
14
|
if (!config.data_dir)
|
|
10
|
-
config.data_dir = path.join(process.cwd(),
|
|
15
|
+
config.data_dir = path.join(process.cwd(), "data");
|
|
11
16
|
super(config);
|
|
17
|
+
this.adapter = adapter;
|
|
12
18
|
this.$config = config;
|
|
13
19
|
}
|
|
14
20
|
handleQQMessage(msg) {
|
|
15
21
|
const message = this.$formatMessage(msg);
|
|
16
|
-
|
|
17
|
-
plugin.logger.
|
|
18
|
-
plugin.dispatch(`message.${message.$channel.type}.receive`, message);
|
|
22
|
+
this.adapter.emit("message.receive", message);
|
|
23
|
+
plugin.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
|
|
19
24
|
}
|
|
20
25
|
async $connect() {
|
|
21
|
-
this.on(
|
|
22
|
-
this.on(
|
|
23
|
-
this.on(
|
|
26
|
+
this.on("message.group", this.handleQQMessage.bind(this));
|
|
27
|
+
this.on("message.guild", this.handleQQMessage.bind(this));
|
|
28
|
+
this.on("message.private", this.handleQQMessage.bind(this));
|
|
24
29
|
await this.start();
|
|
25
30
|
this.$connected = true;
|
|
26
31
|
}
|
|
@@ -30,15 +35,15 @@ export class QQBot extends Bot {
|
|
|
30
35
|
}
|
|
31
36
|
$formatMessage(msg) {
|
|
32
37
|
let target_id = msg.user_id;
|
|
33
|
-
if (msg.message_type ===
|
|
38
|
+
if (msg.message_type === "guild")
|
|
34
39
|
target_id = msg.channel_id;
|
|
35
|
-
if (msg.message_type ===
|
|
40
|
+
if (msg.message_type === "group")
|
|
36
41
|
target_id = msg.group_id;
|
|
37
|
-
if (msg.sub_type ===
|
|
42
|
+
if (msg.sub_type === "direct")
|
|
38
43
|
target_id = `direct:${msg.guild_id}`;
|
|
39
44
|
const result = Message.from(msg, {
|
|
40
45
|
$id: msg.message_id?.toString(),
|
|
41
|
-
$adapter:
|
|
46
|
+
$adapter: "qq",
|
|
42
47
|
$bot: this.$config.name,
|
|
43
48
|
$sender: {
|
|
44
49
|
id: msg.sender.user_id?.toString(),
|
|
@@ -46,7 +51,7 @@ export class QQBot extends Bot {
|
|
|
46
51
|
},
|
|
47
52
|
$channel: {
|
|
48
53
|
id: target_id,
|
|
49
|
-
type: msg.message_type ===
|
|
54
|
+
type: msg.message_type === "guild" ? "channel" : msg.message_type,
|
|
50
55
|
},
|
|
51
56
|
$content: msg.message,
|
|
52
57
|
$raw: msg.raw_message,
|
|
@@ -58,49 +63,41 @@ export class QQBot extends Bot {
|
|
|
58
63
|
if (!Array.isArray(content))
|
|
59
64
|
content = [content];
|
|
60
65
|
if (quote)
|
|
61
|
-
content.unshift({ type:
|
|
66
|
+
content.unshift({ type: "reply", data: { id: typeof quote === "boolean" ? result.$id : quote } });
|
|
62
67
|
return await this.$sendMessage({
|
|
63
68
|
...result.$channel,
|
|
64
|
-
context:
|
|
69
|
+
context: "qq",
|
|
65
70
|
bot: this.$config.name,
|
|
66
|
-
content
|
|
71
|
+
content,
|
|
67
72
|
});
|
|
68
|
-
}
|
|
73
|
+
},
|
|
69
74
|
});
|
|
70
75
|
return result;
|
|
71
76
|
}
|
|
72
77
|
async $sendMessage(options) {
|
|
73
|
-
options = await plugin.app.handleBeforeSend(options);
|
|
74
78
|
switch (options.type) {
|
|
75
|
-
case
|
|
76
|
-
if (options.id.startsWith(
|
|
77
|
-
const id = options.id.replace(
|
|
79
|
+
case "private": {
|
|
80
|
+
if (options.id.startsWith("direct:")) {
|
|
81
|
+
const id = options.id.replace("direct:", "");
|
|
78
82
|
const result = await this.sendDirectMessage(id, options.content);
|
|
79
|
-
plugin.logger.
|
|
80
|
-
plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
83
|
+
plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
81
84
|
return `direct-${options.id}:${result.message_id.toString()}`;
|
|
82
85
|
}
|
|
83
86
|
else {
|
|
84
87
|
const result = await this.sendPrivateMessage(options.id, options.content);
|
|
85
|
-
plugin.logger.
|
|
86
|
-
plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
88
|
+
plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
87
89
|
return `private-${options.id}:${result.message_id.toString()}`;
|
|
88
90
|
}
|
|
89
|
-
break;
|
|
90
91
|
}
|
|
91
92
|
case "group": {
|
|
92
93
|
const result = await this.sendGroupMessage(options.id, options.content);
|
|
93
|
-
plugin.logger.
|
|
94
|
-
plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
94
|
+
plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
95
95
|
return `group-${options.id}:${result.message_id.toString()}`;
|
|
96
|
-
break;
|
|
97
96
|
}
|
|
98
|
-
case
|
|
97
|
+
case "channel": {
|
|
99
98
|
const result = await this.sendGuildMessage(options.id, options.content);
|
|
100
|
-
plugin.logger.
|
|
101
|
-
plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
99
|
+
plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
102
100
|
return `channel-${options.id}:${result.message_id.toString()}`;
|
|
103
|
-
break;
|
|
104
101
|
}
|
|
105
102
|
default:
|
|
106
103
|
throw new Error(`unsupported channel type ${options.type}`);
|
|
@@ -109,16 +106,39 @@ export class QQBot extends Bot {
|
|
|
109
106
|
async $recallMessage(id) {
|
|
110
107
|
if (!/^(private|group|channel|direct)-([^\:]+):(.+)$/.test(id))
|
|
111
108
|
throw new Error(`invalid message id ${id}`);
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
109
|
+
const match = id.match(/^(private|group|channel|direct)-([^\:]+):(.+)$/);
|
|
110
|
+
if (!match)
|
|
111
|
+
return;
|
|
112
|
+
const [, target_type, target_id, message_id] = match;
|
|
113
|
+
if (target_type === "private")
|
|
114
114
|
await this.recallPrivateMessage(target_id, message_id);
|
|
115
|
-
if (target_type ===
|
|
115
|
+
if (target_type === "group")
|
|
116
116
|
await this.recallGroupMessage(target_id, message_id);
|
|
117
|
-
if (target_type ===
|
|
117
|
+
if (target_type === "channel")
|
|
118
118
|
await this.recallGuildMessage(target_id, message_id);
|
|
119
|
-
if (target_type ===
|
|
119
|
+
if (target_type === "direct")
|
|
120
120
|
await this.recallDirectMessage(target_id, message_id);
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
-
|
|
123
|
+
class QQAdapter extends Adapter {
|
|
124
|
+
constructor(plugin) {
|
|
125
|
+
super(plugin, "qq", []);
|
|
126
|
+
}
|
|
127
|
+
createBot(config) {
|
|
128
|
+
return new QQBot(this, config);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// 使用新的 provide() API 注册适配器
|
|
132
|
+
provide({
|
|
133
|
+
name: "qq",
|
|
134
|
+
description: "QQ Official Bot Adapter",
|
|
135
|
+
mounted: async (p) => {
|
|
136
|
+
const adapter = new QQAdapter(p);
|
|
137
|
+
await adapter.start();
|
|
138
|
+
return adapter;
|
|
139
|
+
},
|
|
140
|
+
dispose: async (adapter) => {
|
|
141
|
+
await adapter.stop();
|
|
142
|
+
},
|
|
143
|
+
});
|
|
124
144
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,GAKJ,MAAM,iBAAiB,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAEL,SAAS,EACT,OAAO,EAEP,OAAO,EAGP,OAAO,GACR,MAAM,SAAS,CAAC;AAejB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;AAcvC,MAAM,OAAO,KACX,SAAQ,GAAG;IASQ;IANnB,UAAU,GAAY,KAAK,CAAC;IAE5B,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,YAAmB,OAAkB,EAAE,MAAyB;QAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QACzE,KAAK,CAAC,MAAM,CAAC,CAAC;QAFG,YAAO,GAAP,OAAO,CAAW;QAGnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAEO,eAAe,CAAC,GAA4C;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtI,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,cAAc,CAAC,GAA4C;QACzD,IAAI,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,GAAG,CAAC,YAAY,KAAK,OAAO;YAAE,SAAS,GAAG,GAAG,CAAC,UAAW,CAAC;QAC9D,IAAI,GAAG,CAAC,YAAY,KAAK,OAAO;YAAE,SAAS,GAAG,GAAG,CAAC,QAAS,CAAC;QAC5D,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAS,GAAG,UAAU,GAAG,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/B,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE;YAC/B,QAAQ,EAAE,IAAa;YACvB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,OAAO,EAAE;gBACP,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE;gBAClC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE;aACvC;YACD,QAAQ,EAAE;gBACR,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,GAAG,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY;aAClE;YACD,QAAQ,EAAE,GAAG,CAAC,OAAO;YACrB,IAAI,EAAE,GAAG,CAAC,WAAW;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,OAAoB,EAAE,QAA0B,IAAI,EAAmB,EAAE;gBACtF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjD,IAAI,KAAK;oBAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC7G,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC;oBAC7B,GAAG,MAAM,CAAC,QAAQ;oBAClB,OAAO,EAAE,IAAI;oBACb,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;oBACtB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB;QACrC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBACjE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAChH,OAAO,UAAU,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC1E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAChH,OAAO,WAAW,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACjE,CAAC;YACH,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAChH,OAAO,SAAS,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC/D,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAChH,OAAO,WAAW,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjE,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,IAAI,CAAC,gDAAgD,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC5G,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;QACrD,IAAI,WAAW,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACtF,IAAI,WAAW,KAAK,OAAO;YAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClF,IAAI,WAAW,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpF,IAAI,WAAW,KAAK,QAAQ;YAAE,MAAM,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACtF,CAAC;CACF;AAED,MAAM,SAAU,SAAQ,OAA4B;IAClD,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,MAAiC;QACzC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;CACF;AAED,2BAA2B;AAC3B,OAAO,CAAC;IACN,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,yBAAyB;IACtC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnB,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/adapter-qq",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"description": "zhin adapter for qq",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -30,13 +30,8 @@
|
|
|
30
30
|
"typescript": "^5.3.0"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"zhin.js": "1.
|
|
34
|
-
"
|
|
35
|
-
},
|
|
36
|
-
"peerDependenciesMeta": {
|
|
37
|
-
"@zhin.js/types": {
|
|
38
|
-
"optional": true
|
|
39
|
-
}
|
|
33
|
+
"@zhin.js/logger": "0.1.2",
|
|
34
|
+
"zhin.js": "1.0.18"
|
|
40
35
|
},
|
|
41
36
|
"files": [
|
|
42
37
|
"lib",
|