wechaty-puppet-matrix 0.0.36 → 0.0.37

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 (62) hide show
  1. package/dist/cjs/src/engine-schema.d.ts +1 -0
  2. package/dist/cjs/src/engine-schema.d.ts.map +1 -1
  3. package/dist/cjs/src/matrix/events/event-room-join-no-xml.d.ts.map +1 -1
  4. package/dist/cjs/src/matrix/events/event-room-join-no-xml.js +10 -7
  5. package/dist/cjs/src/matrix/events/event-room-join.d.ts.map +1 -1
  6. package/dist/cjs/src/matrix/events/event-room-join.js +1 -1
  7. package/dist/cjs/src/matrix/events/event-room-leave.d.ts.map +1 -1
  8. package/dist/cjs/src/matrix/events/event-room-leave.js +3 -3
  9. package/dist/cjs/src/matrix/events/event-room-topic.d.ts.map +1 -1
  10. package/dist/cjs/src/matrix/events/event-room-topic.js +1 -1
  11. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -1
  12. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.js +2 -4
  13. package/dist/cjs/src/matrix/schema-mapper/contact.js +1 -1
  14. package/dist/cjs/src/matrix/service/request.d.ts +17 -4
  15. package/dist/cjs/src/matrix/service/request.d.ts.map +1 -1
  16. package/dist/cjs/src/matrix/service/request.js +45 -72
  17. package/dist/cjs/src/matrix/utils/is-type.d.ts +8 -0
  18. package/dist/cjs/src/matrix/utils/is-type.d.ts.map +1 -1
  19. package/dist/cjs/src/matrix/utils/is-type.js +25 -0
  20. package/dist/cjs/src/puppet-matrix.d.ts +3 -1
  21. package/dist/cjs/src/puppet-matrix.d.ts.map +1 -1
  22. package/dist/cjs/src/puppet-matrix.js +51 -19
  23. package/dist/cjs/src/utils/normalize-filebox.d.ts +1 -3
  24. package/dist/cjs/src/utils/normalize-filebox.d.ts.map +1 -1
  25. package/dist/cjs/src/utils/normalize-filebox.js +1 -17
  26. package/dist/esm/src/engine-schema.d.ts +1 -0
  27. package/dist/esm/src/engine-schema.d.ts.map +1 -1
  28. package/dist/esm/src/matrix/events/event-room-join-no-xml.d.ts.map +1 -1
  29. package/dist/esm/src/matrix/events/event-room-join-no-xml.js +10 -7
  30. package/dist/esm/src/matrix/events/event-room-join.d.ts.map +1 -1
  31. package/dist/esm/src/matrix/events/event-room-join.js +1 -1
  32. package/dist/esm/src/matrix/events/event-room-leave.d.ts.map +1 -1
  33. package/dist/esm/src/matrix/events/event-room-leave.js +3 -3
  34. package/dist/esm/src/matrix/events/event-room-topic.d.ts.map +1 -1
  35. package/dist/esm/src/matrix/events/event-room-topic.js +1 -1
  36. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -1
  37. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.js +2 -4
  38. package/dist/esm/src/matrix/schema-mapper/contact.js +1 -1
  39. package/dist/esm/src/matrix/service/request.d.ts +17 -4
  40. package/dist/esm/src/matrix/service/request.d.ts.map +1 -1
  41. package/dist/esm/src/matrix/service/request.js +46 -73
  42. package/dist/esm/src/matrix/utils/is-type.d.ts +8 -0
  43. package/dist/esm/src/matrix/utils/is-type.d.ts.map +1 -1
  44. package/dist/esm/src/matrix/utils/is-type.js +23 -0
  45. package/dist/esm/src/puppet-matrix.d.ts +3 -1
  46. package/dist/esm/src/puppet-matrix.d.ts.map +1 -1
  47. package/dist/esm/src/puppet-matrix.js +52 -20
  48. package/dist/esm/src/utils/normalize-filebox.d.ts +1 -3
  49. package/dist/esm/src/utils/normalize-filebox.d.ts.map +1 -1
  50. package/dist/esm/src/utils/normalize-filebox.js +1 -16
  51. package/package.json +5 -2
  52. package/src/engine-schema.ts +2 -1
  53. package/src/matrix/events/event-room-join-no-xml.ts +21 -8
  54. package/src/matrix/events/event-room-join.ts +2 -4
  55. package/src/matrix/events/event-room-leave.ts +6 -4
  56. package/src/matrix/events/event-room-topic.ts +2 -1
  57. package/src/matrix/messages/sysmsg/message-revokemsg.ts +3 -4
  58. package/src/matrix/schema-mapper/contact.ts +1 -1
  59. package/src/matrix/service/request.ts +73 -88
  60. package/src/matrix/utils/is-type.ts +34 -0
  61. package/src/puppet-matrix.ts +55 -27
  62. package/src/utils/normalize-filebox.ts +0 -24
