wechaty-puppet-matrix 0.0.36 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +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.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 +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 +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 +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
|
@@ -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 () {
|
|
@@ -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
|
+
}
|
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
|
}
|