wechaty-puppet-matrix 0.0.35 → 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 (69) 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 +8 -0
  4. package/dist/cjs/src/matrix/events/event-room-join-no-xml.d.ts.map +1 -0
  5. package/dist/cjs/src/matrix/events/event-room-join-no-xml.js +125 -0
  6. package/dist/cjs/src/matrix/events/event-room-join.d.ts.map +1 -1
  7. package/dist/cjs/src/matrix/events/event-room-join.js +1 -0
  8. package/dist/cjs/src/matrix/events/event-room-leave.d.ts.map +1 -1
  9. package/dist/cjs/src/matrix/events/event-room-leave.js +3 -3
  10. package/dist/cjs/src/matrix/events/event-room-topic.d.ts.map +1 -1
  11. package/dist/cjs/src/matrix/events/event-room-topic.js +1 -1
  12. package/dist/cjs/src/matrix/events/mod.d.ts.map +1 -1
  13. package/dist/cjs/src/matrix/events/mod.js +2 -0
  14. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -1
  15. package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.js +2 -4
  16. package/dist/cjs/src/matrix/schema-mapper/contact.js +1 -1
  17. package/dist/cjs/src/matrix/service/request.d.ts +17 -4
  18. package/dist/cjs/src/matrix/service/request.d.ts.map +1 -1
  19. package/dist/cjs/src/matrix/service/request.js +45 -72
  20. package/dist/cjs/src/matrix/utils/is-type.d.ts +8 -0
  21. package/dist/cjs/src/matrix/utils/is-type.d.ts.map +1 -1
  22. package/dist/cjs/src/matrix/utils/is-type.js +25 -0
  23. package/dist/cjs/src/puppet-matrix.d.ts +3 -1
  24. package/dist/cjs/src/puppet-matrix.d.ts.map +1 -1
  25. package/dist/cjs/src/puppet-matrix.js +51 -19
  26. package/dist/cjs/src/utils/normalize-filebox.d.ts +1 -3
  27. package/dist/cjs/src/utils/normalize-filebox.d.ts.map +1 -1
  28. package/dist/cjs/src/utils/normalize-filebox.js +1 -17
  29. package/dist/esm/src/engine-schema.d.ts +1 -0
  30. package/dist/esm/src/engine-schema.d.ts.map +1 -1
  31. package/dist/esm/src/matrix/events/event-room-join-no-xml.d.ts +8 -0
  32. package/dist/esm/src/matrix/events/event-room-join-no-xml.d.ts.map +1 -0
  33. package/dist/esm/src/matrix/events/event-room-join-no-xml.js +122 -0
  34. package/dist/esm/src/matrix/events/event-room-join.d.ts.map +1 -1
  35. package/dist/esm/src/matrix/events/event-room-join.js +1 -0
  36. package/dist/esm/src/matrix/events/event-room-leave.d.ts.map +1 -1
  37. package/dist/esm/src/matrix/events/event-room-leave.js +3 -3
  38. package/dist/esm/src/matrix/events/event-room-topic.d.ts.map +1 -1
  39. package/dist/esm/src/matrix/events/event-room-topic.js +1 -1
  40. package/dist/esm/src/matrix/events/mod.d.ts.map +1 -1
  41. package/dist/esm/src/matrix/events/mod.js +2 -0
  42. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -1
  43. package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.js +2 -4
  44. package/dist/esm/src/matrix/schema-mapper/contact.js +1 -1
  45. package/dist/esm/src/matrix/service/request.d.ts +17 -4
  46. package/dist/esm/src/matrix/service/request.d.ts.map +1 -1
  47. package/dist/esm/src/matrix/service/request.js +46 -73
  48. package/dist/esm/src/matrix/utils/is-type.d.ts +8 -0
  49. package/dist/esm/src/matrix/utils/is-type.d.ts.map +1 -1
  50. package/dist/esm/src/matrix/utils/is-type.js +23 -0
  51. package/dist/esm/src/puppet-matrix.d.ts +3 -1
  52. package/dist/esm/src/puppet-matrix.d.ts.map +1 -1
  53. package/dist/esm/src/puppet-matrix.js +52 -20
  54. package/dist/esm/src/utils/normalize-filebox.d.ts +1 -3
  55. package/dist/esm/src/utils/normalize-filebox.d.ts.map +1 -1
  56. package/dist/esm/src/utils/normalize-filebox.js +1 -16
  57. package/package.json +5 -2
  58. package/src/engine-schema.ts +2 -1
  59. package/src/matrix/events/event-room-join-no-xml.ts +178 -0
  60. package/src/matrix/events/event-room-join.ts +2 -1
  61. package/src/matrix/events/event-room-leave.ts +6 -4
  62. package/src/matrix/events/event-room-topic.ts +2 -1
  63. package/src/matrix/events/mod.ts +2 -0
  64. package/src/matrix/messages/sysmsg/message-revokemsg.ts +3 -4
  65. package/src/matrix/schema-mapper/contact.ts +1 -1
  66. package/src/matrix/service/request.ts +73 -88
  67. package/src/matrix/utils/is-type.ts +34 -0
  68. package/src/puppet-matrix.ts +55 -27
  69. package/src/utils/normalize-filebox.ts +0 -24