@@ -50,8 +50,6 @@ export default async (puppet: PUPPET.Puppet, message: MessagePayload): Promise<E
50
50
  if (!isRoomId(roomId) || message.msgType !== WechatMessageType.Sys) {
51
51
  return null
52
52
  }
53
- // @ts-ignore
54
- await puppet._updateRoom(roomId)
55
53
 
56
54
  /**
57
55
  * 1. 我将别人移除
@@ -63,8 +61,11 @@ export default async (puppet: PUPPET.Puppet, message: MessagePayload): Promise<E
63
61
  YOU_REMOVE_OTHER_REGEX_LIST.some((re) => !!(matches = message.msg.match(re)))
64
62
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
65
63
  if (matches) {
64
+ // @ts-ignore
65
+ await puppet._updateRoom(roomId)
66
66
  const removerName = matches[2]!
67
- const removerId = (await puppet.roomMemberSearch(roomId, removerName))[0]!
67
+ // @ts-ignore
68
+ const removerId = await puppet._searchRoomMemberInfo(roomId, removerName)
68
69
 
69
70
  return {
70
71
  removeeIdList: [ removerId ],
@@ -88,7 +89,8 @@ export default async (puppet: PUPPET.Puppet, message: MessagePayload): Promise<E
88
89
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
89
90
  if (matches) {
90
91
  const removerName = matches[2]!
91
- const removerId = (await puppet.roomMemberSearch(roomId, removerName))[0]!
92
+ // @ts-ignore
93
+ const removerId = await puppet._searchRoomMemberInfo(roomId, removerName)
92
94
 
93
95
  return {
94
96
  removeeIdList: [ puppet.currentUserId ],
@@ -47,7 +47,8 @@ export default async (puppet: PUPPET.Puppet, message: MessagePayload): Promise<E
47
47
  const changeName = match[1]
48
48
  let changeId = ''
49
49
  if (changeName) {
50
- changeId = (await puppet.roomMemberSearch(roomId, changeName))[0]!
50
+ // @ts-ignore
51
+ changeId = await puppet._searchRoomMemberInfo(roomId, changeName)
51
52
  }
52
53
  return {
53
54
  changerId: changeId,
@@ -60,10 +60,9 @@ export async function getRevokeOriginalMessage (puppet: PUPPET.Puppet, revokemsg
60
60
 
61
61
  export async function getRevokeOperatorIdForRoomMessage (puppet: PUPPET.Puppet, revokemsgPayload:RevokeMsgMessagePayload) : Promise<string | null> {
62
62
  if (isRoomId(revokemsgPayload.session) || isIMRoomId(revokemsgPayload.session)) {
63
- const contactIdList = await puppet.roomMemberSearch(revokemsgPayload.session, revokemsgPayload.operatorNickName!)
64
- if (contactIdList.length) {
65
- return contactIdList[0]!
66
- }
63
+ // @ts-ignore
64
+ const contactId = await puppet._searchRoomMemberInfo(revokemsgPayload.session, revokemsgPayload.operatorNickName!)
65
+ return contactId
67
66
  }
68
67
 
69
68
  return null
@@ -11,7 +11,7 @@ export function engineContactToWechaty (contact?: ContactPayload): PUPPET.payloa
11
11
  gender: contact.sex, // 性别
12
12
  id: contact.wxid, // wxid
13
13
  name: contact.name, // 昵称
14
- friend: !!contact.isFriend, // 是否是好友
14
+ friend: contact.contactType === 2 || !!contact.isFriend, // 是否是好友
15
15
  phone: [],
16
16
  province: contact.province,
17
17
  signature: contact.sign, // 签名
@@ -6,7 +6,7 @@ import WebSocket from 'ws'
6
6
  import * as PUPPET from '@juzi/wechaty-puppet'
7
7
  import { format, getUnixTime } from 'date-fns'
8
8
  import { xmlToJson } from '../utils/xml-to-json.js'
9
- import { isRoomId } from '../utils/is-type.js'
9
+ import { isRoomId, getContactType } from '../utils/is-type.js'
10
10
  import imageSize from 'image-size'
11
11
  import fs from 'fs-extra'
12
12
  import os from 'os'
@@ -45,7 +45,12 @@ export enum NotifyTypeEnum {
45
45
  RoomMemberAdd = 1046, // set
46
46
  RoomMemberUpdate = 1047,
47
47
  RoomMemberDel = 1048, // set
48
- SyncMsgFailed = 2006 // 需要调用 restore 接口
48
+ SyncMsgFailed = 2006, // 需要调用 restore 接口
49
+ WxNotifyTypeCmdIdModContact = 1200,
50
+ WxNotifyTypeCmdIdDelContact = 1201,
51
+ WxNotifyTypeOpenImContactAdd = 1202,
52
+ WxNotifyTypeOpenImContactDel = 1203,
53
+ WxNotifyTypeOpenImRoomContactChange = 1204,
49
54
  }
50
55
 
51
56
  /**
@@ -173,6 +178,8 @@ export interface ContactPayload {
173
178
  * 群公告
174
179
  */
