wechaty-puppet-matrix 0.0.36 → 0.0.38

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 +50 -75
  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 +51 -76
  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 +80 -92
  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 () {
@@ -751,7 +760,7 @@ class Client extends EventEmitter {
751
760
  log.error('Token info not available')
752
761
  return
753
762
  }
754
-
763
+ // @ts-ignore
755
764
  function randomRange (min: number, max: number) {
756
765
  // min最小值,max最大值
757
766
  return Math.floor(Math.random() * (max - min)) + min
@@ -760,10 +769,13 @@ class Client extends EventEmitter {
760
769
  const client = mqtt.connect(this.tokenInfo.mqServer, {
761
770
  username: this.tokenInfo.mqUser,
762
771
  password: this.tokenInfo.mqPsd,
763
- keepalive: 60,
764
- reconnectPeriod: 100,
772
+ keepalive: 120,
773
+ reconnectPeriod: 3000,
765
774
  connectTimeout: 60 * 1000,
766
- clientId: this.tokenInfo.guid + randomRange(1, 10000),
775
+ clean: true,
776
+ // @ts-ignore
777
+ family: 4,
778
+ clientId: this.tokenInfo.guid,
767
779
  })
768
780
 
769
781
  client.on('connect', () => {
@@ -917,24 +929,26 @@ class Client extends EventEmitter {
917
929
  this.emit('logout', data.errmsg)
918
930
  break
919
931
  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
- })
932
+ // @ts-ignore
933
+ // const params = {
934
+ // roomId: data.room_username,
935
+ // inviterId: data.member_list[0]?.invite_username,
936
+ // joinIds: data.member_list.map((item: any) => item.username),
937
+ // joinUsers: data.member_list.map((data: any) => ({
938
+ // wxNum: data?.alias,
939
+ // wxid: data?.username || '',
940
+ // name: data?.nickname || '',
941
+ // sex: data?.sex,
942
+ // alias: '',
943
+ // province: data?.province || '',
944
+ // city: data?.city || '',
945
+ // country: data?.country || '',
946
+ // avatar: data?.big_headimg_url || data?.small_headimg_url || '',
947
+ // description: '',
948
+ // labelIdlist: data?.labelid_list,
949
+ // })),
950
+ // }
951
+ // this.emit('room-join', params)
938
952
  break
939
953
  case NotifyTypeEnum.RoomMemberDel:
940
954
  // @ts-ignore
@@ -948,6 +962,11 @@ class Client extends EventEmitter {
948
962
  void this.restore()
949
963
  }
950
964
  break
965
+ case NotifyTypeEnum.WxNotifyTypeCmdIdModContact:
966
+ case NotifyTypeEnum.WxNotifyTypeCmdIdDelContact:
967
+ log.info('contact change sync start')
968
+ await this.syncContact(false)
969
+ break
951
970
  default:
952
971
  log.info('other data', JSON.stringify(data))
953
972
  }
@@ -1354,6 +1373,7 @@ class Client extends EventEmitter {
1354
1373
  if (contactInfo) {
1355
1374
  const contact = contactInfo.contact
1356
1375
  return {
1376
+ contactType: getContactType(contact?.userName?.string || '', contact?.bitVal, contact?.verifyFlag),
1357
1377
  wxNum: contact.alias,
1358
1378
  wxid: contact?.userName?.string || '',
1359
1379
  name: contact?.nickName?.string || '',
@@ -1365,6 +1385,8 @@ class Client extends EventEmitter {
1365
1385
  avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
1366
1386
  description: contact?.description,
1367
1387
  labelIdlist: contact?.labelIdlist,
1388
+ chatroomInfoVersion: contactInfo?.chatroomInfoVersion,
1389
+ chatroomVersion: contactInfo?.chatroomVersion,
1368
1390
  }
1369
1391
  }
1370
1392
  return undefined
@@ -1373,6 +1395,7 @@ class Client extends EventEmitter {
1373
1395
  = res.contactList?.map((contactInfo: any) => {
1374
1396
  const contact = contactInfo.contact
1375
1397
  return {
1398
+ contactType: getContactType(contact?.userName?.string || '', contact?.bitVal, contact?.verifyFlag),
1376
1399
  wxNum: contact.alias,
1377
1400
  wxid: contact?.userName?.string || '',
1378
1401
  name: contact?.nickName?.string || '',
@@ -1384,6 +1407,8 @@ class Client extends EventEmitter {
1384
1407
  avatar: contact?.bigHeadImgUrl || contact?.smallHeadImgUrl || '',
1385
1408
  description: contact?.description,
1386
1409
  labelIdlist: contact?.labelIdlist,
1410
+ chatroomInfoVersion: contactInfo?.chatroomInfoVersion,
1411
+ chatroomVersion: contactInfo?.chatroomVersion,
1387
1412
  }
1388
1413
  }) || []
1389
1414
  return contacts
@@ -1515,21 +1540,34 @@ class Client extends EventEmitter {
1515
1540
  /**
1516
1541
  * 同步联系人
1517
1542
  */
1518
- public async syncContact (): Promise<void> {
1543
+ public async syncContact (init?: boolean): Promise<void> {
1519
1544
  try {
1545
+ if (init) {
1546
+ this.lastInitSeqInfo = { contactSeq: 0, roomSeq: 0 }
1547
+ }
1520
1548
  const res = await this.postData({
1521
1549
  path: '/contact/init_contact',
1522
1550
  data: {
1523
- contact_seq: 0,
1524
- room_seq: 0,
1551
+ contact_seq: this.lastInitSeqInfo.contactSeq || 0,
1552
+ room_seq: this.lastInitSeqInfo.roomSeq || 0,
1525
1553
  },
1526
1554
  })
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 || [])
1555
+ const currentWxcontactSeq = res?.currentWxcontactSeq || 0
1556
+ const currentRoomSeq = res?.currentChatRoomContactSeq || 0
1557
+ const continueFlag = res?.continueFlag || false
1558
+ this.lastInitSeqInfo = { contactSeq: currentWxcontactSeq, roomSeq: currentRoomSeq }
1559
+ const contactUsernameList = res?.contactUsernameList || []
1560
+ if (contactUsernameList.length) {
1561
+ const contactsInfo = await this.searchContact(
1562
+ contactUsernameList,
1563
+ )
1564
+ // @ts-ignore
1565
+ this.emit('update-contacts', contactsInfo || [])
1566
+ }
1567
+
1568
+ if (continueFlag) {
1569
+ await this.syncContact()
1570
+ }
1533
1571
  } catch (e) {
1534
1572
  log.error(PRE, 'syncContact(): %s', e)
1535
1573
  }
@@ -1672,16 +1710,18 @@ class Client extends EventEmitter {
1672
1710
  },
1673
1711
  })
1674
1712
  const memeberIdList: string[]
1675
- = res?.allMemberUserNameList.map((item: any) => item.string) || []
1713
+ = res?.allMemberUserNameList?.map((item: any) => item.string) || []
1676
1714
  const allMemberCount = res.allMemberCount
1677
1715
  const ownerId = res.chatRoomOwner
1678
1716
  const adminIdList: string[]
1679
- = res?.adminUserNameList.map((item: any) => item.string) || []
1717
+ = res?.adminUserNameList?.map((item: any) => item.string) || []
1680
1718
  const memberList: ContactPayload[] = res?.newChatroomData?.chatRoomMember
1681
- .filter((item: any) => item.username)
1719
+ ?.filter((item: any) => item.userName)
1682
1720
  .map((item: any) => ({
1683
- wxid: item.username, // wxid
1684
- groupNick: item?.nickname, // 群昵称
1721
+ wxid: item.userName, // wxid
1722
+ name: item?.nickName,
1723
+ displayName: item?.displayName,
1724
+ groupNick: item?.nickName, // 群昵称
1685
1725
  avatarMinUrl: item?.smallHeadImgUrl,
1686
1726
  avatarMaxUrl: item?.bigHeadImgUrl,
1687
1727
  avatar: item?.bigHeadImgUrl || item?.smallHeadImgUrl, // 头像
@@ -1695,60 +1735,8 @@ class Client extends EventEmitter {
1695
1735
  memberList,
1696
1736
  }
1697
1737
  } 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 []
1738
+ log.error(PRE, 'getGroupMembersDetail(%s): %s', roomId, e)
1739
+ return {}
1752
1740
  }
1753
1741
  }
1754
1742
 
@@ -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
  }