@juzi/wechaty-puppet-service 1.0.44 → 1.0.46

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 (33) hide show
  1. package/dist/cjs/src/client/puppet-service.d.ts +3 -0
  2. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
  3. package/dist/cjs/src/client/puppet-service.js +41 -69
  4. package/dist/cjs/src/client/puppet-service.js.map +1 -1
  5. package/dist/cjs/src/package-json.d.ts.map +1 -1
  6. package/dist/cjs/src/package-json.js +4 -3
  7. package/dist/cjs/src/package-json.js.map +1 -1
  8. package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -1
  9. package/dist/cjs/src/server/puppet-implementation.js +39 -61
  10. package/dist/cjs/src/server/puppet-implementation.js.map +1 -1
  11. package/dist/cjs/src/utils/pb-payload-helper.d.ts +6 -2
  12. package/dist/cjs/src/utils/pb-payload-helper.d.ts.map +1 -1
  13. package/dist/cjs/src/utils/pb-payload-helper.js +170 -1
  14. package/dist/cjs/src/utils/pb-payload-helper.js.map +1 -1
  15. package/dist/esm/src/client/puppet-service.d.ts +3 -0
  16. package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
  17. package/dist/esm/src/client/puppet-service.js +42 -70
  18. package/dist/esm/src/client/puppet-service.js.map +1 -1
  19. package/dist/esm/src/package-json.d.ts.map +1 -1
  20. package/dist/esm/src/package-json.js +4 -3
  21. package/dist/esm/src/package-json.js.map +1 -1
  22. package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -1
  23. package/dist/esm/src/server/puppet-implementation.js +40 -62
  24. package/dist/esm/src/server/puppet-implementation.js.map +1 -1
  25. package/dist/esm/src/utils/pb-payload-helper.d.ts +6 -2
  26. package/dist/esm/src/utils/pb-payload-helper.d.ts.map +1 -1
  27. package/dist/esm/src/utils/pb-payload-helper.js +143 -0
  28. package/dist/esm/src/utils/pb-payload-helper.js.map +1 -1
  29. package/package.json +4 -3
  30. package/src/client/puppet-service.ts +56 -66
  31. package/src/package-json.ts +4 -3
  32. package/src/server/puppet-implementation.ts +50 -62
  33. package/src/utils/pb-payload-helper.ts +143 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juzi/wechaty-puppet-service",
3
- "version": "1.0.44",
3
+ "version": "1.0.46",
4
4
  "description": "Puppet Service for Wechaty",
5
5
  "type": "module",
6
6
  "exports": {
@@ -51,7 +51,7 @@
51
51
  "@chatie/eslint-config": "^1.0.4",
52
52
  "@chatie/semver": "^0.4.7",
53
53
  "@chatie/tsconfig": "^4.6.3",
54
- "@juzi/wechaty-puppet": "^1.0.49",
54
+ "@juzi/wechaty-puppet": "^1.0.50",
55
55
  "@juzi/wechaty-puppet-mock": "^1.0.1",
56
56
  "@types/google-protobuf": "^3.15.5",
57
57
  "@types/lru-cache": "^7.5.0",
@@ -59,6 +59,7 @@
59
59
  "@types/temp": "^0.9.1",
60
60
  "@types/uuid": "^8.3.4",
61
61
  "@types/ws": "^8.5.3",
62
+ "esquery": "1.4.0",
62
63
  "get-port": "^6.1.2",
63
64
  "temp": "^0.9.4",
64
65
  "typed-emitter": "^1.5.0-from-event",
@@ -69,7 +70,7 @@
69
70
  "@juzi/wechaty-puppet": "^1.0.46"
70
71
  },
