@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.
Files changed (106) hide show
  1. package/dist/cjs/src/config.d.ts +2 -0
  2. package/dist/cjs/src/config.d.ts.map +1 -1
  3. package/dist/cjs/src/config.js +3 -1
  4. package/dist/cjs/src/config.js.map +1 -1
  5. package/dist/cjs/src/package-json.js +4 -4
  6. package/dist/cjs/src/package-json.js.map +1 -1
  7. package/dist/cjs/src/pure-functions/update.d.ts +2 -1
  8. package/dist/cjs/src/pure-functions/update.d.ts.map +1 -1
  9. package/dist/cjs/src/pure-functions/update.js +18 -6
  10. package/dist/cjs/src/pure-functions/update.js.map +1 -1
  11. package/dist/cjs/src/schemas/contact-events.d.ts +14 -2
  12. package/dist/cjs/src/schemas/contact-events.d.ts.map +1 -1
  13. package/dist/cjs/src/schemas/contact-events.js.map +1 -1
  14. package/dist/cjs/src/schemas/room-events.d.ts +4 -1
  15. package/dist/cjs/src/schemas/room-events.d.ts.map +1 -1
  16. package/dist/cjs/src/schemas/room-events.js +1 -0
  17. package/dist/cjs/src/schemas/room-events.js.map +1 -1
  18. package/dist/cjs/src/schemas/update.d.ts +30 -11
  19. package/dist/cjs/src/schemas/update.d.ts.map +1 -1
  20. package/dist/cjs/src/schemas/update.js +32 -0
  21. package/dist/cjs/src/schemas/update.js.map +1 -1
  22. package/dist/cjs/src/schemas/wechaty-events.d.ts +26 -2
  23. package/dist/cjs/src/schemas/wechaty-events.d.ts.map +1 -1
  24. package/dist/cjs/src/schemas/wechaty-events.js +7 -0
  25. package/dist/cjs/src/schemas/wechaty-events.js.map +1 -1
  26. package/dist/cjs/src/user-modules/contact.d.ts.map +1 -1
  27. package/dist/cjs/src/user-modules/contact.js +7 -10
  28. package/dist/cjs/src/user-modules/contact.js.map +1 -1
  29. package/dist/cjs/src/user-modules/tag-group.d.ts +54 -20
  30. package/dist/cjs/src/user-modules/tag-group.d.ts.map +1 -1
  31. package/dist/cjs/src/user-modules/tag-group.js +103 -44
  32. package/dist/cjs/src/user-modules/tag-group.js.map +1 -1
  33. package/dist/cjs/src/user-modules/tag.d.ts +57 -22
  34. package/dist/cjs/src/user-modules/tag.d.ts.map +1 -1
  35. package/dist/cjs/src/user-modules/tag.js +140 -48
  36. package/dist/cjs/src/user-modules/tag.js.map +1 -1
  37. package/dist/cjs/src/wechaty/wechaty-base.d.ts +7 -7
  38. package/dist/cjs/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
  39. package/dist/cjs/src/wechaty-mixins/io-mixin.d.ts +2 -2
  40. package/dist/cjs/src/wechaty-mixins/login-mixin.d.ts +5 -5
  41. package/dist/cjs/src/wechaty-mixins/misc-mixin.d.ts +5 -5
  42. package/dist/cjs/src/wechaty-mixins/plugin-mixin.d.ts +6 -6
  43. package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts +4 -4
  44. package/dist/cjs/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
  45. package/dist/cjs/src/wechaty-mixins/puppet-mixin.js +152 -13
  46. package/dist/cjs/src/wechaty-mixins/puppet-mixin.js.map +1 -1
  47. package/dist/cjs/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +1 -1
  48. package/dist/esm/src/config.d.ts +2 -0
  49. package/dist/esm/src/config.d.ts.map +1 -1
  50. package/dist/esm/src/config.js +2 -0
  51. package/dist/esm/src/config.js.map +1 -1
  52. package/dist/esm/src/package-json.js +4 -4
  53. package/dist/esm/src/package-json.js.map +1 -1
  54. package/dist/esm/src/pure-functions/update.d.ts +2 -1
  55. package/dist/esm/src/pure-functions/update.d.ts.map +1 -1
  56. package/dist/esm/src/pure-functions/update.js +16 -5
  57. package/dist/esm/src/pure-functions/update.js.map +1 -1
  58. package/dist/esm/src/schemas/contact-events.d.ts +14 -2
  59. package/dist/esm/src/schemas/contact-events.d.ts.map +1 -1
  60. package/dist/esm/src/schemas/contact-events.js.map +1 -1
  61. package/dist/esm/src/schemas/room-events.d.ts +4 -1
  62. package/dist/esm/src/schemas/room-events.d.ts.map +1 -1
  63. package/dist/esm/src/schemas/room-events.js +1 -0
  64. package/dist/esm/src/schemas/room-events.js.map +1 -1
  65. package/dist/esm/src/schemas/update.d.ts +30 -11
  66. package/dist/esm/src/schemas/update.d.ts.map +1 -1
  67. package/dist/esm/src/schemas/update.js +8 -1
  68. package/dist/esm/src/schemas/update.js.map +1 -1
  69. package/dist/esm/src/schemas/wechaty-events.d.ts +26 -2
  70. package/dist/esm/src/schemas/wechaty-events.d.ts.map +1 -1
  71. package/dist/esm/src/schemas/wechaty-events.js +7 -0
  72. package/dist/esm/src/schemas/wechaty-events.js.map +1 -1
  73. package/dist/esm/src/user-modules/contact.d.ts.map +1 -1
  74. package/dist/esm/src/user-modules/contact.js +7 -10
  75. package/dist/esm/src/user-modules/contact.js.map +1 -1
  76. package/dist/esm/src/user-modules/tag-group.d.ts +54 -20
  77. package/dist/esm/src/user-modules/tag-group.d.ts.map +1 -1
  78. package/dist/esm/src/user-modules/tag-group.js +104 -45
  79. package/dist/esm/src/user-modules/tag-group.js.map +1 -1
  80. package/dist/esm/src/user-modules/tag.d.ts +57 -22
  81. package/dist/esm/src/user-modules/tag.d.ts.map +1 -1
  82. package/dist/esm/src/user-modules/tag.js +119 -50
  83. package/dist/esm/src/user-modules/tag.js.map +1 -1
  84. package/dist/esm/src/wechaty/wechaty-base.d.ts +7 -7
  85. package/dist/esm/src/wechaty-mixins/gerror-mixin.d.ts +1 -1
  86. package/dist/esm/src/wechaty-mixins/io-mixin.d.ts +2 -2
  87. package/dist/esm/src/wechaty-mixins/login-mixin.d.ts +5 -5
  88. package/dist/esm/src/wechaty-mixins/misc-mixin.d.ts +5 -5
  89. package/dist/esm/src/wechaty-mixins/plugin-mixin.d.ts +6 -6
  90. package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts +4 -4
  91. package/dist/esm/src/wechaty-mixins/puppet-mixin.d.ts.map +1 -1
  92. package/dist/esm/src/wechaty-mixins/puppet-mixin.js +153 -14
  93. package/dist/esm/src/wechaty-mixins/puppet-mixin.js.map +1 -1
  94. package/dist/esm/src/wechaty-mixins/wechatify-user-module-mixin.d.ts +1 -1
  95. package/package.json +3 -3
  96. package/src/config.ts +3 -0
  97. package/src/package-json.ts +4 -4
  98. package/src/pure-functions/update.ts +20 -8
  99. package/src/schemas/contact-events.ts +22 -3
  100. package/src/schemas/room-events.ts +4 -0
  101. package/src/schemas/update.ts +42 -13
  102. package/src/schemas/wechaty-events.ts +77 -43
  103. package/src/user-modules/contact.ts +7 -10
  104. package/src/user-modules/tag-group.ts +135 -53
  105. package/src/user-modules/tag.ts +124 -57
  106. 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 type { InfoUpdateInterface } from '../schemas/update.js'
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
- const updateEvent: InfoUpdateInterface = {
447
- type: payloadType,
448
- id: payloadId,
449
- updates: diffPayload(oldPayload, newPayload),
450
- }
451
- if (updateEvent.updates.length > 0) {
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
- const updateEvent: InfoUpdateInterface = {
463
- type: payloadType,
464
- id: payloadId,
465
- updates: diffPayload(oldPayload, newPayload),
466
- }
467
- if (updateEvent.updates.length > 0) {
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: