@juzi/wechaty-puppet-service 1.0.23 → 1.0.26

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 (29) hide show
  1. package/dist/cjs/src/client/puppet-service.d.ts +13 -0
  2. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
  3. package/dist/cjs/src/client/puppet-service.js +188 -0
  4. package/dist/cjs/src/client/puppet-service.js.map +1 -1
  5. package/dist/cjs/src/package-json.js +3 -3
  6. package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -1
  7. package/dist/cjs/src/server/puppet-implementation.js +236 -0
  8. package/dist/cjs/src/server/puppet-implementation.js.map +1 -1
  9. package/dist/cjs/src/utils/pb-payload-helper.d.ts +8 -0
  10. package/dist/cjs/src/utils/pb-payload-helper.d.ts.map +1 -0
  11. package/dist/cjs/src/utils/pb-payload-helper.js +94 -0
  12. package/dist/cjs/src/utils/pb-payload-helper.js.map +1 -0
  13. package/dist/esm/src/client/puppet-service.d.ts +13 -0
  14. package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
  15. package/dist/esm/src/client/puppet-service.js +188 -0
  16. package/dist/esm/src/client/puppet-service.js.map +1 -1
  17. package/dist/esm/src/package-json.js +3 -3
  18. package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -1
  19. package/dist/esm/src/server/puppet-implementation.js +236 -0
  20. package/dist/esm/src/server/puppet-implementation.js.map +1 -1
  21. package/dist/esm/src/utils/pb-payload-helper.d.ts +8 -0
  22. package/dist/esm/src/utils/pb-payload-helper.d.ts.map +1 -0
  23. package/dist/esm/src/utils/pb-payload-helper.js +86 -0
  24. package/dist/esm/src/utils/pb-payload-helper.js.map +1 -0
  25. package/package.json +3 -3
  26. package/src/client/puppet-service.ts +236 -0
  27. package/src/package-json.ts +3 -3
  28. package/src/server/puppet-implementation.ts +244 -0
  29. package/src/utils/pb-payload-helper.ts +60 -0
@@ -68,6 +68,7 @@ import { packageJson } from '../package-json.js'
68
68
 
69
69
  import { GrpcManager } from './grpc-manager.js'
70
70
  import { PayloadStore } from './payload-store.js'
71
+ import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
71
72
 