175
180
  announcement?: string;
181
+ chatroomVersion?: number;
182
+ chatroomInfoVersion?: number;
176
183
  }
177
184
 
178
185
  /**
@@ -650,6 +657,7 @@ class Client extends EventEmitter {
650
657
  server: any
651
658
  tokenInfo: any
652
659
  hasEmitLogout: boolean
660
+ private lastInitSeqInfo: { contactSeq: number; roomSeq: number; }
653
661
 
654
662
  // @ts-ignore
655
663
  override emit(event: 'hook', detail: BaseEvent): boolean;
@@ -684,6 +692,7 @@ class Client extends EventEmitter {
684
692
  this.restoreTimes = 0
685
693
  this.maxRestoreTimes = 1
686
694
  this.hasExpired = false
695
+ this.lastInitSeqInfo = { contactSeq: 0, roomSeq: 0 }
687
696
  }
688
697
 
689
698
  destroy () {
@@ -917,24 +926,26 @@ class Client extends EventEmitter {
917
926
  this.emit('logout', data.errmsg)
918
927
  break
919
928
  case NotifyTypeEnum.RoomMemberAdd:
920
- this.emit('room-join', {
921
- roomId: data.room_username,
922
- inviterId: data.member_list[0]?.invite_username,
923
- joinIds: data.member_list.map((item: any) => item.username),
924
- joinUsers: data.member_list.map((data: any) => ({
925
- wxNum: data?.alias,
926
- wxid: data?.username || '',
927
- name: data?.nickname || '',
928
- sex: data?.sex,
929
- alias: '',
930
- province: data?.province || '',
931
- city: data?.city || '',
932
- country: data?.country || '',
933
- avatar: data?.big_headimg_url || data?.small_headimg_url || '',
934
- description: '',
935
- labelIdlist: data?.labelid_list,
936
- })),
937
- })
929
+ // @ts-ignore
930
+ // const params = {
931
+ // roomId: data.room_username,
932
+ // inviterId: data.member_list[0]?.invite_username,
933
+ // joinIds: data.member_list.map((item: any) => item.username),
934
+ // joinUsers: data.member_list.map((data: any) => ({
935
+ // wxNum: data?.alias,
936
+ // wxid: data?.username || '',
937
+ // name: data?.nickname || '',
938
+ // sex: data?.sex,
939
+ // alias: '',
940
+ // province: data?.province || '',
941
+ // city: data?.city || '',
942
+ // country: data?.country || '',
943
+ // avatar: data?.big_headimg_url || data?.small_headimg_url || '',
944
+ // description: '',
945
+ // labelIdlist: data?.labelid_list,
946
+ // })),
947
+ // }
948
+ // this.emit('room-join', params)
938
949
  break
939
950
  case NotifyTypeEnum.RoomMemberDel:
940
951
  // @ts-ignore
@@ -948,6 +959,11 @@ class Client extends EventEmitter {
948
959
  void this.restore()
949
960
  }
950
961
  break
962
+ case NotifyTypeEnum.WxNotifyTypeCmdIdModContact:
963
+ case NotifyTypeEnum.WxNotifyTypeCmdIdDelContact:
964
+ log.info('contact change sync start')
965
+ await this.syncContact(false)
966
+ break
951
967
  default:
952
968
  log.info('other data', JSON.stringify(data))
953
969
  }
@@ -1354,6 +1370,7 @@ class Client extends EventEmitter {
1354
1370
  if (contactInfo) {
1355
1371
  const contact = contactInfo.contact
1356
1372
  return {
1373
+ contactType: getContactType(contact?.userName?.string || '', contact?.bitVal, contact?.verifyFlag),
1357
1374
  wxNum: contact.alias,
1358
1375
  wxid: contact?.userName?.string || '',
1359
1376
  name: contact?.nickName?.string || '',
@@ -1365,6 +1382,8 @@ class Client extends EventEmitter {
1365
1382
  avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
1366
1383
  description: contact?.description,
1367
1384
  labelIdlist: contact?.labelIdlist,
1385
+ chatroomInfoVersion: contactInfo?.chatroomInfoVersion,
1386
+ chatroomVersion: contactInfo?.chatroomVersion,
1368
1387
  }
1369
1388
  }
1370
1389
  return undefined
@@ -1373,6 +1392,7 @@ class Client extends EventEmitter {
1373
1392
  = res.contactList?.map((contactInfo: any) => {
1374
1393
  const contact = contactInfo.contact
1375
1394
  return {
1395
+ contactType: getContactType(contact?.userName?.string || '', contact?.bitVal, contact?.verifyFlag),
1376
1396
  wxNum: contact.alias,
1377
1397
  wxid: contact?.userName?.string || '',
1378
1398
  name: contact?.nickName?.string || '',
@@ -1384,6 +1404,8 @@ class Client extends EventEmitter {
1384
1404
  avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
1385
1405
  description: contact?.description,
1386
1406
  labelIdlist: contact?.labelIdlist,
1407
+ chatroomInfoVersion: contactInfo?.chatroomInfoVersion,
1408
+ chatroomVersion: contactInfo?.chatroomVersion,
1387
1409
  }
1388
1410
  }) || []
1389
1411
  return contacts
@@ -1515,21 +1537,34 @@ class Client extends EventEmitter {
1515
1537
  /**
1516
1538
  * 同步联系人
1517
1539
  */
