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.
- package/dist/cjs/src/engine-schema.d.ts +1 -0
- package/dist/cjs/src/engine-schema.d.ts.map +1 -1
- package/dist/cjs/src/matrix/events/event-room-join-no-xml.d.ts +8 -0
- package/dist/cjs/src/matrix/events/event-room-join-no-xml.d.ts.map +1 -0
- package/dist/cjs/src/matrix/events/event-room-join-no-xml.js +125 -0
- package/dist/cjs/src/matrix/events/event-room-join.d.ts.map +1 -1
- package/dist/cjs/src/matrix/events/event-room-join.js +1 -0
- package/dist/cjs/src/matrix/events/event-room-leave.d.ts.map +1 -1
- package/dist/cjs/src/matrix/events/event-room-leave.js +3 -3
- package/dist/cjs/src/matrix/events/event-room-topic.d.ts.map +1 -1
- package/dist/cjs/src/matrix/events/event-room-topic.js +1 -1
- package/dist/cjs/src/matrix/events/mod.d.ts.map +1 -1
- package/dist/cjs/src/matrix/events/mod.js +2 -0
- package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -1
- package/dist/cjs/src/matrix/messages/sysmsg/message-revokemsg.js +2 -4
- package/dist/cjs/src/matrix/schema-mapper/contact.js +1 -1
- package/dist/cjs/src/matrix/service/request.d.ts +17 -4
- package/dist/cjs/src/matrix/service/request.d.ts.map +1 -1
- package/dist/cjs/src/matrix/service/request.js +45 -72
- package/dist/cjs/src/matrix/utils/is-type.d.ts +8 -0
- package/dist/cjs/src/matrix/utils/is-type.d.ts.map +1 -1
- package/dist/cjs/src/matrix/utils/is-type.js +25 -0
- package/dist/cjs/src/puppet-matrix.d.ts +3 -1
- package/dist/cjs/src/puppet-matrix.d.ts.map +1 -1
- package/dist/cjs/src/puppet-matrix.js +51 -19
- package/dist/cjs/src/utils/normalize-filebox.d.ts +1 -3
- package/dist/cjs/src/utils/normalize-filebox.d.ts.map +1 -1
- package/dist/cjs/src/utils/normalize-filebox.js +1 -17
- package/dist/esm/src/engine-schema.d.ts +1 -0
- package/dist/esm/src/engine-schema.d.ts.map +1 -1
- package/dist/esm/src/matrix/events/event-room-join-no-xml.d.ts +8 -0
- package/dist/esm/src/matrix/events/event-room-join-no-xml.d.ts.map +1 -0
- package/dist/esm/src/matrix/events/event-room-join-no-xml.js +122 -0
- package/dist/esm/src/matrix/events/event-room-join.d.ts.map +1 -1
- package/dist/esm/src/matrix/events/event-room-join.js +1 -0
- package/dist/esm/src/matrix/events/event-room-leave.d.ts.map +1 -1
- package/dist/esm/src/matrix/events/event-room-leave.js +3 -3
- package/dist/esm/src/matrix/events/event-room-topic.d.ts.map +1 -1
- package/dist/esm/src/matrix/events/event-room-topic.js +1 -1
- package/dist/esm/src/matrix/events/mod.d.ts.map +1 -1
- package/dist/esm/src/matrix/events/mod.js +2 -0
- package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.d.ts.map +1 -1
- package/dist/esm/src/matrix/messages/sysmsg/message-revokemsg.js +2 -4
- package/dist/esm/src/matrix/schema-mapper/contact.js +1 -1
- package/dist/esm/src/matrix/service/request.d.ts +17 -4
- package/dist/esm/src/matrix/service/request.d.ts.map +1 -1
- package/dist/esm/src/matrix/service/request.js +46 -73
- package/dist/esm/src/matrix/utils/is-type.d.ts +8 -0
- package/dist/esm/src/matrix/utils/is-type.d.ts.map +1 -1
- package/dist/esm/src/matrix/utils/is-type.js +23 -0
- package/dist/esm/src/puppet-matrix.d.ts +3 -1
- package/dist/esm/src/puppet-matrix.d.ts.map +1 -1
- package/dist/esm/src/puppet-matrix.js +52 -20
- package/dist/esm/src/utils/normalize-filebox.d.ts +1 -3
- package/dist/esm/src/utils/normalize-filebox.d.ts.map +1 -1
- package/dist/esm/src/utils/normalize-filebox.js +1 -16
- package/package.json +5 -2
- package/src/engine-schema.ts +2 -1
- package/src/matrix/events/event-room-join-no-xml.ts +178 -0
- package/src/matrix/events/event-room-join.ts +2 -1
- package/src/matrix/events/event-room-leave.ts +6 -4
- package/src/matrix/events/event-room-topic.ts +2 -1
- package/src/matrix/events/mod.ts +2 -0
- package/src/matrix/messages/sysmsg/message-revokemsg.ts +3 -4
- package/src/matrix/schema-mapper/contact.ts +1 -1
- package/src/matrix/service/request.ts +73 -88
- package/src/matrix/utils/is-type.ts +34 -0
- package/src/puppet-matrix.ts +55 -27
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
changeId = await puppet._searchRoomMemberInfo(roomId, changeName)
|
|
51
52
|
}
|
|
52
53
|
return {
|
|
53
54
|
changerId: changeId,
|
package/src/matrix/events/mod.ts
CHANGED
|
@@ -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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
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
|
|
1528
|
-
const
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
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
|
|
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
|
|
1714
|
+
= res?.adminUserNameList?.map((item: any) => item.string) || []
|
|
1680
1715
|
const memberList: ContactPayload[] = res?.newChatroomData?.chatRoomMember
|
|
1681
|
-
|
|
1716
|
+
?.filter((item: any) => item.userName)
|
|
1682
1717
|
.map((item: any) => ({
|
|
1683
|
-
wxid: item.
|
|
1684
|
-
|
|
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, '
|
|
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
|
+
}
|