onebots 0.4.26 → 0.4.28

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/README.md CHANGED
@@ -45,6 +45,7 @@ npm init -y
45
45
 
46
46
  ```shell
47
47
  npm install onebots icqq
48
+ npm install sqlite3 # 如果你需要使用 OneBot11 请自行安装该依赖
48
49
  ```
49
50
 
50
51
  ## 3. 执行如下命令生成配置文件
package/lib/adapter.d.ts CHANGED
@@ -22,7 +22,7 @@ export interface Adapter extends Adapter.Base {
22
22
  }
23
23
  export declare namespace Adapter {
24
24
  interface Base {
25
- toSegment<V extends OneBot.Version>(version: V, message: OneBot.MessageElement<V>[]): OneBot.Segment<V>[];
25
+ toSegment<V extends OneBot.Version, M = any>(version: V, message: M): OneBot.Segment<V>[];
26
26
  fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V>): OneBot.MessageElement<V>[];
27
27
  toCqcode<V extends OneBot.Version>(version: V, message: OneBot.MessageElement<V>[]): string;
28
28
  fromCqcode<V extends OneBot.Version>(version: V, message: string): OneBot.MessageElement<V>[];
@@ -13,7 +13,7 @@ export default class IcqqAdapter extends Adapter<'icqq'> {
13
13
  sendGroupMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, OneBot.MessageElement<V>[]]): Promise<OneBot.MessageRet<V>>;
14
14
  call<V extends OneBot.Version>(uin: string, version: V, method: string, args?: any[]): Promise<any>;
15
15
  fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): OneBot.MessageElement<V>[];
16
- toSegment<V extends OneBot.Version>(version: V, message: OneBot.MessageElement<V>[]): OneBot.Segment<V>[];
16
+ toSegment<V extends OneBot.Version, M = any>(version: V, message: M): OneBot.Segment<V>[];
17
17
  fromCqcode<V extends OneBot.Version>(version: V, message: string): OneBot.MessageElement<V>[];
18
18
  toCqcode<V extends OneBot.Version>(version: V, messageArr: OneBot.MessageElement<V>[]): string;
19
19
  getSelfInfo<V extends OneBot.Version>(uin: string, version: V): OneBot.SelfInfo<V>;
@@ -20,6 +20,21 @@ const icqq_1 = require("icqq");
20
20
  const process_1 = __importDefault(require("process"));
21
21
  const fs_1 = require("fs");
22
22
  const onebot_1 = require("../../onebot");