72
73
  export type PuppetServiceOptions = PUPPET.PuppetOptions & {
73
74
  authority? : string
@@ -2195,6 +2196,241 @@ class PuppetService extends PUPPET.Puppet {
2195
2196
  return payload
2196
2197
  }
2197
2198
 
2199
+ /**
2200
+ *
2201
+ * Post & Moment Section
2202
+ *
2203
+ */
2204
+
2205
+ override async postPublish (payload: PUPPET.payloads.Post): Promise<void | string> {
2206
+ log.verbose('PuppetService', 'postPublish(%s)', JSON.stringify(payload))
2207
+
2208
+ if (!PUPPET.payloads.isPostClient(payload)) {
2209
+ throw new Error('can only publish client post now')
2210
+ }
2211
+ const request = new grpcPuppet.MomentPublishRequest()
2212
+ const post = new grpcPuppet.PostPayloadClient()
2213
+ post.setType(grpcPuppet.PostType.POST_TYPE_MOMENT)
2214
+ for (const item of payload.sayableList) {
2215
+ const sayable = new grpcPuppet.PostSayable()
2216
+ switch (item.type) {
2217
+ case PUPPET.types.Sayable.Text:
2218
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
2219
+ sayable.setText(item.payload.text)
2220
+ sayable.setMentionIdListList(item.payload.mentions)
2221
+ break
2222
+ case PUPPET.types.Sayable.Attachment: {
2223
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
2224
+ const serializedFileBox = typeof item.payload.filebox === 'string' ? item.payload.filebox : await this.serializeFileBox(item.payload.filebox)
2225
+ sayable.setFileBox(serializedFileBox)
2226
+ break
2227
+ }
2228
+ case PUPPET.types.Sayable.Url: {
2229
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
2230
+ const urlLinkPayload = item.payload
2231
+ const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
2232
+ sayable.setUrlLink(pbUrlLinkPayload)
2233
+ break
2234
+ }
2235
+ case PUPPET.types.Sayable.Channel: {
2236
+ sayable.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
2237
+ const channelPayload = item.payload
2238
+ const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
2239
+ sayable.setChannel(pbChannelPayload)
2240
+ break
2241
+ }
2242
+ default:
2243
+ throw new Error(`postPublish unsupported type ${item.type}`)
2244
+ }
2245
+ post.addSayableList(sayable)
2246
+ }
2247
+ request.setPost(post)
2248
+
2249
+ const result = await util.promisify(
2250
+ this.grpcManager.client.momentPublish
2251
+ .bind(this.grpcManager.client),
2252
+ )(request)
2253
+
2254
+ const momentId = result.getMomentId()
2255
+
2256
+ return momentId
2257
+ }
2258
+
2259
+ override async momentSignature (text?: string): Promise<void | string> {
2260
+ log.verbose('PuppetService', 'momentSignature(%s)', text)
2261
+
2262
+ const request = new grpcPuppet.MomentSignatureRequest()
2263
+ if (text) {
2264
+ request.setText(text)
2265
+ }
2266
+
2267
+ const response = await util.promisify(
2268
+ this.grpcManager.client.momentSignature
2269
+ .bind(this.grpcManager.client),
2270
+ )(request)
2271
+
2272
+ const signature = response.getText()
2273
+
2274
+ return signature
2275
+ }
2276
+
2277
+ override async momentCoverage (cover?: FileBoxInterface | undefined): Promise<void | FileBoxInterface> {
2278
+ log.verbose('PuppetService', 'momentCoverage(%s)', JSON.stringify(cover))
2279
+
2280
+ const request = new grpcPuppet.MomentCoverageRequest()
2281
+ if (cover) {
2282
+ const serializedFileBox = await this.serializeFileBox(cover)
2283
+ request.setFileBox(serializedFileBox)
2284
+ }
2285
+
2286
+ const response = await util.promisify(
2287
+ this.grpcManager.client.momentCoverage
2288
+ .bind(this.grpcManager.client),
2289
+ )(request)
2290
+
2291
+ const jsonText = response.getFileBox()
2292
+ if (jsonText) {
2293
+ return this.FileBoxUuid.fromJSON(jsonText)
2294
+ }
2295
+ }
2296
+
2297
+ override async postPayloadSayable (postId: string, sayableId: string): Promise<PUPPET.payloads.Sayable> {
2298
+ log.verbose('PuppetService', 'postPayloadSayable(%s, %s)', postId, sayableId)
2299
+
2300
+ const request = new grpcPuppet.PostPayloadSayableRequest()
2301
+ request.setPostId(postId)
2302
+ request.setSayableId(sayableId)
2303
+
2304
+ const response = await util.promisify(
2305
+ this.grpcManager.client.postPayloadSayable
2306
+ .bind(this.grpcManager.client),
2307
+ )(request)
2308
+
2309
+ const sayable = response.getSayable()
2310
+ let sayablePayload: PUPPET.payloads.Sayable | undefined
2311
+
2312
+ if (sayable) {
2313
+ switch (sayable.getType()) {
2314
+ case grpcPuppet.SayableType.SAYABLE_TYPE_TEXT:
2315
+ sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '', sayable.getMentionIdListList())
2316
+ break
2317
+ case grpcPuppet.SayableType.SAYABLE_TYPE_FILE: {
2318
+ const fileJsonStr = sayable.getFileBox()
2319
+ if (!fileJsonStr) {
2320
+ break
2321
+ }
2322
+ const file = this.FileBoxUuid.fromJSON(fileJsonStr)
2323
+ sayablePayload = PUPPET.payloads.sayable.attachment(file)
2324
+ break
2325
+ }
2326
+ case grpcPuppet.SayableType.SAYABLE_TYPE_URL: {
2327
+ const urlLinkPayloadPb = sayable.getUrlLink()
2328
+ if (!urlLinkPayloadPb) {
2329
+ break
2330
+ }
2331
+ const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
2332
+ sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
2333
+ break
2334
+ }
2335
+ case grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL: {
2336
+ const channelPayloadPb = sayable.getChannel()
2337
+ if (!channelPayloadPb) {
2338
+ break
2339
+ }
2340
+ const channelPayload = channelPbToPayload(channelPayloadPb!)
2341
+ sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
2342
+ break
2343
+ }
2344
+ default:
2345
+ throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
2346
+ }
2347
+ }
2348
+ if (!sayablePayload) {
2349
+ throw new Error(`cannot get sayable ${sayableId} from post ${postId}`)
2350
+ } else {
2351
+ return sayablePayload
2352
+ }
2353
+ }
2354
+
2355
+ override async postRawPayload (id: string): Promise<PUPPET.payloads.Post> {
2356
+ log.verbose('PuppetService', 'postRawPayload(%s)', id)
2357
+
2358
+ const request = new grpcPuppet.PostPayloadRequest()
2359
+ request.setPostId(id)
2360
+
2361
+ const response = await util.promisify(
2362
+ this.grpcManager.client.postPayload
2363
+ .bind(this.grpcManager.client),
2364
+ )(request)
2365
+
2366
+ const postPb = response.getPost()
2367
+ if (!postPb) {
2368
+ throw new Error(`failed to get post for id ${id}`)
2369
+ }
2370
+ const timestamp = postPb.getTimestamp()
2371
+ const payload: PUPPET.payloads.PostServer = {
2372
+ id,
2373
+ parentId: postPb.getParentId(),
2374
+ rootId: postPb.getRootId(),
2375
+ type: postPb.getType() || PUPPET.types.Post.Unspecified,
2376
+ sayableList: [],
2377
+ contactId: postPb.getContactId(),
2378
+ timestamp: timestamp ? millisecondsFromTimestamp(timestamp) : Date.now(),
2379
+ counter: {
2380
+ children: postPb.getChildren(),
2381
+ descendant: postPb.getDescendant(),
2382
+ taps: {
2383
+ [PUPPET.types.Tap.Like]: postPb.getLike(),
2384
+ },
2385
+ },
2386
+ }
2387
+ const sayablePbList = postPb.getSayableListList()
2388
+ for (const sayablePb of sayablePbList) {
2389
+ payload.sayableList.push(sayablePb.getId())
2390
+ }
2391
+ return payload
2392
+ }
2393
+
2394
+ override async postRawPayloadParser (payload: PUPPET.payloads.Post): Promise<PUPPET.payloads.Post> {
2395
+ // log.silly('PuppetService', 'postRawPayloadParser({id:%s})', payload.id)
2396
+ // passthrough
2397
+ return payload
2398
+ }
2399
+
2400
+ override async postComment (postId: string, text: string, mentionIdList?: string[] | undefined): Promise<string | void> {
2401
+ log.verbose('PuppetService', 'postComment(%s, %s, %s)', postId, text, JSON.stringify(mentionIdList))
2402
+
2403
+ const request = new grpcPuppet.PostCommentRequest()
2404
+ request.setPostId(postId)
2405
+ request.setText(text)
2406
+ request.setMentionIdListList(mentionIdList || [])
2407
+
2408
+ const response = await util.promisify(
2409
+ this.grpcManager.client.postComment
2410
+ .bind(this.grpcManager.client),
2411
+ )(request)
2412
+
2413
+ const commentId = response.getCommentId()
2414
+
2415
+ return commentId
2416
+ }
2417
+
2418
+ override async postLike (postId: string): Promise<string | void> {
2419
+ log.verbose('PuppetService', 'postLike(%s)', postId)
2420
+
2421
+ const request = new grpcPuppet.PostLikeRequest()
2422
+ request.setPostId(postId)
2423
+
2424
+ const response = await util.promisify(
2425
+ this.grpcManager.client.postLike
2426
+ .bind(this.grpcManager.client),
2427
+ )(request)
2428
+
2429
+ const tapId = response.getTapId()
2430
+
2431
+ return tapId
2432
+ }
2433
+
2198
2434
  /**
2199
2435
  * @deprecated Will be removed in v2.0
2200
2436
  */
