@juzi/wechaty 1.0.21 → 1.0.24
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/config.d.ts +2 -0
- package/dist/cjs/src/config.d.ts.map +1 -1
- package/dist/cjs/src/config.js +3 -1
- package/dist/cjs/src/config.js.map +1 -1
- package/dist/cjs/src/package-json.js +4 -4
- package/dist/cjs/src/package-json.js.map +1 -1
- package/dist/cjs/src/pure-functions/update.d.ts +2 -1
- package/dist/cjs/src/pure-functions/update.d.ts.map +1 -1
- package/dist/cjs/src/pure-functions/update.js +18 -6
- package/dist/cjs/src/pure-functions/update.js.map +1 -1
- package/dist/cjs/src/schemas/contact-events.d.ts +14 -2
- package/dist/cjs/src/schemas/contact-events.d.ts.map +1 -1
- package/dist/cjs/src/schemas/contact-events.js.map +1 -1
- package/dist/cjs/src/schemas/room-events.d.ts +4 -1
- package/dist/cjs/src/schemas/room-events.d.ts.map +1 -1
- package/dist/cjs/src/schemas/room-events.js +1 -0
- package/dist/cjs/src/schemas/room-events.js.map +1 -1
- package/dist/cjs/src/schemas/update.d.ts +30 -11
- package/dist/cjs/src/schemas/update.d.ts.map +1 -1
- package/dist/cjs/src/schemas/update.js +32 -0
- package/dist/cjs/src/schemas/update.js.map +1 -1
- package/dist/cjs/src/schemas/wechaty-events.d.ts +26 -2
- package/dist/cjs/src/schemas/wechaty-events.d.ts.map +1 -1
- package/dist/cjs/src/schemas/wechaty-events.js +7 -0
- package/dist/cjs/src/schemas/wechaty-events.js.map +1 -1
- package/dist/cjs/src/user-modules/contact.d.ts.map +1 -1
- package/dist/cjs/src/user-modules/contact.js +7 -10
- package/dist/cjs/src/user-modules/contact.js.map +1 -1
- package/dist/cjs/src/user-modules/tag-group.d.ts +54 -20
- package/dist/cjs/src/user-modules/tag-group.d.ts.map +1 -1
- package/dist/cjs/src/user-modules/tag-group.js +103 -44
- package/dist/cjs/src/user-modules/tag-group.js.map +1 -1
- package/dist/cjs/src/user-modules/tag.d.ts +57 -22
- package/dist/cjs/src/user-modules/tag.d.ts.map +1 -1
- package/dist/cjs/src/user-modules/tag.js +140 -48
- package/dist/cjs/src/user-modules/tag.js.map +1 -1
- package/dist/cjs/src/wechaty/wechaty-base.d.ts +7 -7
- package/dist/cjs/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
- package/dist/cjs/src/wechaty-mixins/io-mixin.d.ts +2 -2
- package/dist/cjs/src/wechaty-mixins/login-mixin.d.ts +5 -5
- package/dist/cjs/src/wechaty-mixins/misc-mixin.d.ts +5 -5
- package/dist/cjs/src/wechaty-mixins/plugin-mixin.d.ts +6 -6
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts +4 -4
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.js +152 -13
- package/dist/cjs/src/wechaty-mixins/puppet-mixin.js.map +1 -1
- package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +1 -1
- package/dist/esm/src/config.d.ts +2 -0
- package/dist/esm/src/config.d.ts.map +1 -1
- package/dist/esm/src/config.js +2 -0
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/package-json.js +4 -4
- package/dist/esm/src/package-json.js.map +1 -1
- package/dist/esm/src/pure-functions/update.d.ts +2 -1
- package/dist/esm/src/pure-functions/update.d.ts.map +1 -1
- package/dist/esm/src/pure-functions/update.js +16 -5
- package/dist/esm/src/pure-functions/update.js.map +1 -1
- package/dist/esm/src/schemas/contact-events.d.ts +14 -2
- package/dist/esm/src/schemas/contact-events.d.ts.map +1 -1
- package/dist/esm/src/schemas/contact-events.js.map +1 -1
- package/dist/esm/src/schemas/room-events.d.ts +4 -1
- package/dist/esm/src/schemas/room-events.d.ts.map +1 -1
- package/dist/esm/src/schemas/room-events.js +1 -0
- package/dist/esm/src/schemas/room-events.js.map +1 -1
- package/dist/esm/src/schemas/update.d.ts +30 -11
- package/dist/esm/src/schemas/update.d.ts.map +1 -1
- package/dist/esm/src/schemas/update.js +8 -1
- package/dist/esm/src/schemas/update.js.map +1 -1
- package/dist/esm/src/schemas/wechaty-events.d.ts +26 -2
- package/dist/esm/src/schemas/wechaty-events.d.ts.map +1 -1
- package/dist/esm/src/schemas/wechaty-events.js +7 -0
- package/dist/esm/src/schemas/wechaty-events.js.map +1 -1
- package/dist/esm/src/user-modules/contact.d.ts.map +1 -1
- package/dist/esm/src/user-modules/contact.js +7 -10
- package/dist/esm/src/user-modules/contact.js.map +1 -1
- package/dist/esm/src/user-modules/tag-group.d.ts +54 -20
- package/dist/esm/src/user-modules/tag-group.d.ts.map +1 -1
- package/dist/esm/src/user-modules/tag-group.js +104 -45
- package/dist/esm/src/user-modules/tag-group.js.map +1 -1
- package/dist/esm/src/user-modules/tag.d.ts +57 -22
- package/dist/esm/src/user-modules/tag.d.ts.map +1 -1
- package/dist/esm/src/user-modules/tag.js +119 -50
- package/dist/esm/src/user-modules/tag.js.map +1 -1
- package/dist/esm/src/wechaty/wechaty-base.d.ts +7 -7
- package/dist/esm/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
- package/dist/esm/src/wechaty-mixins/io-mixin.d.ts +2 -2
- package/dist/esm/src/wechaty-mixins/login-mixin.d.ts +5 -5
- package/dist/esm/src/wechaty-mixins/misc-mixin.d.ts +5 -5
- package/dist/esm/src/wechaty-mixins/plugin-mixin.d.ts +6 -6
- package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts +4 -4
- package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
- package/dist/esm/src/wechaty-mixins/puppet-mixin.js +153 -14
- package/dist/esm/src/wechaty-mixins/puppet-mixin.js.map +1 -1
- package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +1 -1
- package/package.json +3 -3
- package/src/config.ts +3 -0
- package/src/package-json.ts +4 -4
- package/src/pure-functions/update.ts +20 -8
- package/src/schemas/contact-events.ts +22 -3
- package/src/schemas/room-events.ts +4 -0
- package/src/schemas/update.ts +42 -13
- package/src/schemas/wechaty-events.ts +77 -43
- package/src/user-modules/contact.ts +7 -10
- package/src/user-modules/tag-group.ts +135 -53
- package/src/user-modules/tag.ts +124 -57
- package/src/wechaty-mixins/puppet-mixin.ts +171 -15
|
@@ -11,12 +11,14 @@ import type {
|
|
|
11
11
|
StateSwitchInterface,
|
|
12
12
|
} from 'state-switch'
|
|
13
13
|
|
|
14
|
-
import { config } from '../config.js'
|
|
14
|
+
import { config, PUPPET_PAYLOAD_SYNC_GAP, PUPPET_PAYLOAD_SYNC_MAX_RETRY } from '../config.js'
|
|
15
15
|
import { timestampToDate } from '../pure-functions/timestamp-to-date.js'
|
|
16
16
|
import type {
|
|
17
17
|
ContactImpl,
|
|
18
18
|
ContactInterface,
|
|
19
19
|
RoomImpl,
|
|
20
|
+
TagGroupInterface,
|
|
21
|
+
TagInterface,
|
|
20
22
|
} from '../user-modules/mod.js'
|
|
21
23
|
|
|
22
24
|
import type {
|
|
@@ -25,8 +27,9 @@ import type {
|
|
|
25
27
|
|
|
26
28
|
import type { GErrorMixin } from './gerror-mixin.js'
|
|
27
29
|
import type { IoMixin } from './io-mixin.js'
|
|
28
|
-
import
|
|
29
|
-
import { diffPayload } from '../pure-functions/update.js'
|
|
30
|
+
import { ContactImportantFields, ContactUpdatableValuePair, InfoUpdateInterface, RoomImportantFields, RoomUpdatableValuePair } from '../schemas/update.js'
|
|
31
|
+
import { checkUntilChanged, diffPayload } from '../pure-functions/update.js'
|
|
32
|
+
import { getTagKey } from '@juzi/wechaty-puppet/helpers'
|
|
30
33
|
|
|
31
34
|
const PUPPET_MEMORY_NAME = 'puppet'
|
|
32
35
|
|
|
@@ -427,6 +430,95 @@ const puppetMixin = <MixinBase extends WechatifyUserModuleMixin & GErrorMixin &
|
|
|
427
430
|
})
|
|
428
431
|
break
|
|
429
432
|
|
|
433
|
+
case 'tag':
|
|
434
|
+
puppet.on('tag', async payload => {
|
|
435
|
+
switch (payload.tagEventType) {
|
|
436
|
+
case PUPPET.types.TagEvent.TagCreate: {
|
|
437
|
+
const newTagPromises = payload.tagEventPayload.map(tag =>
|
|
438
|
+
this.Tag.find({
|
|
439
|
+
id: tag.tagId,
|
|
440
|
+
groupId: tag.tagGroupId,
|
|
441
|
+
}),
|
|
442
|
+
)
|
|
443
|
+
const newTags = await Promise.all(newTagPromises)
|
|
444
|
+
this.emit('tag', payload.tagEventType, newTags)
|
|
445
|
+
break
|
|
446
|
+
}
|
|
447
|
+
case PUPPET.types.TagEvent.TagDelete: {
|
|
448
|
+
const deletedTagPromises = payload.tagEventPayload.map(tag =>
|
|
449
|
+
this.Tag.find({
|
|
450
|
+
id: tag.tagId,
|
|
451
|
+
groupId: tag.tagGroupId,
|
|
452
|
+
}),
|
|
453
|
+
)
|
|
454
|
+
const deletedTags = await Promise.all(deletedTagPromises)
|
|
455
|
+
this.emit('tag', payload.tagEventType, deletedTags)
|
|
456
|
+
// TODO: bind tag-delete to tag instance
|
|
457
|
+
break
|
|
458
|
+
}
|
|
459
|
+
case PUPPET.types.TagEvent.TagRename: {
|
|
460
|
+
const renamedTagPromises = payload.tagEventPayload.map(tag =>
|
|
461
|
+
this.Tag.find({
|
|
462
|
+
id: tag.tagId,
|
|
463
|
+
groupId: tag.tagGroupId,
|
|
464
|
+
}),
|
|
465
|
+
)
|
|
466
|
+
const renamedTags = (await Promise.all(renamedTagPromises)) as TagInterface[]
|
|
467
|
+
await Promise.all(renamedTags.map(async tag => {
|
|
468
|
+
const oldName = tag.name()
|
|
469
|
+
const result = await checkUntilChanged(PUPPET_PAYLOAD_SYNC_GAP, PUPPET_PAYLOAD_SYNC_MAX_RETRY, async () => {
|
|
470
|
+
await tag.sync()
|
|
471
|
+
return tag.name() === oldName
|
|
472
|
+
})
|
|
473
|
+
if (!result) {
|
|
474
|
+
log.warn('WechatyPuppetMixin', 'tagRenameEvent still get old name after %s retries for tag %s', PUPPET_PAYLOAD_SYNC_MAX_RETRY, tag.key)
|
|
475
|
+
}
|
|
476
|
+
}))
|
|
477
|
+
this.emit('tag', payload.tagEventType, renamedTags)
|
|
478
|
+
// TODO: bind tag-rename to tag instance
|
|
479
|
+
break
|
|
480
|
+
}
|
|
481
|
+
case PUPPET.types.TagEvent.TagGroupCreate: {
|
|
482
|
+
const newTagGroupPromises = payload.tagEventPayload.map(tagGroup =>
|
|
483
|
+
this.TagGroup.find(tagGroup.tagGroupId),
|
|
484
|
+
)
|
|
485
|
+
const newTagGroups = await Promise.all(newTagGroupPromises)
|
|
486
|
+
this.emit('tag', payload.tagEventType, newTagGroups)
|
|
487
|
+
break
|
|
488
|
+
}
|
|
489
|
+
case PUPPET.types.TagEvent.TagGroupDelete: {
|
|
490
|
+
const deletedTagGroupPromises = payload.tagEventPayload.map(tagGroup =>
|
|
491
|
+
this.TagGroup.find(tagGroup.tagGroupId),
|
|
492
|
+
)
|
|
493
|
+
const deletedTagGroups = await Promise.all(deletedTagGroupPromises)
|
|
494
|
+
this.emit('tag', payload.tagEventType, deletedTagGroups)
|
|
495
|
+
break
|
|
496
|
+
// TODO: bind tagGroup-delete to tagGroup instance
|
|
497
|
+
}
|
|
498
|
+
case PUPPET.types.TagEvent.TagGroupRename: {
|
|
499
|
+
const renamedTagGroupPromises = payload.tagEventPayload.map(tagGroup =>
|
|
500
|
+
this.TagGroup.find(tagGroup.tagGroupId),
|
|
501
|
+
)
|
|
502
|
+
const renamedTagGroups = (await Promise.all(renamedTagGroupPromises)) as TagGroupInterface[]
|
|
503
|
+
await Promise.all(renamedTagGroups.map(async tagGroup => {
|
|
504
|
+
const oldName = tagGroup.name()
|
|
505
|
+
const result = await checkUntilChanged(PUPPET_PAYLOAD_SYNC_GAP, PUPPET_PAYLOAD_SYNC_MAX_RETRY, async () => {
|
|
506
|
+
await tagGroup.sync()
|
|
507
|
+
return tagGroup.name() === oldName
|
|
508
|
+
})
|
|
509
|
+
if (!result) {
|
|
510
|
+
log.warn('WechatyPuppetMixin', 'tagGroupRenameEvent still get old name after %s retries for tagGroup %s', PUPPET_PAYLOAD_SYNC_MAX_RETRY, tagGroup.id)
|
|
511
|
+
}
|
|
512
|
+
}))
|
|
513
|
+
this.emit('tag', payload.tagEventType, renamedTagGroups)
|
|
514
|
+
// TODO: bind tagGroup-rename to tagGroup instance
|
|
515
|
+
break
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
})
|
|
520
|
+
break
|
|
521
|
+
|
|
430
522
|
case 'reset':
|
|
431
523
|
// Do not propagation `reset` event from puppet
|
|
432
524
|
break
|
|
@@ -443,15 +535,58 @@ const puppetMixin = <MixinBase extends WechatifyUserModuleMixin & GErrorMixin &
|
|
|
443
535
|
const oldPayload = JSON.parse(JSON.stringify(contact?.payload || {}))
|
|
444
536
|
await contact?.ready(true)
|
|
445
537
|
const newPayload = JSON.parse(JSON.stringify(contact?.payload || {}))
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
538
|
+
|
|
539
|
+
const differences = diffPayload<PUPPET.payloads.Contact>(oldPayload, newPayload)
|
|
540
|
+
const importantDifferences = differences.filter(ele => ele && ContactImportantFields.some(key => key === ele.key))
|
|
541
|
+
const regularDifferences = differences.filter(ele => ele && !ContactImportantFields.some(key => key === ele.key)) as ContactUpdatableValuePair[]
|
|
542
|
+
if (regularDifferences.length > 0) {
|
|
543
|
+
const updateEvent: InfoUpdateInterface = {
|
|
544
|
+
type: payloadType,
|
|
545
|
+
id: payloadId,
|
|
546
|
+
updates: regularDifferences,
|
|
547
|
+
}
|
|
452
548
|
this.emit('update', updateEvent)
|
|
453
549
|
contact?.emit('update', updateEvent)
|
|
454
550
|
}
|
|
551
|
+
for (const difference of importantDifferences) {
|
|
552
|
+
switch (difference?.key) {
|
|
553
|
+
case 'tags': {
|
|
554
|
+
const oldTagsSet = new Set(difference.oldValue?.map(ele => getTagKey(ele)))
|
|
555
|
+
const newTagsSet = new Set(difference.newValue?.map(ele => getTagKey(ele)))
|
|
556
|
+
const addedTags = difference.newValue?.filter(ele => !oldTagsSet.has(getTagKey(ele))).map(ele => this.Tag.find(ele)) || []
|
|
557
|
+
const removedTags = difference.oldValue?.filter(ele => !newTagsSet.has(getTagKey(ele))).map(ele => this.Tag.find(ele)) || []
|
|
558
|
+
if (addedTags.length > 0) {
|
|
559
|
+
this.emit('contact-tag-add', contact, addedTags)
|
|
560
|
+
}
|
|
561
|
+
if (removedTags.length > 0) {
|
|
562
|
+
this.emit('contact-tag-remove', contact, removedTags)
|
|
563
|
+
}
|
|
564
|
+
break
|
|
565
|
+
}
|
|
566
|
+
case 'name': {
|
|
567
|
+
this.emit('contact-name', contact, difference.newValue || '', difference.oldValue || '')
|
|
568
|
+
contact?.emit('name', difference.newValue || '', difference.oldValue || '')
|
|
569
|
+
break
|
|
570
|
+
}
|
|
571
|
+
case 'alias': {
|
|
572
|
+
this.emit('contact-alias', contact, difference.newValue || '', difference.oldValue || '')
|
|
573
|
+
contact?.emit('alias', difference.newValue || '', difference.oldValue || '')
|
|
574
|
+
break
|
|
575
|
+
}
|
|
576
|
+
case 'phone': {
|
|
577
|
+
this.emit('contact-phone', contact, difference.newValue || [], difference.oldValue || [])
|
|
578
|
+
contact?.emit('phone', difference.newValue || [], difference.oldValue || [])
|
|
579
|
+
break
|
|
580
|
+
}
|
|
581
|
+
case 'description': {
|
|
582
|
+
this.emit('contact-description', contact, difference.newValue || '', difference.oldValue || '')
|
|
583
|
+
contact?.emit('description', difference.newValue || '', difference.oldValue || '')
|
|
584
|
+
break
|
|
585
|
+
}
|
|
586
|
+
default:
|
|
587
|
+
log.warn('WechatyPuppetMixin', 'puppet dirty unsupported difference type: %s', JSON.stringify(difference))
|
|
588
|
+
}
|
|
589
|
+
}
|
|
455
590
|
break
|
|
456
591
|
}
|
|
457
592
|
case PUPPET.types.Payload.Room: {
|
|
@@ -459,15 +594,32 @@ const puppetMixin = <MixinBase extends WechatifyUserModuleMixin & GErrorMixin &
|
|
|
459
594
|
const oldPayload = JSON.parse(JSON.stringify(room?.payload || {}))
|
|
460
595
|
await room?.ready(true)
|
|
461
596
|
const newPayload = JSON.parse(JSON.stringify(room?.payload || {}))
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
597
|
+
|
|
598
|
+
const differences = diffPayload<PUPPET.payloads.Room>(oldPayload, newPayload)
|
|
599
|
+
const importantDifferences = differences.filter(ele => ele && RoomImportantFields.some(key => key === ele.key))
|
|
600
|
+
const regularDifferences = differences.filter(ele => ele && !RoomImportantFields.some(key => key === ele.key)) as RoomUpdatableValuePair[]
|
|
601
|
+
if (regularDifferences.length > 0) {
|
|
602
|
+
const updateEvent: InfoUpdateInterface = {
|
|
603
|
+
type: payloadType,
|
|
604
|
+
id: payloadId,
|
|
605
|
+
updates: regularDifferences,
|
|
606
|
+
}
|
|
468
607
|
this.emit('update', updateEvent)
|
|
469
608
|
room?.emit('update', updateEvent)
|
|
470
609
|
}
|
|
610
|
+
for (const difference of importantDifferences) {
|
|
611
|
+
switch (difference?.key) {
|
|
612
|
+
case 'ownerId': {
|
|
613
|
+
const oldOwner = (await this.Contact.find({ id: difference.oldValue }))!
|
|
614
|
+
const newOwner = (await this.Contact.find({ id: difference.newValue }))!
|
|
615
|
+
this.emit('room-owner', room, newOwner, oldOwner)
|
|
616
|
+
room?.emit('owner', newOwner, oldOwner)
|
|
617
|
+
break
|
|
618
|
+
}
|
|
619
|
+
default:
|
|
620
|
+
log.warn('WechatyPuppetMixin', 'puppet dirty unsupported difference type: %s', JSON.stringify(difference))
|
|
621
|
+
}
|
|
622
|
+
}
|
|
471
623
|
break
|
|
472
624
|
}
|
|
473
625
|
case PUPPET.types.Payload.RoomMember: {
|
|
@@ -485,6 +637,10 @@ const puppetMixin = <MixinBase extends WechatifyUserModuleMixin & GErrorMixin &
|
|
|
485
637
|
case PUPPET.types.Payload.Message:
|
|
486
638
|
// Message does not need to dirty (?)
|
|
487
639
|
break
|
|
640
|
+
case PUPPET.types.Payload.Tag:
|
|
641
|
+
break
|
|
642
|
+
case PUPPET.types.Payload.TagGroup:
|
|
643
|
+
break
|
|
488
644
|
|
|
489
645
|
case PUPPET.types.Payload.Unspecified:
|
|
490
646
|
default:
|