71
72
  "dependencies": {
72
- "@juzi/wechaty-grpc": "^1.0.43",
73
+ "@juzi/wechaty-grpc": "^1.0.47",
73
74
  "@juzi/wechaty-redux": "^1.0.1",
74
75
  "clone-class": "^1.1.1",
75
76
  "ducks": "^1.0.2",
@@ -58,7 +58,8 @@ import { packageJson } from '../package-json.js'
58
58
 
59
59
  import { GrpcManager } from './grpc-manager.js'
60
60
  import { PayloadStore } from './payload-store.js'
61
- import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
61
+ import { channelPayloadToPb, channelPbToPayload, postPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
62
+ import type { MessageBroadcastTargets, MessageBroadcastTargetType } from '@juzi/wechaty-puppet/dist/esm/src/schemas/message.js'
62
63
 
63
64
  export type PuppetServiceOptions = PUPPET.PuppetOptions & {
64
65
  authority? : string
@@ -715,24 +716,24 @@ class PuppetService extends PUPPET.Puppet {
715
716
  if (payload.id) {
716
717
  throw new Error('cannot modify contactId')
717
718
  }
718
- if (payload.gender) { request.setGender(payload.gender) }
719
- if (payload.type) { request.setType(payload.type) }
720
- if (payload.name) { request.setName(payload.name) }
721
- if (payload.avatar) { request.setAvatar(payload.avatar) }
722
- if (payload.address) { request.setAddress(payload.address) }
723
- if (payload.alias) { request.setAlias(payload.alias) }
724
- if (payload.city) { request.setCity(payload.city) }
725
- if (payload.friend) { request.setFriend(payload.friend) }
726
- if (payload.province) { request.setProvince(payload.province) }
727
- if (payload.star) { request.setStar(payload.star) }
728
- if (payload.weixin) { request.setWeixin(payload.weixin) }
729
- if (payload.corporation) { request.setCorporation(payload.corporation) }
730
- if (payload.title) { request.setTitle(payload.title) }
731
- if (payload.description) { request.setDescription(payload.description) }
732
- if (payload.coworker) { request.setCoworker(payload.coworker) }
733
- if (payload.phone) { request.setPhonesList(payload.phone) }
734
- if (payload.additionalInfo) { request.setAdditionalInfo(payload.additionalInfo) }
735
- if (payload.tags) { request.setTagIdsList(payload.tags) }
719
+ if (typeof payload.gender !== 'undefined') { request.setGender(payload.gender) }
720
+ if (typeof payload.type !== 'undefined') { request.setType(payload.type) }
721
+ if (typeof payload.name !== 'undefined') { request.setName(payload.name) }
722
+ if (typeof payload.avatar !== 'undefined') { request.setAvatar(payload.avatar) }
723
+ if (typeof payload.address !== 'undefined') { request.setAddress(payload.address) }
724
+ if (typeof payload.alias !== 'undefined') { request.setAlias(payload.alias) }
725
+ if (typeof payload.city !== 'undefined') { request.setCity(payload.city) }
726
+ if (typeof payload.friend !== 'undefined') { request.setFriend(payload.friend) }
727
+ if (typeof payload.province !== 'undefined') { request.setProvince(payload.province) }
728
+ if (typeof payload.star !== 'undefined') { request.setStar(payload.star) }
729
+ if (typeof payload.weixin !== 'undefined') { request.setWeixin(payload.weixin) }
730
+ if (typeof payload.corporation !== 'undefined') { request.setCorporation(payload.corporation) }
731
+ if (typeof payload.title !== 'undefined') { request.setTitle(payload.title) }
732
+ if (typeof payload.description !== 'undefined') { request.setDescription(payload.description) }
733
+ if (typeof payload.coworker !== 'undefined') { request.setCoworker(payload.coworker) }
734
+ if (typeof payload.phone !== 'undefined') { request.setPhonesList(payload.phone) }
735
+ if (typeof payload.additionalInfo !== 'undefined') { request.setAdditionalInfo(payload.additionalInfo) }
736
+ if (typeof payload.tags !== 'undefined') { request.setTagIdsList(payload.tags) }
736
737
 
737
738
  await util.promisify(
738
739
  this.grpcManager.client.contactPayloadModify
@@ -1364,6 +1365,41 @@ class PuppetService extends PUPPET.Puppet {
1364
1365
  return payload
1365
1366
  }
1366
1367
 
1368
+ override async getMessageBroadcastTarget (): Promise<MessageBroadcastTargets> {
1369
+ log.verbose('PuppetService', 'getMessageBroadcastTarget()')
1370
+
1371
+ const request = new grpcPuppet.GetMessageBroadcastTargetRequest()
1372
+
1373
+ const response = await util.promisify(
1374
+ this.grpcManager.client.getMessageBroadcastTarget.bind(this.grpcManager.client),
1375
+ )(request)
1376
+
1377
+ return {
1378
+ contactIds: response.getContactIdsList(),
1379
+ roomIds: response.getRoomIdsList(),
1380
+ }
1381
+ }
1382
+
1383
+ override async createMessageBroadcast (targets: string[], type: MessageBroadcastTargetType, content: PUPPET.payloads.Post): Promise<string | void> {
1384
+ log.verbose('PuppetService', 'createMessageBroadcast()')
1385
+
1386
+ if (!PUPPET.payloads.isPostClient(content)) {
1387
+ throw new Error('can only create broadcast with client post')
1388
+ }
1389
+
1390
+ const request = new grpcPuppet.CreateMessageBroadcastRequest()
1391
+ const post = await postPayloadToPb(grpcPuppet, content, this.serializeFileBox.bind(this))
1392
+ request.setContent(post)
1393
+ request.setTargetIdsList(targets)
1394
+ request.setType(type)
1395
+
1396
+ const response = await util.promisify(
1397
+ this.grpcManager.client.createMessageBroadcast.bind(this.grpcManager.client),
1398
+ )(request)
1399
+
1400
+ return response.getId()
1401
+ }
1402
+
1367
1403
  /**
1368
1404
  *
1369
1405
  * Room
@@ -2206,53 +2242,7 @@ class PuppetService extends PUPPET.Puppet {
2206
2242
  throw new Error('can only publish client post now')
2207
2243
  }
2208
2244
  const request = new grpcPuppet.MomentPublishRequest()
2209
- const post = new grpcPuppet.PostPayloadClient()
2210
- post.setType(grpcPuppet.PostType.POST_TYPE_MOMENT)
2211
- for (const item of payload.sayableList) {
2212
- const sayable = new grpcPuppet.PostSayable()
2213
- switch (item.type) {
2214
- case PUPPET.types.Sayable.Text:
2215
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
2216
- sayable.setText(item.payload.text)
2217
- sayable.setMentionIdListList(item.payload.mentions)
2218
- break
2219
- case PUPPET.types.Sayable.Attachment: {
2220
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
2221
- const serializedFileBox = typeof item.payload.filebox === 'string' ? item.payload.filebox : await this.serializeFileBox(item.payload.filebox)
2222
- sayable.setFileBox(serializedFileBox)
2223
- break
2224
- }
2225
- case PUPPET.types.Sayable.Url: {
2226
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
2227
- const urlLinkPayload = item.payload
2228
- const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
2229
- sayable.setUrlLink(pbUrlLinkPayload)
2230
- break
2231
- }
2232
- case PUPPET.types.Sayable.Channel: {
2233
- sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
2234
- const channelPayload = item.payload
2235
- const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
2236
- sayable.setChannel(pbChannelPayload)
2237
- break
2238
- }
2239
- default:
2240
- throw new Error(`postPublish unsupported type ${item.type}`)
2241
- }
2242
- post.addSayableList(sayable)
2243
- }
2244
- if (payload.rootId) { post.setRootId(payload.rootId) }
2245
- if (payload.parentId) { post.setParentId(payload.parentId) }
2246
- if (payload.location) {
2247
- const location = new grpcPuppet.LocationPayload()
2248
- location.setAccuracy(payload.location.accuracy)
2249
- location.setAddress(payload.location.address)
2250
- location.setName(payload.location.name)
2251
- location.setLatitude(payload.location.latitude)
2252
- location.setLongitude(payload.location.longitude)
2253
- post.setLocation(location)
2254
- }
2255
- post.setVisibleListList(payload.visibleList || [])
2245
+ const post = await postPayloadToPb(grpcPuppet, payload, this.serializeFileBox.bind(this))
2256
2246
  request.setPost(post)
2257
2247
 
2258
2248
  const result = await util.promisify(
@@ -4,7 +4,7 @@
4
4
  import type { PackageJson } from 'type-fest'
5
5
  export const packageJson: PackageJson = {
6
6
  "name": "@juzi/wechaty-puppet-service",
7
- "version": "1.0.44",
7
+ "version": "1.0.46",
8
8
  "description": "Puppet Service for Wechaty",
9
9
  "type": "module",
10
10
  "exports": {
@@ -55,7 +55,7 @@ export const packageJson: PackageJson = {
55
55
  "@chatie/eslint-config": "^1.0.4",
56
56
  "@chatie/semver": "^0.4.7",
57
57
  "@chatie/tsconfig": "^4.6.3",
58
- "@juzi/wechaty-puppet": "^1.0.49",
58
+ "@juzi/wechaty-puppet": "^1.0.50",
59
59
  "@juzi/wechaty-puppet-mock": "^1.0.1",
60
60
  "@types/google-protobuf": "^3.15.5",
61
61
  "@types/lru-cache": "^7.5.0",
@@ -63,6 +63,7 @@ export const packageJson: PackageJson = {
63
63
  "@types/temp": "^0.9.1",
64
64
  "@types/uuid": "^8.3.4",
65
65
  "@types/ws": "^8.5.3",
66
+ "esquery": "1.4.0",
66
67
  "get-port": "^6.1.2",
67
68
  "temp": "^0.9.4",
68
69
  "typed-emitter": "^1.5.0-from-event",
@@ -73,7 +74,7 @@ export const packageJson: PackageJson = {
73
74
  "@juzi/wechaty-puppet": "^1.0.46"
74
75
  },
75
76
  "dependencies": {
76
- "@juzi/wechaty-grpc": "^1.0.43",
77
+ "@juzi/wechaty-grpc": "^1.0.47",
77
78
  "@juzi/wechaty-redux": "^1.0.1",
78
79
  "clone-class": "^1.1.1",
79
80
  "ducks": "^1.0.2",
@@ -43,7 +43,7 @@ import {
43
43
  import { log } from '../config.js'
44
44
  import { grpcError } from './grpc-error.js'
45
45
  import { EventStreamManager } from './event-stream-manager.js'
46
- import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
46
+ import { channelPayloadToPb, postPbToPayload, urlLinkPayloadToPb } from '../utils/pb-payload-helper.js'
47
47
 
48
48
  function puppetImplementation (
49
49
  puppet : PUPPET.impls.PuppetInterface,
@@ -1100,6 +1100,54 @@ function puppetImplementation (
1100
1100
  }
1101
1101
  },
1102
1102
 
1103
+ getMessageBroadcastTarget: async (call, callback) => {
1104
+ log.verbose('PuppetServiceImpl', 'getMessageBroadcastTarget()')
1105
+
1106
+ void call
1107
+ try {
1108
+ const payload = await puppet.getMessageBroadcastTarget()
1109
+
1110
+ const response = new grpcPuppet.GetMessageBroadcastTargetResponse()
1111
+ response.setContactIdsList(payload.contactIds || [])
1112
+ response.setRoomIdsList(payload.roomIds || [])
1113
+
1114
+ return callback(null, response)
1115
+ } catch (e) {
1116
+ return grpcError('getMessageBroadcastTarget', e, callback)
1117
+ }
1118
+ },
1119
+
1120
+ createMessageBroadcast: async (call, callback) => {
1121
+ log.verbose('PuppetServiceImpl', 'createMessageBroadcast()')
1122
+
1123
+ try {
1124
+ const targets = call.request.getTargetIdsList()
1125
+ const type = call.request.getType()
1126
+ const post = call.request.getContent()
1127
+
1128
+ if (!post) {
1129
+ throw new Error('no post found')
1130
+ }
1131
+ if (post.getType() !== grpcPuppet.PostType.POST_TYPE_BROADCAST) {
1132
+ throw new Error('cannot create broadcast with non-broadcast post')
1133
+ }
1134
+
1135
+ const payload = postPbToPayload(post, FileBoxUuid)
1136
+
1137
+ const id = await puppet.createMessageBroadcast(targets, type, payload)
1138
+
1139
+ const response = new grpcPuppet.CreateMessageBroadcastResponse()
1140
+ if (id) {
1141
+ response.setId(id)
1142
+ }
1143
+
1144
+ return callback(null, response)
1145
+
1146
+ } catch (e) {
1147
+ return grpcError('createMessageBroadcast', e, callback)
1148
+ }
1149
+ },
1150
+
1103
1151
  roomAdd: async (call, callback) => {
1104
1152
  log.verbose('PuppetServiceImpl', 'roomAdd()')
1105
1153
 
@@ -1764,67 +1812,7 @@ function puppetImplementation (
1764
1812
  if (type !== grpcPuppet.PostType.POST_TYPE_MOMENT) {
1765
1813
  throw new Error('cannot publish non-moment post')
1766
1814
  }
1767
- const payload: PUPPET.payloads.PostClient = {
1768
- type: PUPPET.types.Post.Moment,
1769
- sayableList: [],
1770
- rootId: post.getRootId(),
1771
- parentId: post.getParentId(),
1772
- visibleList: post.getVisibleListList(),
1773
- }
1774
- const sayableList = post.getSayableListList()
1775
- for (const sayable of sayableList) {
1776
- let sayablePayload: PUPPET.payloads.Sayable | undefined
1777
- switch (sayable.getType()) {
1778
- case grpcPuppet.SayableType.SAYABLE_TYPE_TEXT:
1779
- sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '', sayable.getMentionIdListList())
1780
- break
1781
- case grpcPuppet.SayableType.SAYABLE_TYPE_FILE: {
1782
- const fileJsonStr = sayable.getFileBox()
1783
- if (!fileJsonStr) {
1784
- break
1785
- }
1786
- const file = FileBoxUuid.fromJSON(fileJsonStr)
1787
- sayablePayload = PUPPET.payloads.sayable.attachment(file)
1788
- break
1789
- }
1790
- case grpcPuppet.SayableType.SAYABLE_TYPE_URL: {
1791
- const urlLinkPayloadPb = sayable.getUrlLink()
1792
- if (!urlLinkPayloadPb) {
1793
- break
1794
- }
1795
- const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
1796
- sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
1797
- break
1798
- }
1799
- case grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL: {
1800
- const channelPayloadPb = sayable.getChannel()
1801
- if (!channelPayloadPb) {
1802
- break
1803
- }
1804
- const channelPayload = channelPbToPayload(channelPayloadPb!)
1805
- sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
1806
- break
1807
- }
1808
- default:
1809
- throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
1810
- }
1811
- if (sayablePayload) {
1812
- payload.sayableList.push(sayablePayload)
1813
- } else {
1814
- throw new Error(`unable to fetch sayable from ${JSON.stringify(sayable.toObject())}`)
1815
- }
1816
- }
1817
-
1818
- const location = post.getLocation()
1819
- if (location) {
1820
- payload.location = {
1821
- name: location.getName() || '',
1822
- accuracy: location.getAccuracy() || 15,
1823
- address: location.getAddress() || '',
1824
- latitude: location.getLatitude(),
1825
- longitude: location.getLatitude(),
1826
- }
1827
- }
1815
+ const payload = postPbToPayload(post, FileBoxUuid)
1828
1816
 
1829
1817
  const momentId = await puppet.postPublish(payload)
1830
1818
  const response = new grpcPuppet.MomentPublishResponse()
@@ -1,8 +1,9 @@
1
- import type {
1
+ import {
2
2
  puppet,
3
3
  } from '@juzi/wechaty-grpc'
4
4
 
5
- import type * as PUPPET from '@juzi/wechaty-puppet'
5
+ import * as PUPPET from '@juzi/wechaty-puppet'
6
+ import type { FileBox, FileBoxInterface } from 'file-box'
6
7
 
7
8
  type grpcPuppet = typeof puppet
8
9
 
@@ -21,6 +22,14 @@ export const miniProgramPayloadToPb = (grpcPuppet: grpcPuppet, miniProgramPayloa
21
22
  return pbMiniProgramPayload
22
23
  }
23
24
 
25
+ export const miniProgramPbToPayload = (miniProgramPayloadPb: puppet.MiniProgramPayload) => {
26
+ const _miniProgramPayloadPb = miniProgramPayloadPb.toObject()
27
+ const miniProgramPayload: PUPPET.payloads.MiniProgram = {
28
+ ..._miniProgramPayloadPb,
29
+ }
30
+ return miniProgramPayload
31
+ }
32
+
24
33
  export const urlLinkPayloadToPb = (grpcPuppet: grpcPuppet, urlLinkPayload: PUPPET.payloads.UrlLink) => {
25
34
  const pbUrlLinkPayload = new grpcPuppet.UrlLinkPayload()
26
35
  pbUrlLinkPayload.setUrl(urlLinkPayload.url)
@@ -60,3 +69,135 @@ export const channelPbToPayload = (channelPayloadPb: puppet.ChannelPayload) => {
60
69
  }
61
70
  return channelPayload
62
71
  }
72
+
73
+ export const postPayloadToPb = async (grpcPuppet: grpcPuppet, payload: PUPPET.payloads.PostClient, serializeFileBox: (filebox: FileBoxInterface) => Promise<string>) => {
74
+ const pb = new grpcPuppet.PostPayloadClient()
75
+ pb.setType(payload.type || 0)
76
+ for (const item of payload.sayableList) {
77
+ const sayable = new grpcPuppet.PostSayable()
78
+ switch (item.type) {
79
+ case PUPPET.types.Sayable.Text:
80
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
81
+ sayable.setText(item.payload.text)
82
+ sayable.setMentionIdListList(item.payload.mentions)
83
+ break
84
+ case PUPPET.types.Sayable.Attachment: {
85
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
86
+ const serializedFileBox = typeof item.payload.filebox === 'string' ? item.payload.filebox : (await serializeFileBox(item.payload.filebox))
87
+ sayable.setFileBox(serializedFileBox)
88
+ break
89
+ }
90
+ case PUPPET.types.Sayable.Url: {
91
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
92
+ const urlLinkPayload = item.payload
93
+ const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
94
+ sayable.setUrlLink(pbUrlLinkPayload)
95
+ break
96
+ }
97
+ case PUPPET.types.Sayable.Channel: {
98
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
99
+ const channelPayload = item.payload
100
+ const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
101
+ sayable.setChannel(pbChannelPayload)
102
+ break
103
+ }
104
+ case PUPPET.types.Sayable.MiniProgram: {
105
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_MINIPROGRAM)
106
+ const miniProgramPayload = item.payload
107
+ const pbMiniProgramPayload = miniProgramPayloadToPb(grpcPuppet, miniProgramPayload)
108
+ sayable.setMiniProgram(pbMiniProgramPayload)
109
+ break
110
+ }
111
+ default:
112
+ throw new Error(`postPublish unsupported type ${item.type}`)
113
+ }
114
+ pb.addSayableList(sayable)
115
+ }
116
+ if (payload.rootId) { pb.setRootId(payload.rootId) }
117
+ if (payload.parentId) { pb.setParentId(payload.parentId) }
118
+ if (payload.location) {
119
+ const location = new grpcPuppet.LocationPayload()
120
+ location.setAccuracy(payload.location.accuracy)
121
+ location.setAddress(payload.location.address)
122
+ location.setName(payload.location.name)
123
+ location.setLatitude(payload.location.latitude)
124
+ location.setLongitude(payload.location.longitude)
125
+ pb.setLocation(location)
126
+ }
127
+ pb.setVisibleListList(payload.visibleList || [])
128
+ return pb
129
+ }
130
+
131
+ export const postPbToPayload = (post: puppet.PostPayloadClient, FileBoxUuid: typeof FileBox) => {
132
+ const payload: PUPPET.payloads.PostClient = {
133
+ type: post.getType(),
134
+ sayableList: [],
135
+ rootId: post.getRootId(),
136
+ parentId: post.getParentId(),
137
+ visibleList: post.getVisibleListList(),
138
+ }
139
+
140
+ const sayableList = post.getSayableListList()
141
+ for (const sayable of sayableList) {
142
+ let sayablePayload: PUPPET.payloads.Sayable | undefined
143
+ switch (sayable.getType()) {
144
+ case puppet.SayableType.SAYABLE_TYPE_TEXT:
145
+ sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '', sayable.getMentionIdListList())
146
+ break
147
+ case puppet.SayableType.SAYABLE_TYPE_FILE: {
148
+ const fileJsonStr = sayable.getFileBox()
149
+ if (!fileJsonStr) {
150
+ break
151
+ }
152
+ const file = FileBoxUuid.fromJSON(fileJsonStr)
153
+ sayablePayload = PUPPET.payloads.sayable.attachment(file)
154
+ break
155
+ }
156
+ case puppet.SayableType.SAYABLE_TYPE_URL: {
157
+ const urlLinkPayloadPb = sayable.getUrlLink()
158
+ if (!urlLinkPayloadPb) {
159
+ break
160
+ }
161
+ const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
162
+ sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
163
+ break
164
+ }
165
+ case puppet.SayableType.SAYABLE_TYPE_CHANNEL: {
166
+ const channelPayloadPb = sayable.getChannel()
167
+ if (!channelPayloadPb) {
168
+ break
169
+ }
170
+ const channelPayload = channelPbToPayload(channelPayloadPb!)
171
+ sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
172
+ break
173
+ }
174
+ case puppet.SayableType.SAYABLE_TYPE_MINIPROGRAM: {
175
+ const miniProgramPayloadPb = sayable.getMiniProgram()
176
+ if (!miniProgramPayloadPb) {
177
+ break
178
+ }
179
+ const miniProgramPayload = miniProgramPbToPayload(miniProgramPayloadPb)
180
+ sayablePayload = PUPPET.payloads.sayable.miniProgram(miniProgramPayload)
181
+ break
182
+ }
183
+ default:
184
+ throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
185
+ }
186
+ if (sayablePayload) {
187
+ payload.sayableList.push(sayablePayload)
188
+ } else {
189
+ throw new Error(`unable to fetch sayable from ${JSON.stringify(sayable.toObject())}`)
190
+ }
191
+ }
192
+ const location = post.getLocation()
193
+ if (location) {
194
+ payload.location = {
195
+ name: location.getName() || '',
196
+ accuracy: location.getAccuracy() || 15,
197
+ address: location.getAddress() || '',
198
+ latitude: location.getLatitude(),
199
+ longitude: location.getLatitude(),
200
+ }
201
+ }
202
+ return payload
203
+ }