chatboty 0.1.0 → 0.2.1

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 (72) hide show
  1. package/README.md +31 -11
  2. package/dist/cjs/src/chatboty.d.ts +19 -6
  3. package/dist/cjs/src/chatboty.d.ts.map +1 -1
  4. package/dist/cjs/src/chatboty.js +43 -5
  5. package/dist/cjs/src/chatboty.js.map +1 -1
  6. package/dist/cjs/src/entity/contact.d.ts +10 -2
  7. package/dist/cjs/src/entity/contact.d.ts.map +1 -1
  8. package/dist/cjs/src/entity/contact.js +11 -4
  9. package/dist/cjs/src/entity/contact.js.map +1 -1
  10. package/dist/cjs/src/entity/friendship.d.ts +6 -1
  11. package/dist/cjs/src/entity/friendship.d.ts.map +1 -1
  12. package/dist/cjs/src/entity/friendship.js +6 -1
  13. package/dist/cjs/src/entity/friendship.js.map +1 -1
  14. package/dist/cjs/src/entity/message.d.ts +21 -16
  15. package/dist/cjs/src/entity/message.d.ts.map +1 -1
  16. package/dist/cjs/src/entity/message.js +23 -20
  17. package/dist/cjs/src/entity/message.js.map +1 -1
  18. package/dist/cjs/src/entity/received-file.d.ts +25 -0
  19. package/dist/cjs/src/entity/received-file.d.ts.map +1 -0
  20. package/dist/cjs/src/entity/received-file.js +35 -0
  21. package/dist/cjs/src/entity/received-file.js.map +1 -0
  22. package/dist/cjs/src/entity/room.d.ts +18 -8
  23. package/dist/cjs/src/entity/room.d.ts.map +1 -1
  24. package/dist/cjs/src/entity/room.js +20 -15
  25. package/dist/cjs/src/entity/room.js.map +1 -1
  26. package/dist/cjs/src/mod.d.ts +1 -0
  27. package/dist/cjs/src/mod.d.ts.map +1 -1
  28. package/dist/cjs/src/mod.js +3 -1
  29. package/dist/cjs/src/mod.js.map +1 -1
  30. package/dist/cjs/src/types.d.ts +6 -1
  31. package/dist/cjs/src/types.d.ts.map +1 -1
  32. package/dist/cjs/src/types.js.map +1 -1
  33. package/dist/esm/src/chatboty.d.ts +19 -6
  34. package/dist/esm/src/chatboty.d.ts.map +1 -1
  35. package/dist/esm/src/chatboty.js +43 -5
  36. package/dist/esm/src/chatboty.js.map +1 -1
  37. package/dist/esm/src/entity/contact.d.ts +10 -2
  38. package/dist/esm/src/entity/contact.d.ts.map +1 -1
  39. package/dist/esm/src/entity/contact.js +11 -4
  40. package/dist/esm/src/entity/contact.js.map +1 -1
  41. package/dist/esm/src/entity/friendship.d.ts +6 -1
  42. package/dist/esm/src/entity/friendship.d.ts.map +1 -1
  43. package/dist/esm/src/entity/friendship.js +6 -1
  44. package/dist/esm/src/entity/friendship.js.map +1 -1
  45. package/dist/esm/src/entity/message.d.ts +21 -16
  46. package/dist/esm/src/entity/message.d.ts.map +1 -1
  47. package/dist/esm/src/entity/message.js +23 -20
  48. package/dist/esm/src/entity/message.js.map +1 -1
  49. package/dist/esm/src/entity/received-file.d.ts +25 -0
  50. package/dist/esm/src/entity/received-file.d.ts.map +1 -0
  51. package/dist/esm/src/entity/received-file.js +31 -0
  52. package/dist/esm/src/entity/received-file.js.map +1 -0
  53. package/dist/esm/src/entity/room.d.ts +18 -8
  54. package/dist/esm/src/entity/room.d.ts.map +1 -1
  55. package/dist/esm/src/entity/room.js +20 -15
  56. package/dist/esm/src/entity/room.js.map +1 -1
  57. package/dist/esm/src/mod.d.ts +1 -0
  58. package/dist/esm/src/mod.d.ts.map +1 -1
  59. package/dist/esm/src/mod.js +1 -0
  60. package/dist/esm/src/mod.js.map +1 -1
  61. package/dist/esm/src/types.d.ts +6 -1
  62. package/dist/esm/src/types.d.ts.map +1 -1
  63. package/dist/esm/src/types.js.map +1 -1
  64. package/package.json +2 -1
  65. package/src/chatboty.ts +50 -9
  66. package/src/entity/contact.ts +16 -5
  67. package/src/entity/friendship.ts +6 -1
  68. package/src/entity/message.ts +32 -27
  69. package/src/entity/received-file.ts +44 -0
  70. package/src/entity/room.ts +26 -16
  71. package/src/mod.ts +1 -0
  72. package/src/types.ts +6 -1