23
+ const processMessages = (list) => {
24
+ return list.map(item => {
25
+ const { type, data } = item;
26
+ if (type === 'node')
27
+ return {
28
+ type,
29
+ ...data,
30
+ message: processMessages(data.message || [])
31
+ };
32
+ return {
33
+ type,
34
+ ...data
35
+ };
36
+ });
37
+ };
23
38
  class IcqqAdapter extends adapter_1.Adapter {
24
39
  constructor(app, config) {
25
40
  super(app, 'icqq', config);
@@ -81,23 +96,11 @@ class IcqqAdapter extends adapter_1.Adapter {
81
96
  }
82
97
  sendPrivateMessage(uin, version, args) {
83
98
  const [user_id, message] = args;
84
- const result = this.oneBots.get(uin)?.internal.sendPrivateMsg(user_id, message.map(m => {
85
- return {
86
- type: m.type,
87
- ...(m.data || {})
88
- };
89
- }));
90
- return result;
99
+ return this.oneBots.get(uin)?.internal.sendPrivateMsg(user_id, processMessages(message));
91
100
  }
92
101
  sendGroupMessage(uin, version, args) {
93
102
  const [group_id, message] = args;
94
- const result = this.oneBots.get(uin)?.internal.sendGroupMsg(group_id, message.map(m => {
95
- return {
96
- type: m.type,
97
- ...(m.data || {})
98
- };
99
- }));
100
- return result;
103
+ return this.oneBots.get(uin)?.internal.sendGroupMsg(group_id, processMessages(message));
101
104
  }
102
105
  call(uin, version, method, args = []) {
103
106
  try {
@@ -120,14 +123,14 @@ class IcqqAdapter extends adapter_1.Adapter {
120
123
  };
121
124
  return {
122
125
  type: item.type,
123
- data: item
126
+ data: item.data
124
127
  };
125
128
  });
126
129
  }
127
130
  toSegment(version, message) {
128
131
  return [].concat(message).map(item => {
129
- if (!item || typeof item !== "object")
130
- return {
132
+ if (typeof item !== 'object')
133
+ item = {
131
134
  type: 'text',
132
135
  data: {
133
136
  text: item
@@ -6,6 +6,7 @@ class Bot extends qqBot_1.QQBot {
6
6
  constructor(oneBot, appId, config) {
7
7
  super({
8
8
  appid: appId,
9
+ logLevel: oneBot.app.config.log_level,
9
10
  ...config
10
11
  });
11
12
  this.oneBot = oneBot;
@@ -87,6 +87,9 @@ export interface MessageElemMap {
87
87
  res_id?: string;
88
88
  data: string | Record<string, any>;
89
89
  };
90
+ node: {
91
+ message: Sendable;
92
+ };
90
93
  markdown: {
91
94
  content: string;
92
95
  };
@@ -105,7 +108,8 @@ export interface MessageElemMap {
105
108
  export type MessageElemType = keyof MessageElemMap;
106
109
  export type MessageElem<T extends MessageElemType = MessageElemType> = {
107
110
  type: T;
108
- } & MessageElemMap[T];
111
+ data: MessageElemMap[T];
112
+ };
109
113
  export type TextElem = MessageElem<"text">;
110
114
  export type AtElem = MessageElem<"at">;
111
115
  export type FaceElem = MessageElem<"face">;
@@ -116,10 +120,11 @@ export type LinkElem = MessageElem<'link'>;
116
120
  export type XmlElem = MessageElem<"xml">;
117
121
  export type JsonElem = MessageElem<"json">;
118
122
  export type MDElem = MessageElem<'markdown'>;
123
+ export type NodeElem = MessageElem<"node">;
119
124
  export type MusicElem = MessageElem<"music">;
120
125
  export type ButtonElem = MessageElem<'button'>;
121
126
  export type ReplyElem = MessageElem<"reply">;
122
127
  type RepeatableCombineElem = TextElem | FaceElem | ImageElem | AtElem | ButtonElem;
123
128
  type WithReply<T extends MessageElem> = T | [T] | [ReplyElem, T] | [ReplyElem, ...RepeatableCombineElem[]];
124
- export type Sendable = string | RepeatableCombineElem | (RepeatableCombineElem | string)[] | WithReply<MDElem | LinkElem | VideoElem | AudioElem | XmlElem | MusicElem | JsonElem>;
129
+ export type Sendable = string | RepeatableCombineElem | (RepeatableCombineElem | string)[] | WithReply<MDElem | NodeElem | LinkElem | VideoElem | AudioElem | XmlElem | MusicElem | JsonElem>;
125
130
  export {};
@@ -1,13 +1,15 @@
1
1
  import { Adapter } from "../../adapter";
2
2
  import { App } from "../../server/app";
3
3
  import { OneBot } from "../../onebot";
4
+ import { QQBot } from "../../adapters/qq/qqBot";
5
+ import { Sendable } from "../../adapters/qq/elements";
4
6
  export default class QQAdapter extends Adapter<'qq'> {
5
7
  #private;
6
8
  constructor(app: App, config: QQAdapter.Config);
7
9
  startOneBot(oneBot: OneBot): Promise<() => void>;
8
10
  call(uin: string, version: string, method: string, args?: any[]): Promise<any>;
9
11
  fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): OneBot.MessageElement<V>[];
10
- toSegment<V extends OneBot.Version>(version: V, message: OneBot.MessageElement<V>[]): OneBot.Segment<V>[];
12
+ toSegment<V extends OneBot.Version, M = Sendable>(version: V, message: M): OneBot.Segment<V>[];
11
13
  fromCqcode<V extends OneBot.Version>(version: V, message: string): OneBot.MessageElement<V>[];
12
14
  toCqcode<V extends OneBot.Version>(version: V, messageArr: OneBot.MessageElement<V>[]): string;
13
15
  formatEventPayload<V extends OneBot.Version>(version: V, event: string, data: any): OneBot.Payload<V>;
@@ -24,12 +26,6 @@ declare module '../../adapter' {
24
26
  }
25
27
  export declare namespace QQAdapter {
26
28
  interface Config extends Adapter.Config<'qq'> {
27
- protocol: {
28
- secret: string;
29
- token: string;
30
- sandbox?: boolean;
31
- maxRetry?: number;
32
- intents?: string[];
33
- };
29
+ protocol: Omit<QQBot.Config, 'appid'>;
34
30
  }
35
31
  }
@@ -106,7 +106,7 @@ class QQAdapter extends adapter_1.Adapter {
106
106
  }
107
107
  toCqcode(version, messageArr) {
108
108
  return [].concat(messageArr).map(item => {
109
- const dataStr = Object.entries(item).filter(([key]) => key !== 'type').map(([key, value]) => {
109
+ const dataStr = Object.entries(item.data).map(([key, value]) => {
110
110
  // is Buffer
111
111
  if (value instanceof Buffer)
112
112
  return `${key}=${value.toString('base64')}`;
@@ -47,7 +47,7 @@ export declare class GroupMessageEvent extends Message implements MessageEvent {
47
47
  }
48
48
  export declare class DirectMessageEvent extends Message implements MessageEvent {
49
49
  user_id: string;
50
- channel_id: string;
50
+ guild_id: string;
51
51
  constructor(bot: Bot, payload: Partial<Message>);
52
52
  reply(message: Sendable): Promise<{
53
53
  message_id: string;
@@ -72,7 +72,7 @@ export declare namespace Message {
72
72
  user_id: string;
73
73
  user_name: string;
74
74
  }
75
- type SubType = 'private' | 'group' | 'guild' | 'direct';
75
+ type SubType = "private" | "group" | "guild" | "direct";
76
76
  function parse(this: QQBot, payload: Dict): (string | MessageElem[])[];
77
77
  function format(this: QQBot, message: Sendable, source?: Quotable): Promise<{
78
78
  messages: Dict;
@@ -29,7 +29,7 @@ exports.Message = Message;
29
29
  class PrivateMessageEvent extends Message {
30
30
  constructor(bot, payload) {
31
31
  super(bot, payload);
32
- this.sub_type = 'private';
32
+ this.sub_type = "private";
33
33
  }
34
34
  async reply(message) {
35
35
  return this.bot.sendPrivateMessage(this.user_id, message, this);
@@ -39,7 +39,7 @@ exports.PrivateMessageEvent = PrivateMessageEvent;
39
39
  class GroupMessageEvent extends Message {
40
40
  constructor(bot, payload) {
41
41
  super(bot, payload);
42
- this.sub_type = 'group';
42
+ this.sub_type = "group";
43
43
  }
44
44
  async reply(message) {
45
45
  return this.bot.sendGroupMessage(this.group_id, message, this);
@@ -49,7 +49,7 @@ exports.GroupMessageEvent = GroupMessageEvent;
49
49
  class DirectMessageEvent extends Message {
50
50
  constructor(bot, payload) {
51
51
  super(bot, payload);
52
- this.sub_type = 'direct';
52
+ this.sub_type = "direct";
53
53
  }
54
54
  reply(message) {
55
55
  return this.bot.sendDirectMessage(this.guild_id, message, this);
@@ -59,7 +59,7 @@ exports.DirectMessageEvent = DirectMessageEvent;
59
59
  class GuildMessageEvent extends Message {
60
60
  constructor(bot, payload) {
61
61
  super(bot, payload);
62
- this.sub_type = 'guild';
62
+ this.sub_type = "guild";
63
63
  }
64
64
  async asAnnounce() {
65
65
  return this.bot.setChannelAnnounce(this.guild_id, this.channel_id, this.message_id);
@@ -74,9 +74,9 @@ class GuildMessageEvent extends Message {
74
74
  exports.GuildMessageEvent = GuildMessageEvent;
75
75
  (function (Message) {
76
76
  function parse(payload) {
77
- let template = payload.content || '';
77
+ let template = payload.content || "";
78
78
  let result = [];
79
- let brief = '';
79
+ let brief = "";
80
80
  // 1. 处理文字表情混排
81
81
  const regex = /("[^"]*?"|'[^']*?'|`[^`]*?`|“[^”]*?”|‘[^’]*?’|<[^>]+?>)/;
82
82
  while (template.length) {
@@ -87,48 +87,61 @@ exports.GuildMessageEvent = GuildMessageEvent;
87
87
  const prevText = template.slice(0, index);
88
88
  if (prevText) {
89
89
  result.push({
90
- type: 'text',
91
- text: prevText
90
+ type: "text",
91
+ data: {
92
+ text: prevText
93
+ }
92
94
  });
93
95
  brief += prevText;
94
96
  }
95
97
  template = template.slice(index + match.length);
96
- if (match.startsWith('<')) {
97
- let [type, ...attrs] = match.slice(1, -1).split(',');
98
- if (type.startsWith('faceType')) {
99
- type = 'face';
100
- attrs = attrs.map((attr) => attr.replace('faceId', 'id'));
98
+ if (match.startsWith("<")) {
99
+ let [type, ...attrs] = match.slice(1, -1).split(",");
100
+ if (type.startsWith("faceType")) {
101
+ type = "face";
102
+ attrs = attrs.map((attr) => attr.replace("faceId", "id"));
101
103
  }
102
- else if (type.startsWith('@')) {
103
- if (type.startsWith('@!')) {
104
+ else if (type.startsWith("@")) {
105
+ if (type.startsWith("@!")) {
104
106
  const id = type.slice(2);
105
- type = 'at';
107
+ type = "at";
106
108
  attrs = Object.entries(payload.mentions.find((u) => u.id === id) || {})
107
109
  .map(([key, value]) => `${key}=${value}`);
108
110
  }
109
- else if (type === '@everyone') {
110
- type = 'at';
111
- attrs = [['all', true]];
111
+ else if (type === "@everyone") {
112
+ type = "at";
113
+ attrs = [["all", true]];
112
114
  }
113
115
  }
114
116
  else if (/^[a-z]+:[0-9]+$/.test(type)) {
115
- attrs = [['id', type.split(':')[1]]];
116
- type = 'face';
117
+ attrs = [["id", type.split(":")[1]]];
118
+ type = "face";
117
119
  }
118
120
  result.push({
119
121
  type,
120
- ...Object.fromEntries(attrs.map((attr) => {
121
- const [key, ...values] = attr.split('=');
122
- return [key.toLowerCase(), (0, utils_1.trimQuote)(values.join('='))];
122
+ data: Object.fromEntries(attrs.map((attr) => {
123
+ const [key, ...values] = attr.split("=");
124
+ return [key.toLowerCase(), (0, utils_1.trimQuote)(values.join("="))];
123
125
  }))
124
126
  });
125
- brief += `<${type}:${attrs.join(',')}>`;
127
+ brief += `<${type}:${attrs.join(",")}>`;
128
+ }
129
+ else {
130
+ result.push({
131
+ type: "text",
132
+ data: {
133
+ text: match
134
+ }
135
+ });
136
+ brief += match;
126
137
  }
127
138
  }
128
139
  if (template) {
129
140
  result.push({
130
- type: 'text',
131
- text: template
141
+ type: "text",
142
+ data: {
143
+ text: template
144
+ }
132
145
  });
133
146
  brief += template;
134
147
  }
@@ -136,14 +149,14 @@ exports.GuildMessageEvent = GuildMessageEvent;
136
149
  if (payload.attachments) {
137
150
  for (const attachment of payload.attachments) {
138
151
  let { content_type, ...data } = attachment;
139
- const [type] = content_type.split('/');
152
+ const [type] = content_type.split("/");
140
153
  result.push({
141
154
  type,
142
155
  ...data,
143
156
  src: data.src || data.url,
144
157
  url: data.url || data.src
145
158
  });
146
- brief += `<$${type},${Object.entries(data).map(([key, value]) => `${key}=${value}`).join(',')}>`;
159
+ brief += `<$${type},${Object.entries(data).map(([key, value]) => `${key}=${value}`).join(",")}>`;
147
160
  }
148
161
  }
149
162
  delete payload.attachments;
@@ -153,12 +166,12 @@ exports.GuildMessageEvent = GuildMessageEvent;
153
166
  Message.parse = parse;
154
167
  async function format(message, source = {}) {
155
168
  const getType = (type) => {
156
- return ['image', 'video', 'audio'].indexOf(type) + 1;
169
+ return ["image", "video", "audio"].indexOf(type) + 1;
157
170
  };
158
- let brief = '';
171
+ let brief = "";
159
172
  const messages = {
160
173
  msg_type: 0,
161
- content: '',
174
+ content: "",
162
175
  msg_id: source?.message_id,
163
176
  msg_seq: (0, crypto_1.randomInt)(1, 1000000),
164
177
  timestamp: Number((Date.now() / 1000).toFixed(0))
@@ -172,74 +185,83 @@ exports.GuildMessageEvent = GuildMessageEvent;
172
185
  if (!Array.isArray(message))
173
186
  message = [message];
174
187
  for (let elem of message) {
175
- if (typeof elem === 'string') {
176
- elem = { type: 'text', text: elem };
188
+ if (typeof elem === "string") {
189
+ elem = { type: "text", data: { text: elem } };
177
190
  }
178
191
  switch (elem.type) {
179
- case 'reply':
180
- messages.msg_id = elem.message_id;
181
- files.msg_id = elem.message_id;
182
- brief += `<$reply,message_id=${elem.message_id}>`;
192
+ case "reply":
193
+ messages.msg_id = elem.data.message_id;
194
+ files.msg_id = elem.data.message_id;
195
+ brief += `<$reply,message_id=${elem.data.message_id}>`;
183
196
  break;
184
197
  case "at":
185
198
  if (messages.content) {
186
- messages.content += `<@${elem.id || 'everyone'}>`;
199
+ messages.content += `<@${elem.data.id || "everyone"}>`;
187
200
  }
188
201
  else {
189
- messages.content = `<@${elem.id || 'everyone'}>`;
202
+ messages.content = `<@${elem.data.id || "everyone"}>`;
190
203
  }
191
- brief += `<$at,user=${elem.id || 'everyone'}>`;
204
+ brief += `<$at,user=${elem.data.id || "everyone"}>`;
192
205
  break;
193
- case 'link':
206
+ case "link":
194
207
  if (messages.content) {
195
- messages.content += `<#${elem.channel_id}>`;
208
+ messages.content += `<#${elem.data.channel_id}>`;
196
209
  }
197
210
  else {
198
- messages.content = `<#${elem.channel_id}>`;
211
+ messages.content = `<#${elem.data.channel_id}>`;
199
212
  }
200
- brief += `<$link,channel=${elem.channel_id}>`;
213
+ brief += `<$link,channel=${elem.data.channel_id}>`;
201
214
  break;
202
- case 'text':
215
+ case "text":
203
216
  if (messages.content) {
204
- messages.content += elem.text;
217
+ messages.content += elem.data.text;
205
218
  }
206
219
  else {
207
- messages.content = elem.text;
220
+ messages.content = elem.data.text;
208
221
  }
209
222
  hasMessages = true;
210
- brief += elem.text;
223
+ brief += elem.data.text;
211
224
  break;
212
- case 'face':
225
+ case "face":
213
226
  if (messages.content) {
214
- messages.content += `<emoji:${elem.id}>`;
227
+ messages.content += `<emoji:${elem.data.id}>`;
215
228
  }
216
229
  else {
217
- messages.content = `<emoji:${elem.id}>`;
230
+ messages.content = `<emoji:${elem.data.id}>`;
218
231
  }
219
- brief += `<$face,id=${elem.id}>`;
232
+ brief += `<$face,id=${elem.data.id}>`;
220
233
  hasMessages = true;
221
234
  break;
222
- case 'image':
223
- case 'audio':
224
- case 'video':
235
+ case "node":
236
+ const { messages: m, hasFiles: hf, hasMessages: hm, brief: b, files: f } = await format.call(this, elem.data.message);
237
+ messages.content += m.content;
238
+ messages.msg_id = messages.msg_id || m.msg_id;
239
+ hasMessages = hasMessages || hm;
240
+ hasFiles = hasFiles || hf;
241
+ brief += b;
242
+ Object.assign(files, f);
243
+ break;
244
+ case "image":
245
+ case "audio":
246
+ case "video":
225
247
  files.file_type = getType(elem.type);
226
- files.content = 'file';
227
- files.url = elem.file;
248
+ files.content = "file";
249
+ files.url = elem.data.file;
228
250
  files.event_id = source.event_id;
229
251
  files.msg_id = source?.message_id;
230
252
  files.srv_send_msg = true;
231
253
  hasFiles = true;
232
- brief += `<${elem.type},file=${elem.file}>`;
254
+ brief += `<${elem.type},file=${elem.data.file}>`;
233
255
  break;
234
- case 'markdown':
256
+ case "markdown":
235
257
  messages.markdown = {
236
- content: elem.content
258
+ content: elem.data.content
237
259
  };
238
260
  messages.msg_type = 2;
239
261
  hasMessages = true;
240
- brief += `<#markdown,content=${elem.content}>`;
262
+ brief += `<#markdown,content=${elem.data.content}>`;
241
263
  break;
242
- case 'button':
264
+ case "button":
243
265
  buttons.push(elem.data);
244
266
  brief += `<$button,data=${JSON.stringify(elem.data)}>`;
245
267
  break;
@@ -21,7 +21,7 @@ export declare class QQBot extends EventEmitter {
21
21
  sessionManager: SessionManager;
22
22
  constructor(config: QQBot.Config);
23
23
  removeAt(payload: Dict): void;
24
- processPayload(event_id: string, event: string, payload: Dict): GroupMessageEvent | PrivateMessageEvent | GuildMessageEvent | DirectMessageEvent | Dict;
24
+ processPayload(event_id: string, event: string, payload: Dict): Dict | PrivateMessageEvent | GroupMessageEvent | DirectMessageEvent | GuildMessageEvent;
25
25
  getSelfInfo(): Promise<any>;
26
26
  getChannelPermissionOfRole(channel_id: string, role_id: string): Promise<any>;
27
27
  setChannelAnnounce(guild_id: string, channel_id: string, message_id: string): Promise<any>;
@@ -252,14 +252,16 @@ class QQBot extends events_1.EventEmitter {
252
252
  if (!res.data?.length)
253
253
  return [];
254
254
  const result = (res.data || []).map(g => {
255
- const { joined_at, ...guild } = g;
255
+ const { id: guild_id, name: guild_name, joined_at, ...guild } = g;
256
256
  return {
257
+ guild_id,
258
+ guild_name,
257
259
  join_time: new Date(joined_at).getTime() / 1000,
258
260
  ...guild
259
261
  };
260
262
  });
261
263
  const last = result[result.length - 1];
262
- return [...result, ...await _getGuildList(last.id)];
264
+ return [...result, ...await _getGuildList(last.guild_id)];
263
265
  };
264
266
  return await _getGuildList();
265
267
  }
@@ -274,16 +276,17 @@ class QQBot extends events_1.EventEmitter {
274
276
  if (!res.data?.length)
275
277
  return [];
276
278
  const result = (res.data || []).map(m => {
277
- const { id: member_id, role, join_time, ...member } = m;
279
+ const { id: member_id, name: member_name, role, join_time, ...member } = m;
278
280
  return {
279
281
  member_id,
282
+ member_name,
280
283
  role,
281
284
  join_time: new Date(join_time).getTime() / 1000,
282
285
  ...member
283
286
  };
284
287
  });
285
288
  const last = result[result.length - 1];
286
- return [...result, ...await _getGuildMemberList(last.user?.id)];
289
+ return [...result, ...await _getGuildMemberList(last.member_id)];
287
290
  };
288
291
  return await _getGuildMemberList();
289
292
  }
@@ -309,7 +312,13 @@ class QQBot extends events_1.EventEmitter {
309
312
  }
310
313
  async getChannelList(guild_id) {
311
314
  const { data: result = [] } = await this.request.get(`/guilds/${guild_id}/channels`);
312
- return result;
315
+ return result.map(({ id: channel_id, name: channel_name, ...channel }) => {
316
+ return {
317
+ channel_id,
318
+ channel_name,
319
+ ...channel
320
+ };
321
+ });
313
322
  }
314
323
  async sendPrivateMessage(user_id, message, source) {
315
324
  const { hasMessages, messages, brief, hasFiles, files } = await message_1.Message.format.call(this, message, source);
@@ -381,7 +390,6 @@ class QQBot extends events_1.EventEmitter {
381
390
  let message_id = '';
382
391
  if (hasMessages) {
383
392
  const { data: result } = await this.request.post(`/v2/groups/${group_id}/messages`, messages);
384
- console.log(result);
385
393
  message_id = result.seq;
386
394
  }
387
395
  if (hasFiles) {
@@ -167,11 +167,9 @@ class SessionManager extends events_1.EventEmitter {
167
167
  this.sendWs(authOp);
168
168
  }
169
169
  startListen() {
170
- this.bot.ws.on("open", () => {
171
- this.bot.logger.info("[CLIENT] 连接成功");
172
- });
173
170
  this.bot.ws.on("close", (code) => {
174
- this.bot.logger.error(`[CLIENT] 连接关闭:${code}`);
171
+ this.alive = false;
172
+ this.bot.logger.mark(`[CLIENT] 连接关闭:${code}`);
175
173
  this.emit(constans_1.SessionEvents.EVENT_WS, {
176
174
  eventType: constans_1.SessionEvents.DISCONNECT,
177
175
  code,
@@ -186,7 +184,8 @@ class SessionManager extends events_1.EventEmitter {
186
184
  }
187
185
  });
188
186
  this.bot.ws.on("error", (e) => {
189
- this.bot.logger.error("[CLIENT] 连接错误");
187
+ this.alive = false;
188
+ this.bot.logger.mark("[CLIENT] 连接错误");
190
189
  this.emit(constans_1.SessionEvents.CLOSED, { eventType: constans_1.SessionEvents.CLOSED });
191
190
  });
192
191
  this.bot.ws.on("message", (data) => {
@@ -203,7 +202,7 @@ class SessionManager extends events_1.EventEmitter {
203
202
  }
204
203
  // 鉴权通过
205
204
  if (wsRes.t === constans_1.SessionEvents.READY) {
206
- this.bot.logger.info(`[CLIENT] 鉴权通过`);
205
+ this.bot.logger.mark(`[CLIENT] 鉴权通过`);
207
206
  const { d, s } = wsRes;
208
207
  const { session_id, user = {} } = d;
209
208
  this.bot.self_id = user.id;
@@ -1,28 +1,29 @@
1
1
  import { V12 } from "../../../service/V12";
2
- import { ApiBaseInfo, UpdatePermissionParams } from "../../../adapters/qq/types";
3
- import { Channel } from "../../../adapters/qq/entries/channel";
4
- import { Guild } from "../../../adapters/qq/entries/guild";
2
+ import { Dict } from "@zhinjs/shared";
5
3
  export declare class GuildAction {
6
4
  getGuildSelfInfo(this: V12): Promise<any>;
7
5
  getChannelPermissionOfRole(this: V12, channel_id: string, role_id: string): Promise<any>;
8
6
  setChannelAnnounce(this: V12, guild_id: string, channel_id: string, message_id: string): Promise<any>;
9
- updateChannelPermissionOfRole(this: V12, channel_id: string, role_id: string, permission: UpdatePermissionParams): Promise<any>;
7
+ updateChannelPermissionOfRole(this: V12, channel_id: string, role_id: string, permission: Dict): Promise<any>;
10
8
  getChannelMemberPermission(this: V12, channel_id: string, member_id: string): Promise<any>;
11
- updateChannelMemberPermission(this: V12, channel_id: string, member_id: string, permission: UpdatePermissionParams): Promise<any>;
9
+ updateChannelMemberPermission(this: V12, channel_id: string, member_id: string, permission: Dict): Promise<any>;
12
10
  getChannelPins(this: V12, channel_id: string): Promise<string[]>;
13
11
  pinChannelMessage(this: V12, channel_id: string, message_id: string): Promise<any>;
14
12
  unPinChannelMessage(this: V12, channel_id: string, message_id: string): Promise<any>;
15
- createChannel(this: V12, guild_id: string, channelInfo: Omit<Channel.Info, 'id'>): Promise<Channel.Info>;
13
+ createChannel(this: V12, guild_id: string, channelInfo: Dict): Promise<any>;
16
14
  updateChannel(this: V12, { channel_id, ...updateInfo }: {
17
15
  channel_id: string;
18
- } & Partial<Pick<Channel.Info, 'name' | 'position' | 'parent_id' | 'private_type' | 'speak_permission'>>): Promise<Channel.Info>;
16
+ } & Dict): Promise<any>;
19
17
  deleteChannel(this: V12, channel_id: string): Promise<any>;
20
18
  getGuildRoles(this: V12, guild_id: string): Promise<any>;
21
- creatGuildRole(this: V12, guild_id: string, role: Pick<Guild.Role, 'name' | 'color' | 'hoist'>): Promise<Guild.Role>;
22
- updateGuildRole(this: V12, guild_id: string, { id, ...role }: Pick<Guild.Role, 'id' | 'name' | 'color' | 'hoist'>): Promise<any>;
19
+ creatGuildRole(this: V12, guild_id: string, role: Dict): Promise<any>;
20
+ updateGuildRole(this: V12, guild_id: string, { id, ...role }: {
21
+ [x: string]: any;
22
+ id: any;
23
+ }): Promise<any>;
23
24
  deleteGuildRole(this: V12, role_id: string): Promise<any>;
24
25
  getGuildAccessApis(this: V12, guild_id: string): Promise<any>;
25
- applyGuildAccess(this: V12, guild_id: string, channel_id: string, apiInfo: ApiBaseInfo, desc?: string): Promise<any>;
26
+ applyGuildAccess(this: V12, guild_id: string, channel_id: string, apiInfo: Dict, desc?: string): Promise<any>;
26
27
  unMuteGuild(this: V12, guild_id: string): Promise<any>;
27
28
  muteGuild(this: V12, guild_id: string, seconds: number, end_time?: number): Promise<any>;
28
29
  unMuteGuildMembers(this: V12, guild_id: string, member_ids: string[]): Promise<any>;
@@ -39,10 +40,11 @@ export declare class GuildAction {
39
40
  getGuildMemberList(this: V12, guild_id: string): Promise<any>;
40
41
  /**
41
42
  * 发送频道消息
43
+ * @param guild_id {string} 频道id
42
44
  * @param channel_id {string} 子频道id
43
45
  * @param message {import('icqq/lib/service').Sendable} 消息
44
46
  */
45
- sendGuildMsg(this: V12, channel_id: string, message: V12.Sendable): Promise<any>;
47
+ sendGuildMsg(this: V12, guild_id: string, channel_id: string, message: V12.Sendable): Promise<any>;
46
48
  createDirectSession(this: V12, guild_id: string, user_id: string): Promise<any>;
47
49
  sendDirectMsg(this: V12, guild_id: string, message: V12.Sendable): Promise<any>;
48
50
  }
@@ -100,10 +100,14 @@ class GuildAction {
100
100
  }
101
101
  /**
102
102
  * 发送频道消息
103
+ * @param guild_id {string} 频道id
103
104
  * @param channel_id {string} 子频道id
104
105
  * @param message {import('icqq/lib/service').Sendable} 消息
105
106
  */
106
- async sendGuildMsg(channel_id, message) {
107
+ async sendGuildMsg(guild_id, channel_id, message) {
108
+ if (channel_id === 'direct') {
109
+ return this.adapter.call(this.oneBot.uin, 'V12', 'sendDirectMessage', [guild_id, message]);
110
+ }
107
111
  return this.adapter.call(this.oneBot.uin, 'V12', 'sendGuildMessage', [channel_id, message]);
108
112
  }
109
113
  async createDirectSession(guild_id, user_id) {
@@ -408,14 +408,14 @@ class V12 extends service_1.Service {
408
408
  if (/[CQ:music,type=.+,id=.+]/.test(params[k])) {
409
409
  params[k] = params[k].replace(',type=', ',platform=');
410
410
  }
411
- params[k] = this.adapter.fromCqcode('V11', params[k]);
411
+ params[k] = this.adapter.fromCqcode('V12', params[k]);
412
412
  }
413
413
  else {
414
414
  if (params[k][0].type == 'music' && params[k][0]?.data?.type) {
415
415
  params[k][0].data.platform = params[k][0].data.type;
416
416
  delete params[k][0].data.type;
417
417
  }
418
- params[k] = this.adapter.fromSegment('V11', params[k]);
418
+ params[k] = this.adapter.fromSegment('V12', params[k]);
419
419
  }
420
420
  }
421
421
  args.push(params[k]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onebots",
3
- "version": "0.4.26",
3
+ "version": "0.4.28",
4
4
  "description": "基于icqq的多例oneBot实现",
5
5
  "engines": {
6
6
  "node": ">=16"
@@ -56,7 +56,8 @@
56
56
  "/**/LICENSE"
57
57
  ],
58
58
  "peerDependencies": {
59
- "icqq": "latest"
59
+ "icqq": "latest",
60
+ "sqlite3": "^5.1.6"
60
61
  },
61
62
  "dependencies": {
62
63
  "@koa/router": "^10.1.1",
@@ -69,7 +70,6 @@
69
70
  "mime-types": "^2.1.35",
70
71
  "reflect-metadata": "^0.1.13",
71
72
  "seed-random": "^2.2.0",
72
- "sqlite3": "^5.1.6",
73
73
  "typeorm": "^0.3.17",
74
74
  "ws": "^8.8.0"
75
75
  }