1518
- public async syncContact (): Promise<void> {
1540
+ public async syncContact (init?: boolean): Promise<void> {
1519
1541
  try {
1542
+ if (init) {
1543
+ this.lastInitSeqInfo = { contactSeq: 0, roomSeq: 0 }
1544
+ }
1520
1545
  const res = await this.postData({
1521
1546
  path: '/contact/init_contact',
1522
1547
  data: {
1523
- contact_seq: 0,
1524
- room_seq: 0,
1548
+ contact_seq: this.lastInitSeqInfo.contactSeq || 0,
1549
+ room_seq: this.lastInitSeqInfo.roomSeq || 0,
1525
1550
  },
1526
1551
  })
1527
- const contactUsernameList = res.contactUsernameList || []
1528
- const contactsInfo: ContactPayload[] = (await this.searchContact(
1529
- contactUsernameList,
1530
- )) as ContactPayload[]
1531
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1532
- this.emit('update-contacts', contactsInfo || [])
1552
+ const currentWxcontactSeq = res?.currentWxcontactSeq || 0
1553
+ const currentRoomSeq = res?.currentChatRoomContactSeq || 0
1554
+ const continueFlag = res?.continueFlag || false
1555
+ this.lastInitSeqInfo = { contactSeq: currentWxcontactSeq, roomSeq: currentRoomSeq }
1556
+ const contactUsernameList = res?.contactUsernameList || []
1557
+ if (contactUsernameList.length) {
1558
+ const contactsInfo = await this.searchContact(
1559
+ contactUsernameList,
1560
+ )
1561
+ // @ts-ignore
1562
+ this.emit('update-contacts', contactsInfo || [])
1563
+ }
1564
+
1565
+ if (continueFlag) {
1566
+ await this.syncContact()
1567
+ }
1533
1568
  } catch (e) {
1534
1569
  log.error(PRE, 'syncContact(): %s', e)
1535
1570
  }
@@ -1672,16 +1707,18 @@ class Client extends EventEmitter {
1672
1707
  },
1673
1708
  })
