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.
- 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.map +1 -1
- package/dist/cjs/src/matrix/events/event-room-join-no-xml.js +10 -7
- 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 -1
- 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/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 +50 -75
- 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.map +1 -1
- package/dist/esm/src/matrix/events/event-room-join-no-xml.js +10 -7
- 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 -1
- 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/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 +51 -76
- 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 +21 -8
- package/src/matrix/events/event-room-join.ts +2 -4
- package/src/matrix/events/event-room-leave.ts +6 -4
- package/src/matrix/events/event-room-topic.ts +2 -1
- 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 +80 -92
- package/src/matrix/utils/is-type.ts +34 -0
- package/src/puppet-matrix.ts +55 -27
- 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
|
-
|
|
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,
|
|
@@ -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 () {
|
|
@@ -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:
|
|
764
|
-
reconnectPeriod:
|
|
772
|
+
keepalive: 120,
|
|
773
|
+
reconnectPeriod: 3000,
|
|
765
774
|
connectTimeout: 60 * 1000,
|
|
766
|
-
|
|
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
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
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
|
|
1528
|
-
const
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
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
|
|
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
|
|
1717
|
+
= res?.adminUserNameList?.map((item: any) => item.string) || []
|
|
1680
1718
|
const memberList: ContactPayload[] = res?.newChatroomData?.chatRoomMember
|
|
1681
|
-
|
|
1719
|
+
?.filter((item: any) => item.userName)
|
|
1682
1720
|
.map((item: any) => ({
|
|
1683
|
-
wxid: item.
|
|
1684
|
-
|
|
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, '
|
|
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
|
+
}
|
package/src/puppet-matrix.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
1664
|
-
|
|
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
|
}
|