@@ -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.23",
7
+ "version": "1.0.26",
8
8
  "description": "Puppet Service for Wechaty",
9
9
  "type": "module",
10
10
  "exports": {
@@ -69,10 +69,10 @@ export const packageJson: PackageJson = {
69
69
  "why-is-node-running": "^2.2.1"
70
70
  },
71
71
  "peerDependencies": {
72
- "@juzi/wechaty-puppet": "^1.0.30"
72
+ "@juzi/wechaty-puppet": "^1.0.33"
73
73
  },
74
74
  "dependencies": {
75
- "@juzi/wechaty-grpc": "^1.0.17",
75
+ "@juzi/wechaty-grpc": "^1.0.24",
76
76
  "@juzi/wechaty-redux": "^1.0.1",
77
77
  "clone-class": "^1.1.1",
78
78
  "ducks": "^1.0.2",
@@ -47,6 +47,7 @@ import {
47
47
  import { log } from '../config.js'
48
48
  import { grpcError } from './grpc-error.js'
49
49
  import { EventStreamManager } from './event-stream-manager.js'
50
+ import { channelPayloadToPb, channelPbToPayload, urlLinkPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
50
51
 
51
52
  function puppetImplementation (
52
53
  puppet : PUPPET.impls.PuppetInterface,
@@ -1746,6 +1747,249 @@ function puppetImplementation (
1746
1747
  }
1747
1748
  },
1748
1749
 
1750
+ /**
1751
+ *
1752
+ * Post & Moment
1753
+ *
1754
+ */
1755
+
1756
+ momentPublish: async (call, callback) => {
1757
+ log.verbose('PuppetServiceImpl', 'momentPublish()')
1758
+
1759
+ try {
1760
+ const post = call.request.getPost()
1761
+ if (!post) {
1762
+ throw new Error('no post found')
1763
+ }
1764
+ const type = post.getType()
1765
+ if (type !== grpcPuppet.PostType.POST_TYPE_MOMENT) {
1766
+ throw new Error('cannot publish non-moment post')
1767
+ }
1768
+ const payload: PUPPET.payloads.PostClient = {
1769
+ type: PUPPET.types.Post.Moment,
1770
+ sayableList: [],
1771
+ }
1772
+ const sayableList = post.getSayableListList()
1773
+ for (const sayable of sayableList) {
1774
+ let sayablePayload: PUPPET.payloads.Sayable | undefined
1775
+ switch (sayable.getType()) {
1776
+ case grpcPuppet.SayableType.SAYABLE_TYPE_TEXT:
1777
+ sayablePayload = PUPPET.payloads.sayable.text(sayable.getText() || '', sayable.getMentionIdListList())
1778
+ break
1779
+ case grpcPuppet.SayableType.SAYABLE_TYPE_FILE: {
1780
+ const fileJsonStr = sayable.getFileBox()
1781
+ if (!fileJsonStr) {
1782
+ break
1783
+ }
1784
+ const file = FileBoxUuid.fromJSON(fileJsonStr)
1785
+ sayablePayload = PUPPET.payloads.sayable.attachment(file)
1786
+ break
1787
+ }
1788
+ case grpcPuppet.SayableType.SAYABLE_TYPE_URL: {
1789
+ const urlLinkPayloadPb = sayable.getUrlLink()
1790
+ if (!urlLinkPayloadPb) {
1791
+ break
1792
+ }
1793
+ const urlLinkPayload = urlLinkPbToPayload(urlLinkPayloadPb)
1794
+ sayablePayload = PUPPET.payloads.sayable.url(urlLinkPayload)
1795
+ break
1796
+ }
1797
+ case grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL: {
1798
+ const channelPayloadPb = sayable.getChannel()
1799
+ if (!channelPayloadPb) {
1800
+ break
1801
+ }
1802
+ const channelPayload = channelPbToPayload(channelPayloadPb!)
1803
+ sayablePayload = PUPPET.payloads.sayable.channel(channelPayload)
1804
+ break
1805
+ }
1806
+ default:
1807
+ throw new Error(`unsupported postSayableType type ${sayable.getType()}`)
1808
+ }
1809
+ if (sayablePayload) {
1810
+ payload.sayableList.push(sayablePayload)
1811
+ } else {
1812
+ throw new Error(`unable to fetch sayable from ${JSON.stringify(sayable.toObject())}`)
1813
+ }
1814
+ }
1815
+
1816
+ const momentId = await puppet.postPublish(payload)
1817
+ const response = new grpcPuppet.MomentPublishResponse()
1818
+ if (momentId) {
1819
+ response.setMomentId(momentId)
1820
+ }
1821
+
1822
+ return callback(null, response)
1823
+
1824
+ } catch (e) {
1825
+ return grpcError('momentPublish', e, callback)
1826
+ }
1827
+
1828
+ },
1829
+
1830
+ postComment: async (call, callback) => {
1831
+ log.verbose('PuppetServiceImpl', 'postComment()')
1832
+
1833
+ try {
1834
+ const postId = call.request.getPostId()
1835
+ const mentionIdList = call.request.getMentionIdListList()
1836
+ const text = call.request.getText()
1837
+
1838
+ const result = await puppet.postComment(postId, text, mentionIdList)
1839
+ const response = new grpcPuppet.PostCommentResponse()
1840
+ if (result) { response.setCommentId(result) }
1841
+
1842
+ return callback(null, response)
1843
+ } catch (e) {
1844
+ return grpcError('postComment', e, callback)
1845
+ }
1846
+ },
1847
+
1848
+ postLike: async (call, callback) => {
1849
+ log.verbose('PuppetServiceImpl', 'postLike()')
1850
+
1851
+ try {
1852
+ const postId = call.request.getPostId()
1853
+
1854
+ const tapId = await puppet.postLike(postId)
1855
+ const response = new grpcPuppet.PostLikeResponse()
1856
+ if (tapId) { response.setTapId(tapId) }
1857
+
1858
+ return callback(null, response)
1859
+ } catch (e) {
1860
+ return grpcError('postLike', e, callback)
1861
+ }
1862
+ },
1863
+
1864
+ momentSignature: async (call, callback) => {
1865
+ log.verbose('PuppetServiceImpl', 'momentSignature()')
1866
+
1867
+ try {
1868
+ const signature = call.request.getText()
1869
+ const result = await puppet.momentSignature(signature || undefined)
1870
+
1871
+ const response = new grpcPuppet.MomentSignatureResponse()
1872
+ if (result) {
1873
+ response.setText(result)
1874
+ }
1875
+
1876
+ return callback(null, response)
1877
+ } catch (e) {
1878
+ return grpcError('momentSignature', e, callback)
1879
+ }
1880
+ },
1881
+
1882
+ momentCoverage: async (call, callback) => {
1883
+ log.verbose('PuppetServiceImpl', 'momentCoverage()')
1884
+
1885
+ try {
1886
+ const fileJsonStr = call.request.getFileBox()
1887
+
1888
+ const response = new grpcPuppet.MomentCoverageResponse()
1889
+
1890
+ if (fileJsonStr) {
1891
+ const file = FileBoxUuid.fromJSON(fileJsonStr)
1892
+ await puppet.momentCoverage(file)
1893
+ } else {
1894
+ const file = await puppet.momentCoverage()
1895
+ if (file) {
1896
+ response.setFileBox(await serializeFileBox(file))
1897
+ } else {
1898
+ throw new Error('fail to get moment coverage')
1899
+ }
1900
+ }
1901
+
1902
+ return callback(null, response)
1903
+ } catch (e) {
1904
+ return grpcError('momentCoverage', e, callback)
1905
+ }
1906
+ },
1907
+
1908
+ postPayload: async (call, callback) => {
1909
+ log.verbose('PuppetServiceImpl', 'postPayloadSayable()')
1910
+
1911
+ try {
1912
+ const postId = call.request.getPostId()
1913
+ const postPayload = await puppet.postPayload(postId) as PUPPET.payloads.PostServer
1914
+
1915
+ const response = new grpcPuppet.PostPayloadResponse()
1916
+ const postPayloadPb = new grpcPuppet.PostPayloadServer()
1917
+ if (postPayload.parentId) { postPayloadPb.setParentId(postPayload.parentId) }
1918
+ if (postPayload.rootId) { postPayloadPb.setRootId(postPayload.rootId) }
1919
+ if (postPayload.type) {
1920
+ postPayloadPb.setType(postPayload.type)
1921
+ } else {
1922
+ postPayloadPb.setType(grpcPuppet.PostType.POST_TYPE_UNSPECIFIED)
1923
+ }
1924
+ if (postPayload.contactId) { postPayloadPb.setContactId(postPayload.contactId) }
1925
+ postPayloadPb.setTimestamp(timestampFromMilliseconds(postPayload.timestamp))
1926
+ if (postPayload.counter.children) { postPayloadPb.setChildren(postPayload.counter.children) }
1927
+ if (postPayload.counter.descendant) { postPayloadPb.setDescendant(postPayload.counter.descendant) }
1928
+ if (postPayload.counter.taps && postPayload.counter.taps[PUPPET.types.Tap.Like]) {
1929
+ postPayloadPb.setLike(postPayload.counter.taps[PUPPET.types.Tap.Like]!)
1930
+ }
1931
+ const sayablePbList = []
1932
+ for (const sayable of postPayload.sayableList) {
1933
+ const sayablePb = new grpcPuppet.PostSayable()
1934
+ sayablePb.setId(sayable)
1935
+ sayablePbList.push(sayablePb)
1936
+ }
1937
+ postPayloadPb.setSayableListList(sayablePbList)
1938
+ response.setPost(postPayloadPb)
1939
+
1940
+ return callback(null, response)
1941
+ } catch (e) {
1942
+ return grpcError('postPayloadSayable', e, callback)
1943
+ }
1944
+
1945
+ },
1946
+
1947
+ postPayloadSayable: async (call, callback) => {
1948
+ log.verbose('PuppetServiceImpl', 'postPayloadSayable()')
1949
+
1950
+ try {
1951
+ const postId = call.request.getPostId()
1952
+ const sayableId = call.request.getSayableId()
1953
+
1954
+ const result = await puppet.postPayloadSayable(postId, sayableId)
1955
+ const response = new grpcPuppet.PostPayloadSayableResponse()
1956
+ const sayablePb = new grpcPuppet.PostSayable()
1957
+ switch (result.type) {
1958
+ case PUPPET.types.Sayable.Text:
1959
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_TEXT)
1960
+ sayablePb.setText(result.payload.text)
1961
+ sayablePb.setMentionIdListList(result.payload.mentions)
1962
+ break
1963
+ case PUPPET.types.Sayable.Attachment: {
1964
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_FILE)
1965
+ const serializedFileBox = typeof result.payload.filebox === 'string' ? result.payload.filebox : await serializeFileBox(result.payload.filebox)
1966
+ sayablePb.setFileBox(serializedFileBox)
1967
+ break
1968
+ }
1969
+ case PUPPET.types.Sayable.Url: {
1970
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_URL)
1971
+ const urlLinkPayload = result.payload
1972
+ const pbUrlLinkPayload = urlLinkPayloadToPb(grpcPuppet, urlLinkPayload)
1973
+ sayablePb.setUrlLink(pbUrlLinkPayload)
1974
+ break
1975
+ }
1976
+ case PUPPET.types.Sayable.Channel: {
1977
+ sayablePb.setType(grpcPuppet.SayableType.SAYABLE_TYPE_CHANNEL)
1978
+ const channelPayload = result.payload
1979
+ const pbChannelPayload = channelPayloadToPb(grpcPuppet, channelPayload)
1980
+ sayablePb.setChannel(pbChannelPayload)
1981
+ break
1982
+ }
1983
+ default:
1984
+ throw new Error(`postPayloadSayable unsupported type ${result.type}`)
1985
+ }
1986
+
1987
+ return callback(null, response)
1988
+ } catch (e) {
1989
+ return grpcError('postPayloadSayable', e, callback)
1990
+ }
1991
+ },
1992
+
1749
1993
  download: async (call) => {
1750
1994
  log.verbose('PuppetServiceImpl', 'download()')
1751
1995
 
@@ -0,0 +1,60 @@
1
+ import type {
2
+ puppet,
3
+ } from '@juzi/wechaty-grpc'
4
+
5
+ import type * as PUPPET from '@juzi/wechaty-puppet'
6
+
7
+ type grpcPuppet = typeof puppet
8
+
9
+ export const miniProgramPayloadToPb = (grpcPuppet: grpcPuppet, miniProgramPayload: PUPPET.payloads.MiniProgram) => {
10
+ const pbMiniProgramPayload = new grpcPuppet.MiniProgramPayload()
11
+ if (miniProgramPayload.appid) { pbMiniProgramPayload.setAppid(miniProgramPayload.appid) }
12
+ if (miniProgramPayload.description) { pbMiniProgramPayload.setDescription(miniProgramPayload.description) }
13
+ if (miniProgramPayload.iconUrl) { pbMiniProgramPayload.setIconUrl(miniProgramPayload.iconUrl) }
14
+ if (miniProgramPayload.pagePath) { pbMiniProgramPayload.setPagePath(miniProgramPayload.pagePath) }
15
+ if (miniProgramPayload.shareId) { pbMiniProgramPayload.setShareId(miniProgramPayload.shareId) }
16
+ if (miniProgramPayload.thumbKey) { pbMiniProgramPayload.setThumbKey(miniProgramPayload.thumbKey) }
17
+ if (miniProgramPayload.thumbUrl) { pbMiniProgramPayload.setThumbUrl(miniProgramPayload.thumbUrl) }
18
+ if (miniProgramPayload.title) { pbMiniProgramPayload.setTitle(miniProgramPayload.title) }
19
+ if (miniProgramPayload.username) { pbMiniProgramPayload.setUsername(miniProgramPayload.username) }
20
+
21
+ return pbMiniProgramPayload
22
+ }
23
+
24
+ export const urlLinkPayloadToPb = (grpcPuppet: grpcPuppet, urlLinkPayload: PUPPET.payloads.UrlLink) => {
25
+ const pbUrlLinkPayload = new grpcPuppet.UrlLinkPayload()
26
+ pbUrlLinkPayload.setUrl(urlLinkPayload.url)
27
+ pbUrlLinkPayload.setTitle(urlLinkPayload.title)
28
+ if (urlLinkPayload.description) { pbUrlLinkPayload.setDescription(urlLinkPayload.description) }
29
+ if (urlLinkPayload.thumbnailUrl) { pbUrlLinkPayload.setThumbnailUrl(urlLinkPayload.thumbnailUrl) }
30
+ return pbUrlLinkPayload
31
+ }
32
+
33
+ export const urlLinkPbToPayload = (urlLinkPayloadPb: puppet.UrlLinkPayload) => {
34
+ const _urlLinkPayloadPb = urlLinkPayloadPb.toObject()
35
+ const urlLinkPayload: PUPPET.payloads.UrlLink = {
36
+ ..._urlLinkPayloadPb,
37
+ }
38
+ return urlLinkPayload
39
+ }
40
+
41
+ export const channelPayloadToPb = (grpcPuppet: grpcPuppet, channelPayload: PUPPET.payloads.Channel) => {
42
+ const pbChannelPayload = new grpcPuppet.ChannelPayload()
43
+ if (channelPayload.avatar) { pbChannelPayload.setAvatar(channelPayload.avatar) }
44
+ if (channelPayload.coverUrl) { pbChannelPayload.setCoverUrl(channelPayload.coverUrl) }
45
+ if (channelPayload.desc) { pbChannelPayload.setDesc(channelPayload.desc) }
46
+ if (channelPayload.extras) { pbChannelPayload.setExtras(channelPayload.extras) }
47
+ if (channelPayload.feedType) { pbChannelPayload.setFeedType(channelPayload.feedType) }
48
+ if (channelPayload.nickname) { pbChannelPayload.setNickname(channelPayload.nickname) }
49
+ if (channelPayload.thumbUrl) { pbChannelPayload.setThumbUrl(channelPayload.thumbUrl) }
50
+ if (channelPayload.url) { pbChannelPayload.setUrl(channelPayload.url) }
51
+ return pbChannelPayload
52
+ }
53
+
54
+ export const channelPbToPayload = (channelPayloadPb: puppet.ChannelPayload) => {
55
+ const _channelPayloadPb = channelPayloadPb.toObject()
56
+ const channelPayload: PUPPET.payloads.Channel = {
57
+ ..._channelPayloadPb,
58
+ }
59
+ return channelPayload
60
+ }