1674
1709
  const memeberIdList: string[]
1675
- = res?.allMemberUserNameList.map((item: any) => item.string) || []
1710
+ = res?.allMemberUserNameList?.map((item: any) => item.string) || []
1676
1711
  const allMemberCount = res.allMemberCount
1677
1712
  const ownerId = res.chatRoomOwner
1678
1713
  const adminIdList: string[]
1679
- = res?.adminUserNameList.map((item: any) => item.string) || []
1714
+ = res?.adminUserNameList?.map((item: any) => item.string) || []
1680
1715
  const memberList: ContactPayload[] = res?.newChatroomData?.chatRoomMember
1681
- .filter((item: any) => item.username)
1716
+ ?.filter((item: any) => item.userName)
1682
1717
  .map((item: any) => ({
1683
- wxid: item.username, // wxid
1684
- groupNick: item?.nickname, // 群昵称
1718
+ wxid: item.userName, // wxid
1719
+ name: item?.nickName,
1720
+ displayName: item?.displayName,
1721
+ groupNick: item?.nickName, // 群昵称
1685
1722
  avatarMinUrl: item?.smallHeadImgUrl,
1686
1723
  avatarMaxUrl: item?.bigHeadImgUrl,
1687
1724
  avatar: item?.bigHeadImgUrl || item?.smallHeadImgUrl, // 头像
@@ -1695,60 +1732,8 @@ class Client extends EventEmitter {
1695
1732
  memberList,
1696
1733
  }
1697
1734
  } catch (e) {
1698
- log.error(PRE, 'getGroupMembers(%s): %s', roomId, e)
1699
- return []
1700
- }
1701
- }
1702
-
1703
- /**
1704
- * 获取群成员列表
1705
- * @param roomId 群id
1706
- * @param page
1707
- * @param pageSize
1708
- */
1709
- public async getGroupMembers (
1710
- roomId: string,
1711
- page: number = 1,
1712
- pageSize: number = 100,
1713
- ): Promise<ContactPayload[]> {
1714
- try {
1715
- const res = await this.postData({
1716
- path: '/room/get_chatroom_members',
1717
- data: {
1718
- room_username: roomId,
1719
- page_num: page,
1720
- page_size: pageSize,
1721
- },
1722
- })
1723
-
1724
- const totalPage = res.total_page || 1
1725
- const memberList = res.room_list
1726
- .filter((item: any) => item.username)
1727
- .map((item: any) => ({
1728
- wxid: item.username, // wxid
1729
- groupNick: item?.nickname, // 群昵称
1730
- avatarMinUrl: item?.small_headimg_url,
1731
- avatarMaxUrl: item?.big_headimg_url,
1732
- avatar: item?.big_headimg_url || item?.small_headimg_url, // 头像
1733
- inviterUserName: item?.invite_username, // 邀请人
1734
- country: item?.country,
1735
- province: item?.province,
1736
- city: item?.city,
1737
- displayName: item?.display_name, // 群备注
1738
- sex: item?.sex,
1739
- wxNum: item?.alias,
1740
- alias: item?.remark,
1741
- }))
1742
-
1743
- if (page < totalPage) {
1744
- const nextPageContacts = await this.getGroupMembers(roomId, page + 1, pageSize)
1745
- return memberList.concat(nextPageContacts)
1746
- } else {
1747
- return memberList
1748
- }
1749
- } catch (e) {
1750
- log.error(PRE, 'getGroupMembers(%s): %s', roomId, e)
1751
- return []
1735
+ log.error(PRE, 'getGroupMembersDetail(%s): %s', roomId, e)
1736
+ return {}
1752
1737
  }
1753
1738
  }
1754
1739
 
@@ -70,3 +70,37 @@ export function isPayload (payload?: object): boolean {
70
70
  }
71
71
  return false
72
72
  }