package/README.md CHANGED
@@ -26,7 +26,7 @@ const bot = new Chatboty({
26
26
 
27
27
  bot.on('message', async (m) => {
28
28
  if (m.self()) return // 跳过自己发的
29
- console.log(`${m.talker()?.name()}: ${m.text()}`)
29
+ console.log(`[${m.id}] ${m.talker()?.name()}: ${m.text()}`)
30
30
  if (m.text() === 'ping') await m.say('pong')
31
31
  })
32
32
 
@@ -35,11 +35,26 @@ bot.on('room-join', (e) => {
35
35
  e.room.say(`欢迎 ${names} 加入!`)
36
36
  })
37
37
 
38
+ bot.on('login', (self) => console.log('已登录:', self.name())) // self 是 typed Contact
39
+ bot.on('error', (err) => console.error('探针错误:', err.message)) // err 是真正的 Error
40
+
38
41
  await bot.start()
39
42
  ```
40
43
 
41
44
  就这样——`token` 决定连到哪个企业微信实例,平台负责路由与隔离。
42
45
 
46
+ ## 同步 vs 异步约定
47
+
48
+ 一条简单规则贯穿所有实体:
49
+
50
+ > **实体已经持有的数据**(来自事件 payload / 缓存)用**同步**读取;
51
+ > **任何需要回连接器 / 企微的操作**(下载、拉通讯录、发送、建群、改名…)一律 `async`。
52
+
53
+ - 同步:`m.id`、`m.text()`、`m.type()`、`m.self()`、`m.talker()`、`m.room()`、`m.mentionSelf()`;`c.id`、`c.name()`、`c.alias()`、`c.title()`、`c.phone()`;`r.id`、`r.topic()`、`r.owner()`。
54
+ - 异步:`m.say()`、`m.toFileBox()`、`m.download()`、`m.mentionList()`;`r.say()`、`r.rename()`、`r.memberAll()`;`bot.currentUser()`、`bot.contactFind*()`、`bot.roomFind*()`、`bot.roomCreate()`、`bot.sayTo()`。
55
+
56
+ > `id` 是**只读属性**(`m.id`,不是 `m.id()`)——Message / Contact / Room 皆然。
57
+
43
58
  ## 事件
44
59
 
45
60
  | 事件 | 回调参数 | 说明 |
@@ -49,30 +64,35 @@ await bot.start()
49
64
  | `room-leave` | `{ room, contactList, idList, timestamp }` | 有人退群/被移除 |
50
65
  | `room-topic` | `{ room, topic, oldTopic, timestamp }` | 群改名 |
51
66
  | `friendship` | `Friendship` | 加好友/删好友 |
52
- | `login` / `logout` | `self?` / | 登录态变化 |
67
+ | `login` | `Contact` | 登录成功, 回调收到 typed 的当前登录者 Contact |
68
+ | `logout` | — | 登出 |
53
69
  | `scan` | `{ qrcode, status }` | 登录二维码 |
54
- | `error` | `{ error }` | 探针/代理侧错误信号(不中断运行, 仅上报) |
70
+ | `error` | `Error` | 探针/代理侧错误信号(不中断运行, 仅上报; 回调收到真正的 `Error` 对象) |
55
71
  | `heartbeat` | `{ state }` | 探针心跳(~30s), 供存活/掉线判定 |
56
72
 
57
73
  ## 实体 API(节选)
58
74
 
59
75
  ```ts
60
- // Message
61
- m.text(); m.type(); m.self(); m.talker(); m.room(); m.file(); m.say(sayable)
76
+ // Message —— id 是只读属性; 其余同步读取; 下载/发送为 async
77
+ m.id; m.text(); m.type(); m.self(); m.talker(); m.room(); m.file()
78
+ await m.say(sayable)
62
79
  m.mentionSelf(); // 本条是否 @ 了我/@所有人(布尔, 纯文本判定)
63
80
  await m.mentionList(); // 被 @ 的 Contact[](best-effort: 解析正文@名→就近解析通讯录)
64
- await m.toFileBox(); // 取媒体/文件字节 FileBox{dataUrl,mime,name,size}; 别名 m.download()
65
- // await m.forward(to); // ⚠️ 未实现(需逆向企微转发服务), 调用抛错
81
+ const f = await m.toFileBox(); // → ReceivedFile{dataUrl,mime,name,size} + toBuffer()/save(); 别名 m.download()
82
+ if (f) await f.save('./photo.png'); // const buf = f.toBuffer()
66
83
 
67
84
  // Contact
68
- c.id(); c.name(); c.alias(); c.avatar(); c.type(); c.say(sayable)
85
+ c.id; c.name(); c.alias(); c.avatar(); c.title(); c.phone(); c.type(); await c.say(sayable)
69
86
  // 注: 企微通讯录未采集性别 → 不提供 gender()
70
87
 
71
88
  // Room
72
- r.id(); r.topic(); r.say(sayable); r.rename(topic); r.memberAll(); r.owner()
89
+ r.id; r.topic(); r.owner(); // 同步(缓存)
90
+ await r.say(sayable); await r.rename(topic); await r.memberAll()
73
91
 
74
- // Bot
75
- bot.roomList(); bot.contactList(); bot.roomCreate(memberIds, topic)
92
+ // Bot —— 集合方法对称: contactFind/contactFindAll, roomFind/roomFindAll, roomCreate
93
+ bot.roomCreate(memberIds, topic)
94
+ await bot.roomFind({ topic: '项目群' }); // 或 roomFind('关键词') → Room | undefined
95
+ await bot.roomFindAll(); // → Room[](全部已加载群; 传 query 则本地过滤)
76
96
  await bot.contactFind({ name: '张三' }); // 或 contactFind('关键词') → Contact | undefined
77
97
  await bot.contactFindAll('关键词'); // → Contact[](本地通讯录过滤)
78
98
  await bot.currentUser(); bot.self; // 当前登录者(Contact) / 缓存的 self getter
@@ -4,7 +4,7 @@
4
4
  * 对外暴露 typed 事件与便捷 API。这是 chatboty 全生态框架的核心。
5
5
  */
6
6
  import { type ChatbotyClientOptions } from './client.js';
7
- import { type BotApi, type Sayable, type ContactPayload, type ContactQueryFilter } from './types.js';
7
+ import { type BotApi, type Sayable, type ContactPayload, type ContactQueryFilter, type RoomQueryFilter } from './types.js';
8
8
  import { Message } from './entity/message.js';
9
9
  import { Contact } from './entity/contact.js';
10
10
  import { Room } from './entity/room.js';
@@ -19,6 +19,8 @@ export declare class Chatboty implements BotApi {
19
19
  get accountId(): string | undefined;
20
20
  /** 当前登录者(self)。start 后异步热身; 未就绪时 undefined(用 {@link currentUser} 主动拉取)。 */
21
21
  get self(): Contact | undefined;
22
+ /** 是否已登录(在线)。等价于 self 已就绪。 */
23
+ get isLoggedIn(): boolean;
22
24
  start(): Promise<void>;
23
25
  stop(): Promise<void>;
24
26
  on(event: 'message', l: (m: Message) => void): this;
@@ -35,7 +37,7 @@ export declare class Chatboty implements BotApi {
35
37
  oldTopic?: string;
36
38
  timestamp?: number;
37
39
  }) => void): this;
38
- on(event: 'login', l: (self?: any) => void): this;
40
+ on(event: 'login', l: (self: Contact) => void): this;
39
41
  on(event: 'scan', l: (p: {
40
42
  qrcode?: string;
41
43
  status?: any;
@@ -44,9 +46,7 @@ export declare class Chatboty implements BotApi {
44
46
  phase: string;
45
47
  label?: string;
46
48
  }) => void): this;
47
- on(event: 'error', l: (p: {
48
- error: string;
49
- }) => void): this;
49
+ on(event: 'error', l: (err: Error) => void): this;
50
50
  on(event: 'heartbeat', l: (p: {
51
51
  state?: string;
52
52
  }) => void): this;
@@ -60,6 +60,8 @@ export declare class Chatboty implements BotApi {
60
60
  command(cmd: string, args?: Record<string, any>): Promise<any>;
61
61
  /** 登录扫码后若企微要求验证码, 用此提交(配合 on('login-phase') 的 need-verify 阶段)。 */
62
62
  enterVerifyCode(code: string): Promise<any>;
63
+ /** 刷新登录二维码(仅未登录/扫码态有效): 令探针重新取一张新码, 旧码作废。 */
64
+ refreshQrCode(): Promise<any>;
63
65
  /** BotApi: 当前登录者 payload(供实体做本机 self 判定, 如 Message.mentionSelf)。 */
64
66
  selfContact(): ContactPayload | undefined;
65
67
  /**
@@ -73,7 +75,18 @@ export declare class Chatboty implements BotApi {
73
75
  */
74
76
  currentUser(): Promise<Contact | undefined>;
75
77
  sayTo(conversationId: string, sayable: Sayable): Promise<any>;
76
- roomList(): Promise<Room[]>;
78
+ /**
79
+ * 查找群列表。无 query 时返回全部已加载群; 传 query 则在其上本地过滤。
80
+ * @param query 关键词字符串(匹配 topic/id 子串), 或 { topic?, id? } 精确匹配。
81
+ * @returns 命中的 Room 列表(可能为空)。
82
+ */
83
+ roomFindAll(query?: RoomQueryFilter): Promise<Room[]>;
84
+ /**
85
+ * 查找单个群(取 {@link roomFindAll} 第一个命中)。
86
+ * @param query 关键词字符串或 { topic?, id? }。
87
+ * @returns 命中的第一个 Room; 无则 undefined。
88
+ */
89
+ roomFind(query: RoomQueryFilter): Promise<Room | undefined>;
77
90
  contactList(): Promise<Contact[]>;
78
91
  /**
79
92
  * 在【已加载的全量通讯录】按条件查找联系人(本地过滤, 非服务端搜陌生人)。
@@ -1 +1 @@
1
- {"version":3,"file":"chatboty.d.ts","sourceRoot":"","sources":["../../../src/chatboty.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatboty.d.ts","sourceRoot":"","sources":["../../../src/chatboty.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,8 @@ class Chatboty {
21
21
  get accountId() { return this.client.account; }
22
22
  /** 当前登录者(self)。start 后异步热身; 未就绪时 undefined(用 {@link currentUser} 主动拉取)。 */
23
23
  get self() { return this._self; }
24
+ /** 是否已登录(在线)。等价于 self 已就绪。 */
25
+ get isLoggedIn() { return this._self !== undefined; }
24
26
  async start() {
25
27
  this.wire();
26
28
  await this.client.start();
@@ -49,12 +51,17 @@ class Chatboty {
49
51
  room: new room_js_1.Room(this, { id: w.roomId, topic: w.topic }), topic: w.topic, oldTopic: w.oldTopic, timestamp: w.timestamp,
50
52
  }));
51
53
  this.client.on('friendship', (w) => this.emit('friendship', this.toFriendship(w)));
52
- this.client.on('login', (w) => this.emit('login', w.self));
54
+ this.client.on('login', (w) => {
55
+ // 把 payload 构造成 typed self Contact, 缓存并向上抛(供 message.mentionSelf/self 判定)。
56
+ const self = new contact_js_1.Contact(this, this.toContactPayload(w.self ?? w));
57
+ this._self = self;
58
+ this.emit('login', self);
59
+ });
53
60
  this.client.on('logout', () => { this._self = undefined; this.emit('logout'); });
54
61
  this.client.on('scan', (w) => this.emit('scan', { qrcode: w.qrcode, status: w.status }));
55
62
  this.client.on('login-phase', (w) => this.emit('login-phase', { phase: w.phase, label: w.label }));
56
63
  this.client.on('disconnected', () => this.emit('disconnected'));
57
- this.client.on('error', (w) => this.emit('error', { error: w.error }));
64
+ this.client.on('error', (w) => this.emit('error', new Error(w.error ?? '未知错误')));
58
65
  this.client.on('heartbeat', (w) => this.emit('heartbeat', { state: w.state }));
59
66
  }
60
67
  /* ---------------- wire → 实体 ---------------- */
@@ -111,6 +118,10 @@ class Chatboty {
111
118
  async enterVerifyCode(code) {
112
119
  return this.client.command('enterVerifyCode', { code });
113
120
  }
121
+ /** 刷新登录二维码(仅未登录/扫码态有效): 令探针重新取一张新码, 旧码作废。 */
122
+ async refreshQrCode() {
123
+ return this.command('refreshQr');
124
+ }
114
125
  /** BotApi: 当前登录者 payload(供实体做本机 self 判定, 如 Message.mentionSelf)。 */
115
126
  selfContact() { return this._self?.payload; }
116
127
  /**
@@ -152,10 +163,37 @@ class Chatboty {
152
163
  throw new Error('不支持的发送内容');
153
164
  }
154
165
  /* ---------------- 查询/工厂 ---------------- */
155
- async roomList() {
166
+ /**
167
+ * 查找群列表。无 query 时返回全部已加载群; 传 query 则在其上本地过滤。
168
+ * @param query 关键词字符串(匹配 topic/id 子串), 或 { topic?, id? } 精确匹配。
169
+ * @returns 命中的 Room 列表(可能为空)。
170
+ */
171
+ async roomFindAll(query) {
156
172
  const r = await this.command('roomList');
157
173
  const arr = (r && (r.rooms || r.list || (Array.isArray(r) ? r : []))) || [];
158
- return arr.map((x) => new room_js_1.Room(this, { id: x.conversationId || x.id, topic: x.name || x.topic }));
174
+ let list = arr.map((x) => new room_js_1.Room(this, { id: x.conversationId || x.id, topic: x.name || x.topic }));
175
+ if (query !== undefined) {
176
+ if (typeof query === 'string') {
177
+ const kw = query.toLowerCase();
178
+ list = list.filter((rm) => (rm.topic() ?? '').toLowerCase().includes(kw) || rm.id.toLowerCase().includes(kw));
179
+ }
180
+ else {
181
+ if (query.id)
182
+ list = list.filter((rm) => rm.id === query.id);
183
+ if (query.topic)
184
+ list = list.filter((rm) => rm.topic() === query.topic);
185
+ }
186
+ }
187
+ return list;
188
+ }
189
+ /**
190
+ * 查找单个群(取 {@link roomFindAll} 第一个命中)。
191
+ * @param query 关键词字符串或 { topic?, id? }。
192
+ * @returns 命中的第一个 Room; 无则 undefined。
193
+ */
194
+ async roomFind(query) {
195
+ const all = await this.roomFindAll(query);
196
+ return all[0];
159
197
  }
160
198
  async contactList() {
161
199
  const r = await this.command('contactList');
@@ -176,7 +214,7 @@ class Chatboty {
176
214
  let list = arr.map((u) => new contact_js_1.Contact(this, this.toContactPayload(u)));
177
215
  if (query && typeof query !== 'string') { // 对象条件: 在子串命中基础上再做精确收窄
178
216
  if (query.id)
179
- list = list.filter((c) => c.id() === query.id);
217
+ list = list.filter((c) => c.id === query.id);
180
218
  if (query.alias)
181
219
  list = list.filter((c) => c.alias() === query.alias);
182
220
  if (query.name)
@@ -1 +1 @@
1
- {"version":3,"file":"chatboty.js","sourceRoot":"","sources":["../../../src/chatboty.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatboty.js","sourceRoot":"","sources":["../../../src/chatboty.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,19 @@
1
1
  import type { BotApi, ContactPayload, Sayable } from '../types.js';
2
2
  import { ContactType } from '../types.js';
3
- /** 联系人实体(含外部客户)。 */
3
+ /**
4
+ * 联系人实体(含外部客户)。
5
+ *
6
+ * 【同步 vs 异步约定】实体已持有的数据(来自事件 payload / 缓存)用【同步】读取;
7
+ * 需要回连接器/企微的操作一律 async。
8
+ * - 同步(缓存): id / name() / alias() / avatar() / phone() / title() / type() / conversationId()
9
+ * - 异步(动作): say()
10
+ */
4
11
  export declare class Contact {
5
12
  private readonly bot;
6
13
  readonly payload: ContactPayload;
14
+ /** 联系人 id(vid; 同步只读属性)。 */
15
+ readonly id: string;
7
16
  constructor(bot: BotApi, payload: ContactPayload);
8
- id(): string;
9
17
  name(): string;
10
18
  alias(): string | undefined;
11
19
  avatar(): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"contact.d.ts","sourceRoot":"","sources":["../../../../src/entity/contact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,oBAAoB;AACpB,qBAAa,OAAO;IACL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,QAAQ,CAAC,OAAO,EAAE,cAAc;gBAA7C,GAAG,EAAE,MAAM,EAAW,OAAO,EAAE,cAAc;IAE3E,EAAE,IAAK,MAAM;IACb,IAAI,IAAK,MAAM;IACf,KAAK,IAAK,MAAM,GAAG,SAAS;IAC5B,MAAM,IAAK,MAAM,GAAG,SAAS;IAC7B,KAAK,IAAK,MAAM,GAAG,SAAS;IAC5B,KAAK,IAAK,MAAM,GAAG,SAAS;IAE5B;;;OAGG;IACH,IAAI,IAAK,WAAW;IAEpB,sBAAsB;IACtB,cAAc,IAAK,MAAM,GAAG,SAAS;IAErC,oBAAoB;IACd,GAAG,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAM1C,QAAQ,IAAK,MAAM;CACpB"}
1
+ {"version":3,"file":"contact.d.ts","sourceRoot":"","sources":["../../../../src/entity/contact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;;;;GAOG;AACH,qBAAa,OAAO;IAIL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,QAAQ,CAAC,OAAO,EAAE,cAAc;IAH3E,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;gBAEW,GAAG,EAAE,MAAM,EAAW,OAAO,EAAE,cAAc;IAI3E,IAAI,IAAK,MAAM;IACf,KAAK,IAAK,MAAM,GAAG,SAAS;IAC5B,MAAM,IAAK,MAAM,GAAG,SAAS;IAC7B,KAAK,IAAK,MAAM,GAAG,SAAS;IAC5B,KAAK,IAAK,MAAM,GAAG,SAAS;IAE5B;;;OAGG;IACH,IAAI,IAAK,WAAW;IAEpB,sBAAsB;IACtB,cAAc,IAAK,MAAM,GAAG,SAAS;IAErC,oBAAoB;IACd,GAAG,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAM1C,QAAQ,IAAK,MAAM;CACpB"}
@@ -2,13 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Contact = void 0;
4
4
  const types_js_1 = require("../types.js");
5
- /** 联系人实体(含外部客户)。 */
5
+ /**
6
+ * 联系人实体(含外部客户)。
7
+ *
8
+ * 【同步 vs 异步约定】实体已持有的数据(来自事件 payload / 缓存)用【同步】读取;
9
+ * 需要回连接器/企微的操作一律 async。
10
+ * - 同步(缓存): id / name() / alias() / avatar() / phone() / title() / type() / conversationId()
11
+ * - 异步(动作): say()
12
+ */
6
13
  class Contact {
7
14
  constructor(bot, payload) {
8
15
  this.bot = bot;
9
16
  this.payload = payload;
17
+ this.id = payload.id;
10
18
  }
11
- id() { return this.payload.id; }
12
19
  name() { return this.payload.name ?? ''; }
13
20
  alias() { return this.payload.alias; }
14
21
  avatar() { return this.payload.avatar; }
@@ -25,10 +32,10 @@ class Contact {
25
32
  async say(sayable) {
26
33
  const conv = this.payload.conversationId;
27
34
  if (!conv)
28
- throw new Error(`Contact ${this.id()} 无单聊会话 id, 无法发送`);
35
+ throw new Error(`Contact ${this.id} 无单聊会话 id, 无法发送`);
29
36
  return this.bot.sayTo(conv, sayable);
30
37
  }
31
- toString() { return `Contact<${this.name() || this.id()}>`; }
38
+ toString() { return `Contact<${this.name() || this.id}>`; }
32
39
  }
33
40
  exports.Contact = Contact;
34
41
  //# sourceMappingURL=contact.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contact.js","sourceRoot":"","sources":["../../../../src/entity/contact.ts"],"names":[],"mappings":";;;AACA,0CAAyC;AAEzC,oBAAoB;AACpB,MAAa,OAAO;IAClB,YAA8B,GAAW,EAAW,OAAuB;QAA7C,QAAG,GAAH,GAAG,CAAQ;QAAW,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/E,EAAE,KAAc,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA,CAAC,CAAC;IACxC,IAAI,KAAc,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAA,CAAC,CAAC;IAClD,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAC1D,MAAM,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA,CAAC,CAAC;IAC5D,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAC1D,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAE1D;;;OAGG;IACH,IAAI,KAAmB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,sBAAW,CAAC,UAAU,CAAA,CAAC,CAAC;IAE3E,sBAAsB;IACtB,cAAc,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAA,CAAC,CAAC;IAE5E,oBAAoB;IACpB,KAAK,CAAC,GAAG,CAAE,OAAgB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAA;QACxC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAA;QACjE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,QAAQ,KAAc,OAAO,WAAW,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,GAAG,CAAA,CAAC,CAAC;CACtE;AA3BD,0BA2BC"}
1
+ {"version":3,"file":"contact.js","sourceRoot":"","sources":["../../../../src/entity/contact.ts"],"names":[],"mappings":";;;AACA,0CAAyC;AAEzC;;;;;;;GAOG;AACH,MAAa,OAAO;IAIlB,YAA8B,GAAW,EAAW,OAAuB;QAA7C,QAAG,GAAH,GAAG,CAAQ;QAAW,YAAO,GAAP,OAAO,CAAgB;QACzE,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,KAAc,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAA,CAAC,CAAC;IAClD,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAC1D,MAAM,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA,CAAC,CAAC;IAC5D,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAC1D,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAE1D;;;OAGG;IACH,IAAI,KAAmB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,sBAAW,CAAC,UAAU,CAAA,CAAC,CAAC;IAE3E,sBAAsB;IACtB,cAAc,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAA,CAAC,CAAC;IAE5E,oBAAoB;IACpB,KAAK,CAAC,GAAG,CAAE,OAAgB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAA;QACxC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAA;QAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,QAAQ,KAAc,OAAO,WAAW,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAA,CAAC,CAAC;CACpE;AA/BD,0BA+BC"}
@@ -1,6 +1,11 @@
1
1
  import type { BotApi, FriendshipPayload, FriendshipKind } from '../types.js';
2
2
  import { Contact } from './contact.js';
3
- /** 好友关系事件实体。 */
3
+ /**
4
+ * 好友关系事件实体。
5
+ *
6
+ * 【同步 vs 异步约定】本实体全部数据来自事件 payload, 故 kind()/hello()/contact() 均为同步。
7
+ * (Friendship 无自身 id; 相关联系人 id 见 contact().id。)
8
+ */
4
9
  export declare class Friendship {
5
10
  private readonly bot;
6
11
  readonly payload: FriendshipPayload;
@@ -1 +1 @@
1
- {"version":3,"file":"friendship.d.ts","sourceRoot":"","sources":["../../../../src/entity/friendship.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,gBAAgB;AAChB,qBAAa,UAAU;IACR,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,QAAQ,CAAC,OAAO,EAAE,iBAAiB;gBAAhD,GAAG,EAAE,MAAM,EAAW,OAAO,EAAE,iBAAiB;IAE9E,IAAI,IAAK,cAAc;IACvB,KAAK,IAAK,MAAM,GAAG,SAAS;IAE5B,OAAO,IAAK,OAAO;IAInB,QAAQ,IAAK,MAAM;CACpB"}
1
+ {"version":3,"file":"friendship.d.ts","sourceRoot":"","sources":["../../../../src/entity/friendship.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;;;;GAKG;AACH,qBAAa,UAAU;IACR,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,QAAQ,CAAC,OAAO,EAAE,iBAAiB;gBAAhD,GAAG,EAAE,MAAM,EAAW,OAAO,EAAE,iBAAiB;IAE9E,IAAI,IAAK,cAAc;IACvB,KAAK,IAAK,MAAM,GAAG,SAAS;IAE5B,OAAO,IAAK,OAAO;IAInB,QAAQ,IAAK,MAAM;CACpB"}
@@ -2,7 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Friendship = void 0;
4
4
  const contact_js_1 = require("./contact.js");
5
- /** 好友关系事件实体。 */
5
+ /**
6
+ * 好友关系事件实体。
7
+ *
8
+ * 【同步 vs 异步约定】本实体全部数据来自事件 payload, 故 kind()/hello()/contact() 均为同步。
9
+ * (Friendship 无自身 id; 相关联系人 id 见 contact().id。)
10
+ */
6
11
  class Friendship {
7
12
  constructor(bot, payload) {
8
13
  this.bot = bot;
@@ -1 +1 @@
1
- {"version":3,"file":"friendship.js","sourceRoot":"","sources":["../../../../src/entity/friendship.ts"],"names":[],"mappings":";;;AACA,6CAAsC;AAEtC,gBAAgB;AAChB,MAAa,UAAU;IACrB,YAA8B,GAAW,EAAW,OAA0B;QAAhD,QAAG,GAAH,GAAG,CAAQ;QAAW,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAElF,IAAI,KAAsB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA,CAAC,CAAC;IACpD,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAE1D,OAAO;QACL,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACtF,CAAC;IAED,QAAQ,KAAc,OAAO,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAA,CAAC,CAAC;CACtF;AAXD,gCAWC"}
1
+ {"version":3,"file":"friendship.js","sourceRoot":"","sources":["../../../../src/entity/friendship.ts"],"names":[],"mappings":";;;AACA,6CAAsC;AAEtC;;;;;GAKG;AACH,MAAa,UAAU;IACrB,YAA8B,GAAW,EAAW,OAA0B;QAAhD,QAAG,GAAH,GAAG,CAAQ;QAAW,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAElF,IAAI,KAAsB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA,CAAC,CAAC;IACpD,KAAK,KAA0B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAA,CAAC,CAAC;IAE1D,OAAO;QACL,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACtF,CAAC;IAED,QAAQ,KAAc,OAAO,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAA,CAAC,CAAC;CACtF;AAXD,gCAWC"}
@@ -1,18 +1,28 @@
1
- import type { BotApi, MessagePayload, Sayable, FileBox } from '../types.js';
1
+ import type { BotApi, MessagePayload, Sayable } from '../types.js';
2
2
  import { MessageType } from '../types.js';
3
3
  import { Contact } from './contact.js';
4
4
  import { Room } from './room.js';
5
- /** 消息实体。 */
5
+ import { ReceivedFile } from './received-file.js';
6
+ /**
7
+ * 消息实体。
8
+ *
9
+ * 【同步 vs 异步约定】实体已持有的数据(来自事件 payload / 缓存)用【同步】方法直接读取;
10
+ * 任何需要回连接器/企微(下载、拉通讯录、发送)的操作一律 async。
11
+ * - 同步(缓存): id / type() / text() / self() / talker() / room() / mentionSelf() / timestamp()
12
+ * - 异步(round-trip/动作): say() / toFileBox() / download() / mentionList()
13
+ */
6
14
  export declare class Message {
7
15
  private readonly bot;
8
16
  readonly payload: MessagePayload;
17
+ /** 消息 id(来自事件 payload; 同步只读属性)。未知时为空串。 */
18
+ readonly id: string;
9
19
  constructor(bot: BotApi, payload: MessagePayload);
10
- id(): string | undefined;
11
20
  type(): MessageType;
12
21
  text(): string;
13
22
  self(): boolean;
14
23
  timestamp(): number | undefined;
15
- file(): FileBox | null | undefined;
24
+ /** 随事件附带的媒体(若探针已下载); 无则 undefined。取字节请用 {@link toFileBox}。 */
25
+ file(): ReceivedFile | null | undefined;
16
26
  miniProgram(): Record<string, any> | null | undefined;
17
27
  urlLink(): Record<string, any> | null | undefined;
18
28
  /** 发送者(完整 Contact; 群消息识别客户用)。 */
@@ -30,7 +40,7 @@ export declare class Message {
30
40
  /**
31
41
  * 消息中被 @ 的联系人列表(best-effort)。
32
42
  * 先从正文解析出 @显示名, 再用一次 contactList 拉全量通讯录按 name/alias 就近解析成完整 Contact;
33
- * 未在已加载通讯录中的成员回退为仅含名字的 Contact(其 id() 为空串)。
43
+ * 未在已加载通讯录中的成员回退为仅含名字的 Contact(其 id 为空串)。
34
44
  * @returns 被 @ 的 Contact 数组(无 @ 时为空数组)。
35
45
  */
36
46
  mentionList(): Promise<Contact[]>;
@@ -40,22 +50,17 @@ export declare class Message {
40
50
  * (纯本机文本判定, 不发起网络请求; 依赖 bot 已知 self 名。)
41
51
  */
42
52
  mentionSelf(): boolean;
43
- private toFileBoxFromResult;
53
+ private toFileFromResult;
44
54
  /**
45
- * 取本条消息的媒体/文件字节(图片/文件/音视频), 返回 {@link FileBox}(含 base64 data URL)。
55
+ * 取本条消息的媒体/文件字节(图片/文件/音视频), 返回 {@link ReceivedFile}(含 base64 data URL,
56
+ * 并带 toBuffer()/save() 便捷方法)。
46
57
  * - 收到的图片/文件事件通常已附带 file(探针后台已下载解密) → 直接返回。
47
58
  * - 否则按类型冷调探针下载: 图片走 downloadImage, 文件/音视频走 downloadFile(按 msgid+会话+文件名定位缓存)。
48
- * @returns FileBox(dataUrl/mime/name/size); 非媒体消息或下载失败返回 null。
59
+ * @returns ReceivedFile; 非媒体消息或下载失败返回 null。
49
60
  */
50
- toFileBox(): Promise<FileBox | null>;
61
+ toFileBox(): Promise<ReceivedFile | null>;
51
62
  /** {@link toFileBox} 的别名(下载本条消息的媒体字节)。 */
52
- download(): Promise<FileBox | null>;
53
- /**
54
- * 转发本条消息到另一会话(群/单聊 conversationId, 或 Room/Contact)。
55
- * ⚠️ 未实现: 企微转发需逆向定位并冷调"转发消息"服务(见 puppet-wework 交付说明的 RE 计划)。
56
- * 当前会抛错, 以免静默失败。
57
- */
58
- forward(_to: string | Room | Contact): Promise<never>;
63
+ download(): Promise<ReceivedFile | null>;
59
64
  toString(): string;
60
65
  }
61
66
  //# sourceMappingURL=message.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../src/entity/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,YAAY;AACZ,qBAAa,OAAO;IACL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,QAAQ,CAAC,OAAO,EAAE,cAAc;gBAA7C,GAAG,EAAE,MAAM,EAAW,OAAO,EAAE,cAAc;IAE3E,EAAE,IAAK,MAAM,GAAG,SAAS;IACzB,IAAI,IAAK,WAAW;IACpB,IAAI,IAAK,MAAM;IACf,IAAI,IAAK,OAAO;IAChB,SAAS,IAAK,MAAM,GAAG,SAAS;IAChC,IAAI,IAAK,OAAO,GAAG,IAAI,GAAG,SAAS;IACnC,WAAW,IAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IACtD,OAAO,IAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IAElD,iCAAiC;IACjC,MAAM,IAAK,OAAO,GAAG,SAAS;IAM9B,0BAA0B;IAC1B,IAAI,IAAK,IAAI,GAAG,SAAS;IAIzB,4BAA4B;IACtB,GAAG,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAO1C;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;OAKG;IACG,WAAW,IAAK,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBxC;;;;OAIG;IACH,WAAW,IAAK,OAAO;IAUvB,OAAO,CAAC,mBAAmB;IAO3B;;;;;OAKG;IACG,SAAS,IAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAqB3C,0CAA0C;IACpC,QAAQ,IAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI1C;;;;OAIG;IACG,OAAO,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAI5D,QAAQ,IAAK,MAAM;CACpB"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../src/entity/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;;;;GAOG;AACH,qBAAa,OAAO;IAIL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,QAAQ,CAAC,OAAO,EAAE,cAAc;IAH3E,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;gBAEW,GAAG,EAAE,MAAM,EAAW,OAAO,EAAE,cAAc;IAI3E,IAAI,IAAK,WAAW;IACpB,IAAI,IAAK,MAAM;IACf,IAAI,IAAK,OAAO;IAChB,SAAS,IAAK,MAAM,GAAG,SAAS;IAChC,8DAA8D;IAC9D,IAAI,IAAK,YAAY,GAAG,IAAI,GAAG,SAAS;IAGxC,WAAW,IAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IACtD,OAAO,IAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IAElD,iCAAiC;IACjC,MAAM,IAAK,OAAO,GAAG,SAAS;IAM9B,0BAA0B;IAC1B,IAAI,IAAK,IAAI,GAAG,SAAS;IAIzB,4BAA4B;IACtB,GAAG,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAO1C;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;OAKG;IACG,WAAW,IAAK,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBxC;;;;OAIG;IACH,WAAW,IAAK,OAAO;IAUvB,OAAO,CAAC,gBAAgB;IAOxB;;;;;;OAMG;IACG,SAAS,IAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAqBhD,0CAA0C;IACpC,QAAQ,IAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAE/C,QAAQ,IAAK,MAAM;CACpB"}
@@ -4,18 +4,29 @@ exports.Message = void 0;
4
4
  const types_js_1 = require("../types.js");
5
5
  const contact_js_1 = require("./contact.js");
6
6
  const room_js_1 = require("./room.js");
7
- /** 消息实体。 */
7
+ const received_file_js_1 = require("./received-file.js");
8
+ /**
9
+ * 消息实体。
10
+ *
11
+ * 【同步 vs 异步约定】实体已持有的数据(来自事件 payload / 缓存)用【同步】方法直接读取;
12
+ * 任何需要回连接器/企微(下载、拉通讯录、发送)的操作一律 async。
13
+ * - 同步(缓存): id / type() / text() / self() / talker() / room() / mentionSelf() / timestamp()
14
+ * - 异步(round-trip/动作): say() / toFileBox() / download() / mentionList()
15
+ */
8
16
  class Message {
9
17
  constructor(bot, payload) {
10
18
  this.bot = bot;
11
19
  this.payload = payload;
20
+ this.id = payload.id ?? '';
12
21
  }
13
- id() { return this.payload.id; }
14
22
  type() { return this.payload.type; }
15
23
  text() { return this.payload.text ?? ''; }
16
24
  self() { return !!this.payload.self; }
17
25
  timestamp() { return this.payload.timestamp; }
18
- file() { return this.payload.file; }
26
+ /** 随事件附带的媒体(若探针已下载); 无则 undefined。取字节请用 {@link toFileBox}。 */
27
+ file() {
28
+ return this.payload.file ? new received_file_js_1.ReceivedFile(this.payload.file) : this.payload.file;
29
+ }
19
30
  miniProgram() { return this.payload.miniProgram; }
20
31
  urlLink() { return this.payload.urlLink; }
21
32
  /** 发送者(完整 Contact; 群消息识别客户用)。 */
@@ -58,7 +69,7 @@ class Message {
58
69
  /**
59
70
  * 消息中被 @ 的联系人列表(best-effort)。
60
71
  * 先从正文解析出 @显示名, 再用一次 contactList 拉全量通讯录按 name/alias 就近解析成完整 Contact;
61
- * 未在已加载通讯录中的成员回退为仅含名字的 Contact(其 id() 为空串)。
72
+ * 未在已加载通讯录中的成员回退为仅含名字的 Contact(其 id 为空串)。
62
73
  * @returns 被 @ 的 Contact 数组(无 @ 时为空数组)。
63
74
  */
64
75
  async mentionList() {
@@ -97,30 +108,31 @@ class Message {
97
108
  return !!selfName && this.mentionNames().includes(selfName);
98
109
  }
99
110
  /* ---------------- 媒体下载 ---------------- */
100
- toFileBoxFromResult(r) {
111
+ toFileFromResult(r) {
101
112
  if (!r)
102
113
  return null;
103
114
  const dataUrl = r.dataUrl || r.base64;
104
115
  if (!dataUrl)
105
116
  return null;
106
- return { dataUrl, mime: r.mime, name: r.name, size: r.size };
117
+ return new received_file_js_1.ReceivedFile({ dataUrl, mime: r.mime, name: r.name, size: r.size });
107
118
  }
108
119
  /**
109
- * 取本条消息的媒体/文件字节(图片/文件/音视频), 返回 {@link FileBox}(含 base64 data URL)。
120
+ * 取本条消息的媒体/文件字节(图片/文件/音视频), 返回 {@link ReceivedFile}(含 base64 data URL,
121
+ * 并带 toBuffer()/save() 便捷方法)。
110
122
  * - 收到的图片/文件事件通常已附带 file(探针后台已下载解密) → 直接返回。
111
123
  * - 否则按类型冷调探针下载: 图片走 downloadImage, 文件/音视频走 downloadFile(按 msgid+会话+文件名定位缓存)。
112
- * @returns FileBox(dataUrl/mime/name/size); 非媒体消息或下载失败返回 null。
124
+ * @returns ReceivedFile; 非媒体消息或下载失败返回 null。
113
125
  */
114
126
  async toFileBox() {
115
127
  if (this.payload.file)
116
- return this.payload.file;
128
+ return new received_file_js_1.ReceivedFile(this.payload.file);
117
129
  const msgid = this.payload.id;
118
130
  if (!msgid)
119
131
  return null;
120
132
  const t = this.payload.type;
121
133
  if (t === types_js_1.MessageType.Image) {
122
134
  const r = await this.bot.command('downloadImage', { msgid });
123
- return this.toFileBoxFromResult(r);
135
+ return this.toFileFromResult(r);
124
136
  }
125
137
  if (t === types_js_1.MessageType.File || t === types_js_1.MessageType.Video || t === types_js_1.MessageType.Audio) {
126
138
  const r = await this.bot.command('downloadFile', {
@@ -129,21 +141,12 @@ class Message {
129
141
  timestamp: this.payload.timestamp,
130
142
  name: this.payload.text,
131
143
  });
132
- return this.toFileBoxFromResult(r);
144
+ return this.toFileFromResult(r);
133
145
  }
134
146
  return null;
135
147
  }
136
148
  /** {@link toFileBox} 的别名(下载本条消息的媒体字节)。 */
137
149
  async download() { return this.toFileBox(); }
138
- /* ---------------- 转发(RE 待定) ---------------- */
139
- /**
140
- * 转发本条消息到另一会话(群/单聊 conversationId, 或 Room/Contact)。
141
- * ⚠️ 未实现: 企微转发需逆向定位并冷调"转发消息"服务(见 puppet-wework 交付说明的 RE 计划)。
142
- * 当前会抛错, 以免静默失败。
143
- */
144
- async forward(_to) {
145
- throw new Error('Message.forward 未实现: 需逆向定位企微转发消息服务(ForwardMessage), 见 RE 计划');
146
- }
147
150
  toString() { return `Message<${types_js_1.MessageType[this.type()]}:${this.text().slice(0, 30)}>`; }
148
151
  }
149
152
  exports.Message = Message;