onebots 0.4.62 → 0.4.64

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/lib/adapter.d.ts CHANGED
@@ -46,7 +46,7 @@ export interface Adapter<T extends string = string, Sendable = any> extends Adap
46
46
  export declare namespace Adapter {
47
47
  interface Base<Sendable = any> {
48
48
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
49
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V>[]): Sendable;
49
+ fromSegment<V extends OneBot.Version>(onebot: OneBot, version: V, segment: OneBot.Segment<V>[]): Sendable;
50
50
  getSelfInfo<V extends OneBot.Version>(uin: string, version: V): OneBot.SelfInfo<V>;
51
51
  /** 格式化事件 */
52
52
  formatEventPayload<V extends OneBot.Version>(uin: string, version: V, event: string, payload: Dict): OneBot.Payload<V>;
@@ -17,7 +17,7 @@ export default class DingtalkAdapter extends Adapter<"dingtalk", Sendable> {
17
17
  sendPrivateMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
18
18
  sendGroupMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
19
19
  deleteMessage(uin: string, message_id: string): Promise<boolean>;
20
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
20
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Bot>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
21
21
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
22
22
  fromCqcode<V extends OneBot.Version>(version: V, message: string): OneBot.Segment<V>[];
23
23
  formatEventPayload<V extends OneBot.Version>(uin: string, version: V, event: string, data: any): OneBot.Payload<V>;
@@ -139,8 +139,15 @@ class DingtalkAdapter extends adapter_1.Adapter {
139
139
  throw new Error(`暂不支持撤回${from_type}类型的消息`);
140
140
  }
141
141
  }
142
- fromSegment(version, segment) {
143
- return [].concat(segment).map(item => {
142
+ fromSegment(onebot, version, segment) {
143
+ return []
144
+ .concat(segment)
145
+ .map(segment => {
146
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
147
+ return onebot.V12.transformMedia(segment);
148
+ return segment;
149
+ })
150
+ .map(item => {
144
151
  if (typeof item === "string")
145
152
  return item;
146
153
  const { type, data } = item;
@@ -204,6 +211,10 @@ class DingtalkAdapter extends adapter_1.Adapter {
204
211
  platform: "dingtalk",
205
212
  time: data.timestamp,
206
213
  ...data,
214
+ sender: {
215
+ ...(data?.sender || {}),
216
+ },
217
+ user_id: data.user_id || data.sender?.user_id,
207
218
  message_id: `${data.message_type}:${data.group_id || data.user_id}:${data.message_id}`,
208
219
  };
209
220
  delete result.bot;
@@ -1,6 +1,6 @@
1
1
  import { Adapter } from "../../adapter";
2
2
  import { App } from "../../server/app";
3
- import { Config as IcqqConfig, Sendable } from "@icqqjs/icqq";
3
+ import { Client, Config as IcqqConfig, Sendable } from "@icqqjs/icqq";
4
4
  import { OneBot } from "../../onebot";
5
5
  export default class IcqqAdapter extends Adapter<"icqq", Sendable> {
6
6
  #private;
@@ -16,7 +16,7 @@ export default class IcqqAdapter extends Adapter<"icqq", Sendable> {
16
16
  sendGuildMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string?]): Promise<OneBot.MessageRet<V>>;
17
17
  getMessage<V extends OneBot.Version>(uin: string, version: V, [message_id]: [string]): Promise<OneBot.Message<V>>;
18
18
  call<V extends OneBot.Version>(uin: string, version: V, method: string, args?: any[]): Promise<any>;
19
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
19
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Client>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
20
20
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
21
21
  getSelfInfo<V extends OneBot.Version>(uin: string, version: V): OneBot.SelfInfo<V>;
22
22
  startOneBot(oneBot: OneBot): Promise<Function>;
@@ -45,72 +45,8 @@ const process_1 = __importDefault(require("process"));
45
45
  const fs_1 = require("fs");
46
46
  const onebot_1 = require("../../onebot");
47
47
  const path = __importStar(require("path"));
48
- const shareMusicCustom_1 = require("../../service/shareMusicCustom");
49
48
  const message_1 = require("@icqqjs/icqq/lib/message");
50
- async function processMessages(uin, target_id, target_type, list) {
51
- let result = [];
52
- for (const item of list) {
53
- const { type, data, ...other } = item;
54
- switch (type) {
55
- case "node": {
56
- result.push({
57
- type,
58
- ...data,
59
- user_id: data.user_id,
60
- message: await processMessages.call(this, uin, data.user_id, "private", data.content || []),
61
- });
62
- break;
63
- }
64
- case "music": {
65
- if (String(item.data.platform) === "custom") {
66
- item.data.platform = item.data["subtype"]; // gocq 的平台数据存储在 subtype 内,兼容 icqq 时要求前端必须发送 id 字段
67
- }
68
- const { type, data } = item;
69
- await shareMusicCustom_1.shareMusic.call(this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id), {
70
- type,
71
- ...data,
72
- });
73
- break;
74
- }
75
- case "share": {
76
- await this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id).shareUrl(item.data);
77
- break;
78
- }
79
- case "video":
80
- case "audio":
81
- case "image": {
82
- if (item["file_id"]?.startsWith("base64://"))
83
- item["file_id"] = Buffer.from(item["file_id"].slice(9), "base64");
84
- if (item["file"]?.startsWith("base64://"))
85
- item["file"] = Buffer.from(item["file"].slice(9), "base64");
86
- result.push({
87
- type: type,
88
- ...data,
89
- ...other,
90
- });
91
- break;
92
- }
93
- case "reply": {
94
- const oneBot = this.getOneBot(uin);
95
- const message_id = oneBot.V11.getStrByInt("message_id", data.id);
96
- const msg = await oneBot.internal.getMsg(message_id);
97
- result.push({
98
- type: "quote",
99
- ...msg,
100
- });
101
- break;
102
- }
103
- default: {
104
- result.push({
105
- type: type,
106
- ...data,
107
- ...other,
108
- });
109
- }
110
- }
111
- }
112
- return result;
113
- }
49
+ const utils_1 = require("../../adapters/icqq/utils");
114
50
  class IcqqAdapter extends adapter_1.Adapter {
115
51
  constructor(app, config) {
116
52
  super(app, "icqq", config);
@@ -166,6 +102,10 @@ class IcqqAdapter extends adapter_1.Adapter {
166
102
  detail_type: data.message_type || data.notice_type || data.request_type,
167
103
  platform: "qq",
168
104
  ...data,
105
+ sender: {
106
+ ...(data?.sender || {}),
107
+ },
108
+ user_id: data.user_id || data.sender?.user_id,
169
109
  };
170
110
  if (data.source) {
171
111
  const message_id = data.message_type === "group"
@@ -199,7 +139,7 @@ class IcqqAdapter extends adapter_1.Adapter {
199
139
  let quote;
200
140
  if (source)
201
141
  quote = await client.getMsg(source);
202
- const result = await client.sendPrivateMsg(parseInt(user_id), await processMessages.call(this, uin, user_id, "private", message), quote);
142
+ const result = await client.sendPrivateMsg(parseInt(user_id), await utils_1.processMessages.call(this, uin, user_id, "private", message), quote);
203
143
  return {
204
144
  message_id: version === "V11"
205
145
  ? this.oneBots.get(uin).V11.transformToInt("message_id", result.message_id)
@@ -216,7 +156,7 @@ class IcqqAdapter extends adapter_1.Adapter {
216
156
  let quote;
217
157
  if (source)
218
158
  quote = await client.getMsg(source);
219
- const result = await client.sendGroupMsg(parseInt(group_id), await processMessages.call(this, uin, group_id, "group", message), quote);
159
+ const result = await client.sendGroupMsg(parseInt(group_id), await utils_1.processMessages.call(this, uin, group_id, "group", message), quote);
220
160
  return {
221
161
  message_id: version === "V11"
222
162
  ? this.oneBots.get(uin).V11.transformToInt("message_id", result.message_id)
@@ -227,7 +167,7 @@ class IcqqAdapter extends adapter_1.Adapter {
227
167
  const [target_id, message, source] = args;
228
168
  const client = this.oneBots.get(uin)?.internal;
229
169
  const [guild_id, channel_id] = target_id.split(":");
230
- const result = await client.sendGuildMsg(guild_id, channel_id, await processMessages.call(this, uin, target_id, "channel", message));
170
+ const result = await client.sendGuildMsg(guild_id, channel_id, await utils_1.processMessages.call(this, uin, target_id, "channel", message));
231
171
  const message_id = `${result.seq}:${result.rand}:${result.time}`;
232
172
  return {
233
173
  message_id: version === "V11"
@@ -256,8 +196,15 @@ class IcqqAdapter extends adapter_1.Adapter {
256
196
  throw onebot_1.OneBot.UnsupportedMethodError;
257
197
  }
258
198
  }
259
- fromSegment(version, segment) {
260
- return [].concat(segment).map(item => {
199
+ fromSegment(onebot, version, segment) {
200
+ return []
201
+ .concat(segment)
202
+ .map(segment => {
203
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
204
+ return onebot.V12.transformMedia(segment);
205
+ return segment;
206
+ })
207
+ .map(item => {
261
208
  if (typeof item === "string")
262
209
  return item;
263
210
  const { type, data } = item;
@@ -1,6 +1,4 @@
1
- import { Client, MessageElem, ShareElem } from "@icqqjs/icqq";
2
- export declare function processMessage(this: Client, elements: MessageElem[]): Promise<{
3
- element: MessageElem[];
4
- music?: MessageElem;
5
- share?: ShareElem;
6
- }>;
1
+ import { MessageElem } from "@icqqjs/icqq";
2
+ import { OneBot } from "../../onebot";
3
+ import IcqqAdapter from "../../adapters/icqq/index";
4
+ export declare function processMessages(this: IcqqAdapter, uin: string, target_id: number, target_type: "group" | "private", list: OneBot.Segment<OneBot.Version>[]): Promise<MessageElem[]>;
@@ -1,26 +1,68 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.processMessage = void 0;
4
- const utils_1 = require("../../utils");
5
- async function processMessage(elements) {
6
- let music = elements.find(e => e.type === "music");
7
- if (music) {
8
- (0, utils_1.remove)(elements, music);
9
- if (String(music.platform) === "custom") {
10
- music.platform = music["subtype"]; // gocq 的平台数据存储在 subtype 内,兼容 icqq 时要求前端必须发送 id 字段
3
+ exports.processMessages = void 0;
4
+ const shareMusicCustom_1 = require("./shareMusicCustom");
5
+ async function processMessages(uin, target_id, target_type, list) {
6
+ let result = [];
7
+ for (const item of list) {
8
+ const { type, data, ...other } = item;
9
+ switch (type) {
10
+ case "node": {
11
+ result.push({
12
+ type,
13
+ ...data,
14
+ user_id: data.user_id,
15
+ message: await processMessages.call(this, uin, data.user_id, "private", data.content || []),
16
+ });
17
+ break;
18
+ }
19
+ case "music": {
20
+ if (String(item.data.platform) === "custom") {
21
+ item.data.platform = item.data["subtype"]; // gocq 的平台数据存储在 subtype 内,兼容 icqq 时要求前端必须发送 id 字段
22
+ }
23
+ const { type, data } = item;
24
+ await shareMusicCustom_1.shareMusic.call(this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id), {
25
+ type,
26
+ ...data,
27
+ });
28
+ break;
29
+ }
30
+ case "share": {
31
+ await this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id).shareUrl(item.data);
32
+ break;
33
+ }
34
+ case "video":
35
+ case "audio":
36
+ case "image": {
37
+ item["file"] = item["file"] || item["file_id"] || item["url"];
38
+ if (item["file"]?.startsWith("base64://"))
39
+ item["file"] = Buffer.from(item["file"].slice(9), "base64");
40
+ result.push({
41
+ type: type,
42
+ ...data,
43
+ ...other,
44
+ });
45
+ break;
46
+ }
47
+ case "reply": {
48
+ const oneBot = this.getOneBot(uin);
49
+ const message_id = oneBot.V11.getStrByInt("message_id", data.id);
50
+ const msg = await oneBot.internal.getMsg(message_id);
51
+ result.push({
52
+ type: "quote",
53
+ ...msg,
54
+ });
55
+ break;
56
+ }
57
+ default: {
58
+ result.push({
59
+ type: type,
60
+ ...data,
61
+ ...other,
62
+ });
63
+ }
11
64
  }
12
65
  }
13
- let share = elements.find(e => e.type === "share");
14
- if (share)
15
- (0, utils_1.remove)(elements, share);
16
- for (const element of elements) {
17
- if (["image", "video", "audio"].includes(element.type)) {
18
- if (element["file_id"]?.startsWith("base64://"))
19
- element["file_id"] = Buffer.from(element["file_id"].slice(9), "base64");
20
- if (element["file"]?.startsWith("base64://"))
21
- element["file"] = Buffer.from(element["file"].slice(9), "base64");
22
- }
23
- }
24
- return { element: elements, share, music };
66
+ return result;
25
67
  }
26
- exports.processMessage = processMessage;
68
+ exports.processMessages = processMessages;
@@ -15,7 +15,7 @@ export default class QQAdapter extends Adapter<"qq", Sendable> {
15
15
  sendDirectMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
16
16
  deleteMessage(uin: string, message_id: string): Promise<boolean>;
17
17
  call(uin: string, version: string, method: string, args?: any[]): Promise<any>;
18
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
18
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Bot>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
19
19
  toSegment<V extends OneBot.Version, M = Sendable>(version: V, message: M): OneBot.Segment<V>[];
20
20
  formatEventPayload<V extends OneBot.Version>(uin: string, version: V, event: string, data: any): OneBot.Payload<V>;
21
21
  start(uin: string): Promise<void>;
@@ -175,8 +175,15 @@ class QQAdapter extends adapter_1.Adapter {
175
175
  throw new Error(`call internal method error:${e.message}`);
176
176
  }
177
177
  }
178
- fromSegment(version, segment) {
179
- return [].concat(segment).map(item => {
178
+ fromSegment(onebot, version, segment) {
179
+ return []
180
+ .concat(segment)
181
+ .map(segment => {
182
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
183
+ return onebot.V12.transformMedia(segment);
184
+ return segment;
185
+ })
186
+ .map(item => {
180
187
  if (typeof item === "string")
181
188
  return item;
182
189
  const { type, data } = item;
@@ -215,6 +222,10 @@ class QQAdapter extends adapter_1.Adapter {
215
222
  platform: "qq",
216
223
  time: data.timestamp,
217
224
  ...data,
225
+ sender: {
226
+ ...(data?.sender || {}),
227
+ },
228
+ user_id: data.user_id || data.sender?.user_id,
218
229
  };
219
230
  if (data.message_id) {
220
231
  data.message_id = `${data.message_type}:${data.channel_id || data.guild_id || data.group_id || data.user_id}:${data.message_id}`;
@@ -14,7 +14,7 @@ export default class WechatAdapter extends Adapter<"wechat", Sendable> {
14
14
  sendPrivateMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
15
15
  sendGroupMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
16
16
  deleteMessage<V extends OneBot.Version>(uin: string, version: V, [str]: [string]): Promise<boolean>;
17
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
17
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Client>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
18
18
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
19
19
  getFriendList<V extends OneBot.Version>(uin: string, version: V): Promise<OneBot.UserInfo<V>[]>;
20
20
  getGroupList<V extends OneBot.Version>(uin: string, version: V): Promise<OneBot.GroupInfo<V>[]>;
@@ -143,8 +143,15 @@ class WechatAdapter extends adapter_1.Adapter {
143
143
  return bot.internal.recallMsg(username, message_idArr.join(":"));
144
144
  }
145
145
  }
146
- fromSegment(version, segment) {
147
- return [].concat(segment).map(item => {
146
+ fromSegment(onebot, version, segment) {
147
+ return []
148
+ .concat(segment)
149
+ .map(segment => {
150
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
151
+ return onebot.V12.transformMedia(segment);
152
+ return segment;
153
+ })
154
+ .map(item => {
148
155
  if (typeof item === "string")
149
156
  return item;
150
157
  const { type, data } = item;
@@ -212,6 +219,10 @@ class WechatAdapter extends adapter_1.Adapter {
212
219
  friend: data.friend?.info,
213
220
  time: data.timestamp,
214
221
  ...data,
222
+ sender: {
223
+ ...(data?.sender || {}),
224
+ },
225
+ user_id: data.user_id || data.sender?.user_id,
215
226
  };
216
227
  delete result.bot;
217
228
  delete result.c;
@@ -503,7 +503,7 @@ class V11 extends service_1.Service {
503
503
  res.reply[0].data.platform = res.reply[0].data.type;
504
504
  delete res.reply[0].data.type;
505
505
  }
506
- res.reply = this.adapter.fromSegment("V11", res.reply);
506
+ res.reply = this.adapter.fromSegment(this.oneBot, "V11", res.reply);
507
507
  }
508
508
  this.action[action].apply(this, [id, res.reply, res.auto_escape]);
509
509
  }
@@ -577,7 +577,7 @@ class V11 extends service_1.Service {
577
577
  }
578
578
  params[k] = this.adapter.fromCqcode("V11", params[k]);
579
579
  }
580
- params[k] = this.adapter.fromSegment("V11", params[k]);
580
+ params[k] = this.adapter.fromSegment(this.oneBot, "V11", params[k]);
581
581
  params["message_id"] =
582
582
  params[k].find(e => e.type === "reply")?.id || params["message_id"];
583
583
  }
@@ -668,7 +668,6 @@ exports.V11 = V11;
668
668
  reconnect_interval: 3,
669
669
  use_http: true,
670
670
  enable_cors: true,
671
- enable_reissue: false,
672
671
  use_ws: true,
673
672
  http_reverse: [],
674
673
  ws_reverse: [],
@@ -44,4 +44,5 @@ export declare class CommonAction {
44
44
  uploadFileFragmented(this: V12, stage: "prepare" | "transfer" | "finish", name?: string, total_size?: number, file_id?: string, offset?: number, data?: string, sha256?: string): string | true;
45
45
  getFile(this: V12, file_id: string): V12.FileInfo;
46
46
  sendLike(this: V12, user_id: string, times?: number): Promise<any>;
47
+ imageOcr(this: V12, file: string): Promise<any>;
47
48
  }
@@ -133,5 +133,8 @@ class CommonAction {
133
133
  sendLike(user_id, times = 1) {
134
134
  return this.adapter.call(this.oneBot.uin, "V12", "sendLike", [user_id, times]);
135
135
  }
136
+ imageOcr(file) {
137
+ return this.adapter.call(this.oneBot.uin, "V12", "imageOcr", [file]);
138
+ }
136
139
  }
137
140
  exports.CommonAction = CommonAction;
@@ -49,6 +49,7 @@ export declare class V12 extends Service<"V12"> implements OneBot.Base {
49
49
  };
50
50
  system_online(data: any): void;
51
51
  dispatch(data: Record<string, any>): Promise<void>;
52
+ transformMedia(segment: V12.Segment): V12.Segment;
52
53
  apply(req: V12.RequestAction): Promise<string>;
53
54
  private httpAuth;
54
55
  private httpRequestHandler;
@@ -401,6 +401,18 @@ class V12 extends service_1.Service {
401
401
  return;
402
402
  this.emit("dispatch", payload);
403
403
  }
404
+ transformMedia(segment) {
405
+ const file = this.getFile(segment.data.file_id);
406
+ if (file)
407
+ return {
408
+ type: segment.type,
409
+ data: {
410
+ ...segment.data,
411
+ file_id: `base64://${file.data}`,
412
+ },
413
+ };
414
+ return segment;
415
+ }
404
416
  async apply(req) {
405
417
  let { action = "", params = {}, echo } = req;
406
418
  action = (0, utils_2.toLine)(action);
@@ -445,7 +457,7 @@ class V12 extends service_1.Service {
445
457
  }
446
458
  params[k] = this.adapter.fromCqcode("V12", params[k]);
447
459
  }
448
- params[k] = this.adapter.fromSegment("V12", params[k]);
460
+ params[k] = this.adapter.fromSegment(this.oneBot, "V12", params[k]);
449
461
  }
450
462
  args.push(params[k]);
451
463
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onebots",
3
- "version": "0.4.62",
3
+ "version": "0.4.64",
4
4
  "description": "基于icqq的多例oneBot实现",
5
5
  "engines": {
6
6
  "node": ">=16"