73
+
74
+ export enum ContactType {
75
+ Stranger = 0,
76
+ System = 1,
77
+ Friend = 2,
78
+ Mp = 3,
79
+ ChatRoom = 4
80
+ }
81
+
82
+ export function getContactType (username: string, bitVal = 0, verifyFlag = 0) {
83
+
84
+ // 是群聊
85
+ if (username.includes('@chatroom')) {
86
+ return ContactType.ChatRoom
87
+ }
88
+
89
+ // 是公众号
90
+ if (verifyFlag !== 0) {
91
+ return ContactType.Mp
92
+ }
93
+
94
+ // 是系统账号
95
+ if (officeWxid.includes(username)) {
96
+ return ContactType.System
97
+ }
98
+
99
+ // 是好友
100
+ if ((bitVal & 1) === 1) {
101
+ return ContactType.Friend
102
+ }
103
+
104
+ // 陌生人
105
+ return ContactType.Stranger
106
+ }
@@ -10,7 +10,7 @@ import type { FileBoxMetadataMessage } from './matrix/types.js'
10
10
  import Client from './matrix/service/request.js'
11
11
  import { getUnixTime } from 'date-fns'
12
12
 
13
- import { delay, mergeWithFallback } from './matrix/utils/index.js'
13
+ import { mergeWithFallback } from './matrix/utils/index.js'
14
14
  import path from 'path'
15
15
  // 参考
16
16
  import { CacheManager, RoomMemberMap } from './matrix/cache-manager.js'
@@ -144,15 +144,6 @@ class PuppetMatrix extends PUPPET.Puppet {
144
144
  removerId: this._self?.wxid,
145
145
  timestamp: getUnixTime(Date.now()),
146
146
  }
147
- for (const leaveId of leaveIds) {
148
- await this._cacheMgr?.deleteSingleRoomMember(roomId, leaveId)
149
- const roomInfo = await this._cacheMgr?.getRoom(roomId)
150
- if (roomInfo && roomInfo.chatroommemberList) {
151
- roomInfo.chatroommemberList = roomInfo.chatroommemberList.filter(member => member !== leaveId)
152
- await this._cacheMgr?.setRoom(roomId, roomInfo)
153
- }
154
- }
155
-
156
147
  this.emit('room-leave', payload)
157
148
  }))