@@ -0,0 +1,178 @@
1
+ import type { MessagePayload } from '../../engine-schema.js'
2
+ import type * as PUPPET from '@juzi/wechaty-puppet'
3
+ import { isRoomId } from '../utils/is-type.js'
4
+ import type { EventPayload } from './event.js'
5
+ import { WechatMessageType } from '../types.js'
6
+
7
+ const YOU_INVITE_OTHER_REGEX_LIST = [
8
+ /^你邀请"(.+)"加入了群聊 {2}/,
9
+ /^You invited (.+) to the group chat/,
10
+ ]
11
+ const OTHER_INVITE_YOU_REGEX_LIST = [
12
+ /^"([^"]+?)"邀请你加入了群聊,群聊参与人还有:(.+)/,
13
+ /^(.+) invited you to a group chat with (.+)/,
14
+ ]
15
+ const OTHER_INVITE_YOU_AND_OTHER_REGEX_LIST = [
16
+ /^"([^"]+?)"邀请你和"(.+?)"加入了群聊/,
17
+ /^(.+?) invited you and (.+?) to (the|a) group chat/,
18
+ ]
19
+ const OTHER_INVITE_OTHER_REGEX_LIST = [
20
+ /^"(.+)"邀请"(.+)"加入了群聊/,
21
+ /^(.+?) invited (.+?) to (the|a) group chat/,
22
+ ]
23
+ const OTHER_JOIN_VIA_YOUR_QRCODE_REGEX_LIST = [
24
+ /^"?(.+)"通过扫描你分享的二维码加入群聊/,
25
+ /^"?(.+)" joined group chat via the QR code you shared/,
26
+ ]
27
+ const OTHER_JOIN_VIA_OTHER_QRCODE_REGEX_LIST = [
28
+ /^"(.+)"通过扫描"(.+)"分享的二维码加入群聊/,
29
+ /^"(.+)" joined the group chat via the QR Code shared by "(.+)"/,
30
+ ]
31
+
32
+ export type Runner<T> = () => Promise<T | null>;
33
+
34
+ export async function executeRunners<T> (runners: Runner<T>[]): Promise<T | null> {
35
+ for (const runner of runners) {
36
+ const ret = await runner()
37
+ if (ret) {
38
+ return ret
39
+ }
40
+ }
41
+
42
+ return null
43
+ }
44
+
45
+ export default async (puppet: PUPPET.Puppet, message: MessagePayload): Promise<EventPayload> => {
46
+ const roomId = message.fromWxid || ''
47
+ if (!isRoomId(roomId)) {
48
+ return null
49
+ }
50
+
51
+ const timestamp = message.timeStamp
52
+ // 都是系统消息
53
+ if (message.msgType !== WechatMessageType.Sys && message.msgType !== WechatMessageType.SysTemplate) {
54
+ return null
55
+ }
56
+
57
+ /**
58
+ * 1. You Invite Other to join the Room
59
+ * (including other join var qr code you shared)
60
+ * /^你邀请"(.+)"加入了群聊 {2}\$revoke\$/,
61
+ * /^" ?(.+)"通过扫描你分享的二维码加入群聊/,
62
+ */
63
+ const youInviteOther = async () => {
64
+ let matches: null | string[] = null;
65
+ [ ...YOU_INVITE_OTHER_REGEX_LIST, ...OTHER_JOIN_VIA_YOUR_QRCODE_REGEX_LIST ].some((re) => !!(matches = message.msg.match(re)))
66
+
67
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
68
+ if (matches) {
69
+ // @ts-ignore
70
+ await puppet._updateRoom(roomId)
71
+ const inviteName = matches[1]!
72
+ // @ts-ignore
73
+ const inviteeId = await puppet._searchRoomMemberInfo(roomId, inviteName)
74
+
75
+ return {
76
+ inviteeIdList: [ inviteeId ],
77
+ inviterId: puppet.currentUserId,
78
+ roomId,
79
+ timestamp,
80
+ } as PUPPET.payloads.EventRoomJoin
81
+ }
82
+ return null
83
+ }
84
+
85
+ /**
86
+ * 2. Other Invite you to join the Room
87
+ * /^"([^"]+?)"邀请你加入了群聊/,
88
+ */
89
+ const otherInviteYou = async () => {
90
+ let matches: null | string[] = null
91
+ OTHER_INVITE_YOU_REGEX_LIST.some((re) => !!(matches = message.msg.match(re)))
92
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
93
+ if (matches) {
94
+ // @ts-ignore
95
+ await puppet._updateRoom(roomId)
96
+ const inviteName = matches[1]!
97
+ // @ts-ignore
98
+ const inviterId = await puppet._searchRoomMemberInfo(roomId, inviteName)
99
+
100
+ return {
101
+ inviteeIdList: [ puppet.currentUserId ],
102
+ inviterId,
103
+ roomId,
104
+ timestamp,
105
+ } as PUPPET.payloads.EventRoomJoin
106
+ }
107
+ return null
108
+ }
109
+
110
+ /**
111
+ * 3. Other invite you and others to join the room
112
+ * /^"([^"]+?)"邀请你和"(.+?)"加入了群聊/,
113
+ * /^"(.+)"邀请"(.+)"加入了群聊/,
114
+ */
115
+ const otherInviteOther = async () => {
116
+ let matches: null | string[] = null;
117
+ [ ...OTHER_INVITE_YOU_AND_OTHER_REGEX_LIST, ...OTHER_INVITE_OTHER_REGEX_LIST ].some((re) => !!(matches = message.msg.match(re)))
118
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
119
+ if (matches) {
120
+ // @ts-ignore
121
+ await puppet._updateRoom(roomId)
122
+ const inviteeIdList = []
123
+ const inviterName = matches[1]
124
+ // @ts-ignore
125
+ const inviterId = await puppet._searchRoomMemberInfo(roomId, inviterName)
126
+ const inviteeName = matches[2]
127
+ // @ts-ignore
128
+ const inviteeId = await puppet._searchRoomMemberInfo(roomId, inviteeName)
129
+
130
+ // 如果包含ni则把机器人的id放进去
131
+ if (message.msg.includes('你')) {
132
+ inviteeIdList.push(puppet.currentUserId)
133
+ }
134
+ inviteeIdList.push(inviteeId)
135
+ return {
136
+ inviteeIdList,
137
+ inviterId,
138
+ roomId,
139
+ timestamp,
140
+ } as PUPPET.payloads.EventRoomJoin
141
+ }
142
+ return null
143
+ }
144
+
145
+ /**
146
+ * 4. Other Invite Other via Qrcode to join a Room
147
+ * /^" (.+)"通过扫描"(.+)"分享的二维码加入群聊/,
148
+ */
149
+ const otherJoinViaQrCode = async () => {
150
+ let matches: null | string[] = null
151
+ OTHER_JOIN_VIA_OTHER_QRCODE_REGEX_LIST.some((re) => !!(matches = message.msg.match(re)))
152
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
153
+ if (matches) {
154
+ // @ts-ignore
155
+ await puppet._updateRoom(roomId)
156
+ const inviteeIdList = []
157
+
158
+ const inviteeName = matches[1]!
159
+ // @ts-ignore
160
+ const inviteeId = await puppet._searchRoomMemberInfo(roomId, inviteeName)
161
+ inviteeIdList.push(inviteeId)
162
+
163
+ const inviterName = matches[2]
164
+ // @ts-ignore
165
+ const inviterId = await puppet._searchRoomMemberInfo(roomId, inviterName)
166
+ return {
167
+ inviteeIdList,
168
+ inviterId,
169
+ roomId,
170
+ timestamp,
171
+ } as PUPPET.payloads.EventRoomJoin
172
+ }
173
+ return null
174
+ }
175
+ const ret = await executeRunners([ youInviteOther, otherInviteYou, otherInviteOther, otherJoinViaQrCode ])
176
+
177
+ return ret
178
+ }
@@ -119,7 +119,8 @@ export default async (puppet: PUPPET.Puppet, message: MessagePayload): Promise<E
119
119
  if (!matches) {
120
120
  return null
121
121
  }
122
-
122
+ // @ts-ignore
123
+ await puppet._updateRoom(roomId)
123
124
  const checkString = (inviteeIdList: string | string[]) => {
124
125
  return typeof inviteeIdList !== 'string'
125
126
  ? inviteeIdList
@@ -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,
@@ -4,10 +4,12 @@ import roomJoinParser from './event-room-join.js'
4
4
  import roomLeaveParser from './event-room-leave.js'
5
5
  import roomTopicParser from './event-room-topic.js'
6
6
  import messageParser from './event-message.js'
7
+ import roomJoinNoXmlParser from './event-room-join-no-xml.js'
7
8
  import { addEventParser, EventType, parseEvent } from './event.js'
8
9
 
9
10
  addEventParser(EventType.Friendship, friendShipParser)
10
11
  addEventParser(EventType.RoomInvite, roomInviteParser)
12
+ addEventParser(EventType.RoomJoin, roomJoinNoXmlParser)
11
13
  addEventParser(EventType.RoomJoin, roomJoinParser)
12
14
  addEventParser(EventType.RoomLeave, roomLeaveParser)
13
15
  addEventParser(EventType.RoomTopic, roomTopicParser)
@@ -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
+ }