158
149
  this._client.on('room-join', this.wrapAsync(async ({ roomId, inviterId, joinIds, joinUsers }: { roomId: string, inviterId: string, joinIds: string[], joinUsers: ContactPayload[] }) => {
@@ -415,12 +406,10 @@ class PuppetMatrix extends PUPPET.Puppet {
415
406
  public async ready (): Promise<void> {
416
407
  try {
417
408
  await this._client?.getContactList(1, 100)
418
- await this._client?.getOpenImContactList(1, 100)
419
- await delay(2000)
420
409
  await this._client?.getGroupList(1, 100)
421
- await delay(2000)
410
+ await this._client?.getOpenImContactList(1, 100)
422
411
  await this._client?.getOfficeList(1, 100)
423
-
412
+ await this.syncContact(true)
424
413
  log.silly(PRE, 'on ready')
425
414
 
426
415
  setTimeout(() => {
@@ -1273,6 +1262,22 @@ class PuppetMatrix extends PUPPET.Puppet {
1273
1262
  }
1274
1263
  }
1275
1264
 
1265
+ // @ts-ignore
1266
+ private async _searchRoomMemberInfo (roomId: string, name: string): Promise<string | undefined> {
1267
+ const localRes = await this.roomMemberSearch(roomId, name)
1268
+ if (localRes.length > 0) {
1269
+ return localRes[0]
1270
+ }
1271
+ const roomMemberMap = await this._getRoomMemberList(roomId)
1272
+ const searchMember = Object.values(roomMemberMap).find((member: ContactPayload) => {
1273
+ if (member.name === name || member.alias === name || member.remark === name || member.displayName === name) {
1274
+ return true
1275
+ }
1276
+ return false
1277
+ })
1278
+ return searchMember?.wxid || ''
1279
+ }
1280
+
1276
1281
  /**
1277
1282
  * 解析群成员信息
1278
1283
  * @param rawPayload
@@ -1446,7 +1451,8 @@ class PuppetMatrix extends PUPPET.Puppet {
1446
1451
 
1447
1452
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1448
1453
  if (!ret || (ret && !Object.keys(ret).length) || force) {
1449
- const resMembers = await this._client?.getGroupMembers(roomId) || []
1454
+ const roomMemberDetail = await this._client?.getGroupMembersDetail(roomId)
1455
+ const resMembers = roomMemberDetail?.memberList || []
1450
1456
 
1451
1457
  const roomMemberMap: RoomMemberMap = {}
1452
1458
  for (const roomMember of resMembers) {
@@ -1459,6 +1465,7 @@ class PuppetMatrix extends PUPPET.Puppet {
1459
1465
  roomMemberMap[roomMember.wxid] = MemberInfo
1460
1466
  } else {
1461
1467
  MemberInfo = await this._cacheMgr!.getContact(roomMember.wxid) as ContactPayload
1468
+ MemberInfo = mergeWithFallback(MemberInfo, roomMember)
1462
1469
  roomMemberMap[roomMember.wxid] = MemberInfo
1463
1470
  }
1464
1471
  }
@@ -1534,7 +1541,6 @@ class PuppetMatrix extends PUPPET.Puppet {
1534
1541
 
1535
1542
  if (isRoomId(contact.wxid)) {
1536
1543
  const oldRoomPayload = await this._cacheMgr!.getRoom(contact.wxid)
1537
-
1538
1544
  const roomId = contact.wxid
1539
1545
  let finalPayload: ContactPayload = contact
1540
1546
  if (oldRoomPayload) {
@@ -1644,7 +1650,6 @@ class PuppetMatrix extends PUPPET.Puppet {
1644
1650
  }
1645
1651
  case EventType.RoomJoin: {
1646
1652
  const roomJoin: PUPPET.payloads.EventRoomJoin = event.payload
1647
- await this._updateRoomMember(roomJoin.roomId)
1648
1653
  for (const joinId of roomJoin.inviteeIdList) {
1649
1654
  if (this._roomJoinTemp[`${roomJoin.roomId}-${joinId}`]) {
1650
1655
  roomJoin.inviteeIdList = roomJoin.inviteeIdList.filter(id => id !== joinId)
@@ -1660,22 +1665,49 @@ class PuppetMatrix extends PUPPET.Puppet {
1660
1665
  break
1661
1666
  }
1662
1667
  case EventType.RoomLeave: {
1663
- // const roomLeave: PUPPET.payloads.EventRoomLeave = event.payload
1664
- // this.emit('room-leave', roomLeave)
1665
-
1666
- // await this._updateRoomMember(roomLeave.roomId)
1668
+ const roomLeave: PUPPET.payloads.EventRoomLeave = event.payload
1669
+ this.emit('room-leave', roomLeave)
1667
1670
  break
1668
1671
  }
1669
1672
  case EventType.RoomTopic: {
1670
1673
  const roomTopic: PUPPET.payloads.EventRoomTopic = event.payload
1671
1674
  this.emit('room-topic', roomTopic)
1675
+ await this._refreshContact(roomTopic.roomId)
1672
1676
  break
1673
1677
  }
1674
1678
  }
1675
1679
  }
1676
1680
 
1681
+ private async _refreshRoomInfo (roomId: string): Promise<ContactPayload | undefined> {
1682
+ const roomDetail = await this._client?.searchContact([ roomId ]) as ContactPayload | undefined
1683
+ if (roomDetail && roomDetail.wxid) {
1684
+ await this._updateContactCache(roomDetail as ContactPayload)
1685
+ return roomDetail
1686
+ }
1687
+ return {
1688
+ wxNum: '',
1689
+ wxid: roomId || '',
1690
+ name: '',
1691
+ sex: 0,
1692
+ alias: '',
1693
+ province: '',
1694
+ city: '',
1695
+ country: '',
1696
+ avatar: '',
1697
+ description: '',
1698
+ labelIdlist: '',
1699
+ scene: '',
1700
+ sign: '',
1701
+ snsBgImg: '',
1702
+ }
1703
+ }
1704
+
1677
1705
  // 刷新用户信息
1678
1706
  private async _refreshContact (wxid: string, isFriend?: number): Promise<ContactPayload | undefined> {
1707
+ if (isRoomId(wxid)) {
1708
+ const res = await this._refreshRoomInfo(wxid)
1709
+ return res
1710
+ }
1679
1711
  const contact = await this._client?.searchContactDetail([ wxid ]) as ContactPayload | undefined
1680
1712
  // may return contact with empty payload, empty username, nickname, etc.
1681
1713
  if (contact && !contact.wxid) {
@@ -1790,16 +1822,12 @@ class PuppetMatrix extends PUPPET.Puppet {
1790
1822
  }
1791
1823
 
1792
1824
  // @ts-ignore
1793
- public async syncContact () {
1825
+ public async syncContact (init?: boolean) {
1794
1826
  if (!this.currentUserId) {
1795
1827
  throw new Error('Can not sync contact before login')
1796
1828
  }
1797
1829
  log.info('syncContact')
1798
- await this._client!.syncContact()
1799
- await this._client?.getGroupList(1, 100)
1800
- await this._client?.getContactList(1, 100)
1801
- await this._client?.getOpenImContactList(1, 100)
1802
- await this._client?.getOfficeList(1, 100)
1830
+ await this._client!.syncContact(init)
1803
1831
  }
1804
1832
 
1805
1833
  }
@@ -1,6 +1,3 @@
1
- import type {
2
- FileBox,
3
- } from 'file-box'
4
1
  import {
5
2
  FileBoxType,
6
3
  FileBoxInterface,
@@ -64,27 +61,6 @@ const canPassthrough = (fileBox: FileBoxInterface) => {
64
61
 
65
62
  }
66
63
 
67
- const normalizeFileBoxUuid = (FileBoxUuid: typeof FileBox) => async (fileBox: FileBoxInterface) => {
68
- if (canPassthrough(fileBox)) {
69
- return fileBox
70
- }
71
-
72
- const stream = await fileBox.toStream()
73
-
74
- const uuid = await FileBoxUuid
75
- .fromStream(stream, fileBox.name)
76
- .toUuid()
77
-
78
- const uuidFileBox = FileBoxUuid.fromUuid(uuid, {
79
- md5 : fileBox.md5,
80
- name : fileBox.name,
81
- size : fileBox.size,
82
- })
83
-
84
- return uuidFileBox
85
- }
86
-
87
64
  export {
88
65
  canPassthrough,
89
- normalizeFileBoxUuid,
90
66
  }