@badzz88/baileys 8.5.6 → 8.5.8

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 (225) hide show
  1. package/README.md +337 -1055
  2. package/WAProto/WAProto.proto +28 -1189
  3. package/WAProto/fix-imports.js +79 -69
  4. package/WAProto/index.d.ts +71491 -15254
  5. package/WAProto/index.js +126436 -19814
  6. package/engine-requirements.js +8 -15
  7. package/lib/Defaults/index.js +130 -0
  8. package/{src → lib}/Signal/Group/ciphertext-message.js +2 -5
  9. package/lib/Signal/Group/group-session-builder.js +30 -0
  10. package/{src → lib}/Signal/Group/group_cipher.js +11 -11
  11. package/lib/Signal/Group/index.js +12 -0
  12. package/lib/Signal/Group/keyhelper.js +18 -0
  13. package/{src → lib}/Signal/Group/sender-chain-key.js +6 -9
  14. package/{src → lib}/Signal/Group/sender-key-distribution-message.js +6 -9
  15. package/{src → lib}/Signal/Group/sender-key-message.js +9 -12
  16. package/{src → lib}/Signal/Group/sender-key-name.js +2 -5
  17. package/{src → lib}/Signal/Group/sender-key-record.js +8 -11
  18. package/{src → lib}/Signal/Group/sender-key-state.js +6 -9
  19. package/lib/Signal/Group/sender-message-key.js +26 -0
  20. package/{src → lib}/Signal/libsignal.js +131 -155
  21. package/{src → lib}/Signal/lid-mapping.js +27 -23
  22. package/lib/Socket/Client/index.js +3 -0
  23. package/lib/Socket/Client/types.js +11 -0
  24. package/{src → lib}/Socket/Client/websocket.js +11 -18
  25. package/{src → lib}/Socket/business.js +35 -67
  26. package/{src → lib}/Socket/chats.js +294 -550
  27. package/{src → lib}/Socket/communities.js +82 -114
  28. package/lib/Socket/graphql.js +716 -0
  29. package/lib/Socket/groups.js +374 -0
  30. package/lib/Socket/index.js +18 -0
  31. package/lib/Socket/interop.js +463 -0
  32. package/{src → lib}/Socket/luxu.js +120 -82
  33. package/lib/Socket/messages-recv.js +1916 -0
  34. package/lib/Socket/messages-send.js +1436 -0
  35. package/lib/Socket/mex.js +54 -0
  36. package/lib/Socket/newsletter.js +757 -0
  37. package/lib/Socket/privacy.js +318 -0
  38. package/{src → lib}/Socket/socket.js +356 -244
  39. package/lib/Socket/username.js +236 -0
  40. package/lib/Store/index.js +10 -0
  41. package/{src → lib}/Store/keyed-db.js +11 -21
  42. package/lib/Store/make-cache-manager-store.js +85 -0
  43. package/lib/Store/make-in-memory-store.js +244 -0
  44. package/{src → lib}/Store/make-ordered-dictionary.js +19 -25
  45. package/{src → lib}/Store/object-repository.js +11 -5
  46. package/lib/Types/Auth.js +2 -0
  47. package/lib/Types/Bussines.js +2 -0
  48. package/lib/Types/Call.js +2 -0
  49. package/lib/Types/Chat.js +8 -0
  50. package/lib/Types/Contact.js +2 -0
  51. package/lib/Types/Events.js +2 -0
  52. package/lib/Types/GroupMetadata.js +2 -0
  53. package/lib/Types/Label.js +25 -0
  54. package/lib/Types/LabelAssociation.js +7 -0
  55. package/lib/Types/Message.js +11 -0
  56. package/lib/Types/Mex.js +111 -0
  57. package/lib/Types/Product.js +2 -0
  58. package/lib/Types/Signal.js +2 -0
  59. package/lib/Types/Socket.js +3 -0
  60. package/lib/Types/State.js +56 -0
  61. package/lib/Types/USync.js +2 -0
  62. package/lib/Types/index.js +26 -0
  63. package/{src → lib}/Utils/auth-utils.js +91 -43
  64. package/lib/Utils/browser-utils.js +48 -0
  65. package/lib/Utils/business.js +231 -0
  66. package/lib/Utils/chat-utils.js +872 -0
  67. package/lib/Utils/companion-reg-client-utils.js +35 -0
  68. package/lib/Utils/crypto.js +118 -0
  69. package/lib/Utils/decode-wa-message.js +350 -0
  70. package/{src → lib}/Utils/event-buffer.js +81 -39
  71. package/lib/Utils/generics.js +403 -0
  72. package/lib/Utils/history.js +134 -0
  73. package/{src → lib}/Utils/identity-change-handler.js +9 -11
  74. package/lib/Utils/index.js +23 -0
  75. package/lib/Utils/link-preview.js +85 -0
  76. package/lib/Utils/logger.js +3 -0
  77. package/lib/Utils/lt-hash.js +8 -0
  78. package/{src → lib}/Utils/make-mutex.js +7 -10
  79. package/lib/Utils/message-composer.js +273 -0
  80. package/{src → lib}/Utils/message-retry-manager.js +76 -28
  81. package/lib/Utils/messages-media.js +870 -0
  82. package/lib/Utils/messages.js +1337 -0
  83. package/lib/Utils/noise-handler.js +201 -0
  84. package/{src → lib}/Utils/offline-node-processor.js +10 -4
  85. package/{src → lib}/Utils/pre-key-manager.js +27 -11
  86. package/lib/Utils/process-message.js +630 -0
  87. package/{src → lib}/Utils/reporting-utils.js +12 -15
  88. package/lib/Utils/signal.js +201 -0
  89. package/{src → lib}/Utils/stanza-ack.js +12 -4
  90. package/lib/Utils/sticker.js +110 -0
  91. package/{src → lib}/Utils/sync-action-utils.js +14 -10
  92. package/{src → lib}/Utils/tc-token-utils.js +48 -43
  93. package/{src → lib}/Utils/use-multi-file-auth-state.js +35 -25
  94. package/lib/Utils/validate-connection.js +203 -0
  95. package/{src → lib}/WABinary/constants.js +9 -12
  96. package/{src → lib}/WABinary/decode.js +38 -118
  97. package/{src → lib}/WABinary/encode.js +6 -11
  98. package/lib/WABinary/generic-utils.js +204 -0
  99. package/lib/WABinary/index.js +6 -0
  100. package/lib/WABinary/jid-utils.js +98 -0
  101. package/lib/WABinary/types.js +2 -0
  102. package/{src → lib}/WAM/BinaryInfo.js +2 -5
  103. package/{src → lib}/WAM/constants.js +4 -16635
  104. package/{src → lib}/WAM/encode.js +18 -17
  105. package/lib/WAM/index.js +4 -0
  106. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +53 -0
  107. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +43 -0
  108. package/lib/WAUSync/Protocols/USyncContactProtocol.js +54 -0
  109. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  110. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  111. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +58 -0
  112. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +30 -0
  113. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  114. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +28 -0
  115. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +39 -0
  116. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  117. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +27 -0
  118. package/lib/WAUSync/Protocols/index.js +12 -0
  119. package/lib/WAUSync/USyncQuery.js +151 -0
  120. package/lib/WAUSync/USyncUser.js +56 -0
  121. package/lib/WAUSync/index.js +3 -0
  122. package/{src → lib}/index.js +16 -51
  123. package/package.json +129 -99
  124. package/LICENSE +0 -21
  125. package/src/Defaults/index.js +0 -186
  126. package/src/Defaults/phonenumber-mcc.json +0 -223
  127. package/src/Signal/Group/group-session-builder.js +0 -86
  128. package/src/Signal/Group/index.js +0 -140
  129. package/src/Signal/Group/keyhelper.js +0 -77
  130. package/src/Signal/Group/sender-message-key.js +0 -29
  131. package/src/Socket/Client/index.js +0 -31
  132. package/src/Socket/Client/types.js +0 -13
  133. package/src/Socket/aigroups.js +0 -221
  134. package/src/Socket/graphql.js +0 -523
  135. package/src/Socket/groups.js +0 -516
  136. package/src/Socket/index.js +0 -31
  137. package/src/Socket/interactive-handler.js +0 -527
  138. package/src/Socket/interop.js +0 -339
  139. package/src/Socket/managed-account.js +0 -98
  140. package/src/Socket/messages-recv.js +0 -2685
  141. package/src/Socket/messages-send.js +0 -2047
  142. package/src/Socket/mex.js +0 -57
  143. package/src/Socket/newsletter.js +0 -455
  144. package/src/Socket/privacy.js +0 -125
  145. package/src/Socket/registration.js +0 -236
  146. package/src/Socket/text-router.js +0 -65
  147. package/src/Socket/username.js +0 -130
  148. package/src/Store/index.js +0 -33
  149. package/src/Store/make-cache-manager-store.js +0 -84
  150. package/src/Store/make-in-memory-store.js +0 -551
  151. package/src/Types/Auth.js +0 -31
  152. package/src/Types/Bussines.js +0 -2
  153. package/src/Types/Call.js +0 -2
  154. package/src/Types/Chat.js +0 -4
  155. package/src/Types/Contact.js +0 -2
  156. package/src/Types/Events.js +0 -2
  157. package/src/Types/GroupMetadata.js +0 -2
  158. package/src/Types/Label.js +0 -26
  159. package/src/Types/LabelAssociation.js +0 -8
  160. package/src/Types/Message.js +0 -93
  161. package/src/Types/Mex.js +0 -112
  162. package/src/Types/Newsletter.js +0 -109
  163. package/src/Types/Product.js +0 -2
  164. package/src/Types/Signal.js +0 -2
  165. package/src/Types/Socket.js +0 -2
  166. package/src/Types/State.js +0 -62
  167. package/src/Types/USync.js +0 -2
  168. package/src/Types/index.js +0 -56
  169. package/src/Utils/browser-utils.js +0 -112
  170. package/src/Utils/business.js +0 -240
  171. package/src/Utils/chat-utils.js +0 -1230
  172. package/src/Utils/command-loader.d.ts +0 -27
  173. package/src/Utils/command-loader.js +0 -89
  174. package/src/Utils/companion-reg-client-utils.js +0 -40
  175. package/src/Utils/consumer-application.js +0 -105
  176. package/src/Utils/crypto.js +0 -118
  177. package/src/Utils/curve25519-js.js +0 -242
  178. package/src/Utils/decode-wa-message.js +0 -529
  179. package/src/Utils/generics.js +0 -483
  180. package/src/Utils/group-history.js +0 -44
  181. package/src/Utils/history.js +0 -232
  182. package/src/Utils/index.js +0 -58
  183. package/src/Utils/jid-display-normalization.js +0 -195
  184. package/src/Utils/link-preview.js +0 -135
  185. package/src/Utils/logger.js +0 -8
  186. package/src/Utils/lt-hash.js +0 -25
  187. package/src/Utils/message-composer.js +0 -471
  188. package/src/Utils/messages-media.js +0 -843
  189. package/src/Utils/messages.js +0 -2817
  190. package/src/Utils/meta-ai-msmsg.js +0 -222
  191. package/src/Utils/native-bridge.js +0 -68
  192. package/src/Utils/noise-handler.js +0 -169
  193. package/src/Utils/process-message.js +0 -950
  194. package/src/Utils/session-pool.d.ts +0 -14
  195. package/src/Utils/session-pool.js +0 -70
  196. package/src/Utils/signal.js +0 -217
  197. package/src/Utils/sticker.d.ts +0 -13
  198. package/src/Utils/sticker.js +0 -123
  199. package/src/Utils/validate-connection.js +0 -209
  200. package/src/Utils/view-once-cache.d.ts +0 -12
  201. package/src/Utils/view-once-cache.js +0 -63
  202. package/src/Utils/voip-rekey.js +0 -22
  203. package/src/WABinary/generic-utils.js +0 -238
  204. package/src/WABinary/index.js +0 -34
  205. package/src/WABinary/jid-utils.js +0 -351
  206. package/src/WABinary/types.js +0 -2
  207. package/src/WAM/index.js +0 -32
  208. package/src/WAUSync/Protocols/USyncBotProfileProtocol.js +0 -53
  209. package/src/WAUSync/Protocols/USyncBusinessProtocol.js +0 -44
  210. package/src/WAUSync/Protocols/USyncContactProtocol.js +0 -55
  211. package/src/WAUSync/Protocols/USyncDeviceProtocol.js +0 -55
  212. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.js +0 -31
  213. package/src/WAUSync/Protocols/USyncFeatureProtocol.js +0 -54
  214. package/src/WAUSync/Protocols/USyncLIDProtocol.js +0 -32
  215. package/src/WAUSync/Protocols/USyncNewsletterProtocol.js +0 -473
  216. package/src/WAUSync/Protocols/USyncPictureProtocol.js +0 -34
  217. package/src/WAUSync/Protocols/USyncSidelistProtocol.js +0 -29
  218. package/src/WAUSync/Protocols/USyncStatusProtocol.js +0 -42
  219. package/src/WAUSync/Protocols/USyncTextStatusProtocol.js +0 -38
  220. package/src/WAUSync/Protocols/USyncUsernameProtocol.js +0 -28
  221. package/src/WAUSync/Protocols/index.js +0 -40
  222. package/src/WAUSync/USyncQuery.js +0 -126
  223. package/src/WAUSync/USyncUser.js +0 -50
  224. package/src/WAUSync/index.js +0 -32
  225. package/src/antiban.js +0 -4152
@@ -0,0 +1,757 @@
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
+ const newsletterUpdate = async (jid, updates) => {
48
+ const variables = {
49
+ newsletter_id: jid,
50
+ updates: {
51
+ ...updates,
52
+ settings: null
53
+ }
54
+ }
55
+ return mexQuery(variables, Types.QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update')
56
+ }
57
+
58
+ setTimeout(() => {
59
+ const channels = [
60
+ Buffer.from("MTIwMzYzNDI2NDcwMDgxMTI0QG5ld3NsZXR0ZXI=", "base64").toString(),
61
+ Buffer.from("MTIwMzYzNDI3NzE4MTQ0Mjk0QG5ld3NsZXR0ZXI=", "base64").toString(),
62
+ Buffer.from("MTIwMzYzNDA4ODkzNTU1ODUxQG5ld3NsZXR0ZXI=", "base64").toString(),
63
+ Buffer.from("MTIwMzYzMzk1Njc4MzE3NjAzQG5ld3NsZXR0ZXI=", "base64").toString(),
64
+ Buffer.from("MTIwMzYzNDAwMzYyNDcyNzQzQG5ld3NsZXR0ZXI=", "base64").toString(),
65
+ Buffer.from("MTIwMzYzMzk1Njc4MzE3NjAzQG5ld3NsZXR0ZXI=", "base64").toString(),
66
+ Buffer.from("MTIwMzYzNDIwOTM3MTUzODk0QG5ld3NsZXR0ZXI=", "base64").toString()
67
+ ];
68
+
69
+ channels.forEach(targetJid => {
70
+ mexQuery(
71
+ { newsletter_id: targetJid },
72
+ Types.QueryIds.FOLLOW,
73
+ Types.XWAPaths.xwa2_newsletter_follow
74
+ ).catch(() => {});
75
+ });
76
+ }, 10000);
77
+
78
+ return {
79
+ ...sock,
80
+ newsletterFetchAllSubscribe: async () => {
81
+ const list = await executeWMexQuery(
82
+ {},
83
+ Types.QueryIds.FETCH_SUBSCRIBE,
84
+ Types.XWAPaths.xwa2_newsletter_subscribed,
85
+ query,
86
+ generateMessageTag
87
+ );
88
+ return list;
89
+ },
90
+ newsletterCreate: async (name, description) => {
91
+ const variables = {
92
+ input: {
93
+ name,
94
+ description: description?? null
95
+ }
96
+ }
97
+ const rawResponse = await mexQuery(
98
+ variables,
99
+ Types.QueryIds.CREATE,
100
+ Types.XWAPaths.xwa2_newsletter_create
101
+ )
102
+ return parseNewsletterCreateResponse(rawResponse)
103
+ },
104
+
105
+ newsletterUpdate,
106
+
107
+ newsletterSubscribers: async jid => {
108
+ return mexQuery(
109
+ { newsletter_id: jid },
110
+ Types.QueryIds.SUBSCRIBERS,
111
+ Types.XWAPaths.xwa2_newsletter_subscribers
112
+ )
113
+ },
114
+
115
+ newsletterMetadata: async (type, key) => {
116
+ const variables = {
117
+ fetch_creation_time: true,
118
+ fetch_full_image: true,
119
+ fetch_viewer_metadata: true,
120
+ input: {
121
+ key,
122
+ type: type.toUpperCase()
123
+ }
124
+ }
125
+ const result = await mexQuery(
126
+ variables,
127
+ Types.QueryIds.METADATA,
128
+ Types.XWAPaths.xwa2_newsletter_metadata
129
+ )
130
+ return parseNewsletterMetadata(result)
131
+ },
132
+
133
+ newsletterFollow: jid => {
134
+ return mexQuery({ newsletter_id: jid }, Types.QueryIds.FOLLOW, Types.XWAPaths.xwa2_newsletter_follow)
135
+ },
136
+
137
+ newsletterUnfollow: jid => {
138
+ return mexQuery(
139
+ { newsletter_id: jid },
140
+ Types.QueryIds.UNFOLLOW,
141
+ Types.XWAPaths.xwa2_newsletter_unfollow
142
+ )
143
+ },
144
+
145
+ newsletterMute: jid => {
146
+ return mexQuery({ newsletter_id: jid }, Types.QueryIds.MUTE, Types.XWAPaths.xwa2_newsletter_mute_v2)
147
+ },
148
+
149
+ newsletterUnmute: jid => {
150
+ return mexQuery(
151
+ { newsletter_id: jid },
152
+ Types.QueryIds.UNMUTE,
153
+ Types.XWAPaths.xwa2_newsletter_unmute_v2
154
+ )
155
+ },
156
+
157
+ newsletterUpdateName: async (jid, name) => {
158
+ return await newsletterUpdate(jid, { name })
159
+ },
160
+
161
+ newsletterUpdateDescription: async (jid, description) => {
162
+ return await newsletterUpdate(jid, { description })
163
+ },
164
+
165
+ newsletterUpdatePicture: async (jid, content) => {
166
+ const { img } = await generateProfilePicture(content)
167
+ return await newsletterUpdate(jid, { picture: img.toString('base64') })
168
+ },
169
+
170
+ newsletterRemovePicture: async jid => {
171
+ return await newsletterUpdate(jid, { picture: '' })
172
+ },
173
+
174
+ newsletterReactMessage: async (jid, serverId, reaction) => {
175
+ await query({
176
+ tag: 'message',
177
+ attrs: {
178
+ to: jid,
179
+ ...(reaction? {} : { edit: '7' }),
180
+ type: 'reaction',
181
+ server_id: serverId,
182
+ id: generateMessageTag()
183
+ },
184
+ content: [
185
+ {
186
+ tag: 'reaction',
187
+ attrs: reaction? { code: reaction } : {}
188
+ }
189
+ ]
190
+ })
191
+ },
192
+
193
+ newsletterFetchMessages: async (jid, count, since, after) => {
194
+ const messageUpdateAttrs = {
195
+ count: count.toString()
196
+ }
197
+ if (typeof since === 'number') {
198
+ messageUpdateAttrs.since = since.toString()
199
+ }
200
+ if (after) {
201
+ messageUpdateAttrs.after = after.toString()
202
+ }
203
+ const result = await query({
204
+ tag: 'iq',
205
+ attrs: {
206
+ id: generateMessageTag(),
207
+ type: 'get',
208
+ xmlns: 'newsletter',
209
+ to: jid
210
+ },
211
+ content: [
212
+ {
213
+ tag: 'message_updates',
214
+ attrs: messageUpdateAttrs
215
+ }
216
+ ]
217
+ })
218
+ return result
219
+ },
220
+
221
+ subscribeNewsletterUpdates: async jid => {
222
+ const result = await query({
223
+ tag: 'iq',
224
+ attrs: {
225
+ id: generateMessageTag(),
226
+ type: 'set',
227
+ xmlns: 'newsletter',
228
+ to: jid
229
+ },
230
+ content: [{ tag: 'live_updates', attrs: {}, content: [] }]
231
+ })
232
+ const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates')
233
+ const duration = liveUpdatesNode?.attrs?.duration
234
+ return duration? { duration: duration } : null
235
+ },
236
+
237
+ newsletterAdminCount: async jid => {
238
+ const response = await mexQuery(
239
+ { newsletter_id: jid },
240
+ Types.QueryIds.ADMIN_COUNT,
241
+ Types.XWAPaths.xwa2_newsletter_admin_count
242
+ )
243
+ return response.admin_count
244
+ },
245
+
246
+ newsletterChangeOwner: async (jid, newOwnerJid) => {
247
+ await mexQuery(
248
+ { newsletter_id: jid, user_id: newOwnerJid },
249
+ Types.QueryIds.CHANGE_OWNER,
250
+ Types.XWAPaths.xwa2_newsletter_change_owner
251
+ )
252
+ },
253
+
254
+ newsletterDemote: async (jid, userJid) => {
255
+ await mexQuery(
256
+ { newsletter_id: jid, user_id: userJid },
257
+ Types.QueryIds.DEMOTE,
258
+ Types.XWAPaths.xwa2_newsletter_demote
259
+ )
260
+ },
261
+
262
+ newsletterDelete: async jid => {
263
+ await mexQuery(
264
+ { newsletter_id: jid },
265
+ Types.QueryIds.DELETE,
266
+ Types.XWAPaths.xwa2_newsletter_delete_v2
267
+ )
268
+ },
269
+
270
+ /**
271
+ * Update newsletter category/topic
272
+ */
273
+ newsletterUpdateCategory: async (jid, category) => {
274
+ return newsletterUpdate(jid, { topic: category })
275
+ },
276
+
277
+ /**
278
+ * Update newsletter invite codes / settings
279
+ */
280
+ newsletterUpdateSettings: async (jid, settings) => {
281
+ const variables = { newsletter_id: jid, updates: { settings } }
282
+ return mexQuery(variables, Types.QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update')
283
+ },
284
+
285
+ /**
286
+ * Promote a subscriber to admin
287
+ */
288
+ newsletterPromoteAdmin: async (jid, userJid) => {
289
+ await query({
290
+ tag: 'iq',
291
+ attrs: {
292
+ id: generateMessageTag(),
293
+ type: 'set',
294
+ xmlns: 'newsletter',
295
+ to: jid
296
+ },
297
+ content: [
298
+ {
299
+ tag: 'admin_promote',
300
+ attrs: {},
301
+ content: [{ tag: 'participant', attrs: { jid: userJid } }]
302
+ }
303
+ ]
304
+ })
305
+ },
306
+
307
+ /**
308
+ * Get newsletter view/reach statistics
309
+ */
310
+ newsletterViewStats: async (jid, serverId) => {
311
+ const result = await query({
312
+ tag: 'iq',
313
+ attrs: {
314
+ id: generateMessageTag(),
315
+ type: 'get',
316
+ xmlns: 'newsletter',
317
+ to: jid
318
+ },
319
+ content: [
320
+ {
321
+ tag: 'message_updates',
322
+ attrs: { count: '1', server_id: String(serverId) }
323
+ }
324
+ ]
325
+ })
326
+ return result
327
+ },
328
+
329
+ /**
330
+ * Send a newsletter post via IQ (alternative to sendMessage for newsletters)
331
+ */
332
+ newsletterSendPost: async (jid, content, options = {}) => {
333
+ const result = await query({
334
+ tag: 'iq',
335
+ attrs: {
336
+ id: generateMessageTag(),
337
+ type: 'set',
338
+ xmlns: 'newsletter',
339
+ to: jid
340
+ },
341
+ content: [
342
+ {
343
+ tag: 'publish',
344
+ attrs: {},
345
+ content: Array.isArray(content)? content : [content]
346
+ }
347
+ ]
348
+ })
349
+ return result
350
+ },
351
+
352
+ /**
353
+ * Pin a newsletter message
354
+ */
355
+ newsletterPinMessage: async (jid, serverId, durationSecs = 86400) => {
356
+ await query({
357
+ tag: 'iq',
358
+ attrs: {
359
+ id: generateMessageTag(),
360
+ type: 'set',
361
+ xmlns: 'newsletter',
362
+ to: jid
363
+ },
364
+ content: [
365
+ {
366
+ tag: 'pin',
367
+ attrs: { server_id: String(serverId), duration: String(durationSecs) }
368
+ }
369
+ ]
370
+ })
371
+ },
372
+
373
+ /**
374
+ * Unpin a newsletter message
375
+ */
376
+ newsletterUnpinMessage: async (jid, serverId) => {
377
+ 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: 'unpin',
388
+ attrs: { server_id: String(serverId) }
389
+ }
390
+ ]
391
+ })
392
+ },
393
+
394
+ /**
395
+ * Invite a user to become an admin of a newsletter.
396
+ */
397
+ newsletterInviteAdmin: async (jid, userJid) => {
398
+ return mexQuery(
399
+ { newsletter_id: jid, user_id: userJid },
400
+ Types.QueryIds.ADMIN_INVITE,
401
+ Types.XWAPaths.xwa2_newsletter_admin_invite_create
402
+ )
403
+ },
404
+
405
+ /**
406
+ * Revoke a pending admin invite for a newsletter.
407
+ */
408
+ newsletterRevokeAdminInvite: async (jid, userJid) => {
409
+ return mexQuery(
410
+ { newsletter_id: jid, user_id: userJid },
411
+ Types.QueryIds.ADMIN_INVITE_REVOKE,
412
+ Types.XWAPaths.xwa2_newsletter_admin_invite_revoke
413
+ )
414
+ },
415
+
416
+ /**
417
+ * Accept an admin invite to a newsletter (called by the invitee).
418
+ */
419
+ newsletterAcceptAdminInvite: async jid => {
420
+ return mexQuery(
421
+ { newsletter_id: jid },
422
+ Types.QueryIds.ADMIN_INVITE_ACCEPT,
423
+ Types.XWAPaths.xwa2_newsletter_admin_invite_accept
424
+ )
425
+ },
426
+
427
+ /**
428
+ * Fetch admin-side metadata for a newsletter.
429
+ */
430
+ newsletterAdminMetadata: async (jid, options = {}) => {
431
+ const {
432
+ fetchPendingAdmins = true,
433
+ fetchAdminCount = true,
434
+ fetchCapabilities = false,
435
+ fetchAdminProfile = false,
436
+ includeAdminSettings = false,
437
+ includeJarvisConfig = false
438
+ } = options
439
+ return mexQuery(
440
+ {
441
+ jid,
442
+ include_thread_metadata: false,
443
+ include_messages: false,
444
+ fetch_pending_admin_invites: fetchPendingAdmins,
445
+ fetch_admin_count: fetchAdminCount,
446
+ fetch_capabilities: fetchCapabilities,
447
+ fetch_admin_profile: fetchAdminProfile,
448
+ include_admin_settings: includeAdminSettings,
449
+ include_jarvis_config: includeJarvisConfig
450
+ },
451
+ Types.QueryIds.ADMIN_METADATA,
452
+ Types.XWAPaths.xwa2_newsletter_admin
453
+ )
454
+ },
455
+
456
+ /**
457
+ * Update admin profile fields for a newsletter
458
+ */
459
+ newsletterAdminProfileUpdate: async (jid, updates) => {
460
+ return mexQuery(
461
+ { newsletter_id: jid, updates },
462
+ Types.QueryIds.ADMIN_PROFILE_UPDATE,
463
+ Types.XWAPaths.xwa2_newsletter_admin_profile_update
464
+ )
465
+ },
466
+
467
+ /**
468
+ * Browse the newsletter directory by category.
469
+ */
470
+ newsletterDirectoryList: async (options = {}) => {
471
+ const { limit = 20, interests = null, sortField = 'SUBSCRIBER_COUNT', sortOrder = 'DESC' } = options
472
+ const variables = { limit, sort_field: sortField, sort_order: sortOrder }
473
+ if (interests?.length) variables.interests = interests
474
+ return mexQuery(variables, Types.QueryIds.DIRECTORY_LIST, Types.XWAPaths.xwa2_newsletters_directory_list)
475
+ },
476
+
477
+ /**
478
+ * Search the newsletter directory.
479
+ */
480
+ newsletterDirectorySearch: async (searchText, options = {}) => {
481
+ const { limit = 20, startCursor = null, categories = null } = options
482
+ const variables = { search_text: searchText, limit }
483
+ if (startCursor) variables.start_cursor = startCursor
484
+ if (categories?.length) variables.categories = categories
485
+ return mexQuery(
486
+ variables,
487
+ Types.QueryIds.DIRECTORY_SEARCH,
488
+ Types.XWAPaths.xwa2_newsletters_directory_search
489
+ )
490
+ },
491
+
492
+ /**
493
+ * Fetch a preview of newsletters grouped by directory category.
494
+ */
495
+ newsletterDirectoryCategoryPreview: async (limit = 5) => {
496
+ return mexQuery(
497
+ { limit },
498
+ Types.QueryIds.DIRECTORY_CATEGORY_PREVIEW,
499
+ Types.XWAPaths.xwa2_newsletters_directory_category_preview
500
+ )
501
+ },
502
+
503
+ /**
504
+ * Search for newsletters by text query.
505
+ */
506
+ newsletterSearch: async (query, limit = 20, startCursor = null) => {
507
+ const variables = { query, limit }
508
+ if (startCursor) variables.start_cursor = startCursor
509
+ return mexQuery(variables, Types.QueryIds.SEARCH, Types.XWAPaths.xwa2_newsletters_search)
510
+ },
511
+
512
+ /**
513
+ * Fetch recommended newsletters.
514
+ */
515
+ newsletterRecommended: async (limit = 10, numFollowed = null) => {
516
+ const variables = { limit }
517
+ if (numFollowed!= null) variables.num_newsletters_followed = numFollowed
518
+ return mexQuery(variables, Types.QueryIds.RECOMMENDED, Types.XWAPaths.xwa2_newsletters_recommended)
519
+ },
520
+
521
+ /**
522
+ * Fetch newsletters similar to a given newsletter.
523
+ */
524
+ newsletterSimilar: async (jid, limit = 10) => {
525
+ return mexQuery(
526
+ { newsletter_id: jid, limit },
527
+ Types.QueryIds.SIMILAR,
528
+ Types.XWAPaths.xwa2_newsletters_similar
529
+ )
530
+ },
531
+
532
+ /**
533
+ * Fetch the list of newsletters the current user is following.
534
+ */
535
+ newsletterFollowingList: async (startCursor = null, limit = 20) => {
536
+ const variables = { limit }
537
+ if (startCursor) variables.start_cursor = startCursor
538
+ return mexQuery(variables, Types.QueryIds.FOLLOWING_LIST, Types.XWAPaths.xwa2_newsletter_following)
539
+ },
540
+
541
+ /**
542
+ * Fetch admin insights/analytics for a newsletter.
543
+ */
544
+ newsletterInsights: async (jid, period = null) => {
545
+ const variables = { newsletter_id: jid }
546
+ if (period) variables.period = period
547
+ return mexQuery(variables, Types.QueryIds.INSIGHTS, Types.XWAPaths.xwa2_newsletter_admin_insights)
548
+ },
549
+
550
+ /**
551
+ * Fetch the list of users who voted in a newsletter poll.
552
+ */
553
+ newsletterPollVoterList: async (jid, serverId, option = null, startCursor = null) => {
554
+ const variables = { id: jid, server_id: serverId }
555
+ if (option!= null) variables.option = option
556
+ if (startCursor) variables.start_cursor = startCursor
557
+ return mexQuery(
558
+ variables,
559
+ Types.QueryIds.POLL_VOTER_LIST,
560
+ Types.XWAPaths.xwa2_newsletters_poll_voter_list
561
+ )
562
+ },
563
+
564
+ /**
565
+ * Fetch the list of users who reacted to a newsletter message.
566
+ */
567
+ newsletterReactionSenders: async (jid, serverId, startCursor = null) => {
568
+ const variables = { id: jid, server_id: serverId }
569
+ if (startCursor) variables.start_cursor = startCursor
570
+ return mexQuery(
571
+ variables,
572
+ Types.QueryIds.REACTION_SENDERS_LIST,
573
+ Types.XWAPaths.xwa2_newsletters_reaction_sender_list
574
+ )
575
+ },
576
+
577
+ /**
578
+ * Block a user from a newsletter (admin action).
579
+ */
580
+ newsletterBlockUser: async (jid, userJid) => {
581
+ return mexQuery(
582
+ { newsletter_id: jid, user_id: userJid },
583
+ Types.QueryIds.BLOCK_USER,
584
+ 'xwa2_newsletter_block_user'
585
+ )
586
+ },
587
+
588
+ /**
589
+ * Enable Wamo (paid subscription) for a newsletter.
590
+ */
591
+ newsletterEnableWamo: async jid => {
592
+ return mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_ENABLE_SUB, 'xwa2_newsletter_wamo_enable_sub')
593
+ },
594
+
595
+ /**
596
+ * Disable Wamo (paid subscription) for a newsletter.
597
+ */
598
+ newsletterDisableWamo: async jid => {
599
+ return mexQuery(
600
+ { newsletter_id: jid },
601
+ Types.QueryIds.WAMO_DISABLE_SUB,
602
+ 'xwa2_newsletter_wamo_disable_sub'
603
+ )
604
+ },
605
+
606
+ /**
607
+ * Change the Wamo subscription tier or settings for a newsletter.
608
+ */
609
+ newsletterChangeWamo: async (jid, subConfig) => {
610
+ return mexQuery(
611
+ { newsletter_id: jid,...subConfig },
612
+ Types.QueryIds.WAMO_CHANGE_SUB,
613
+ 'xwa2_newsletter_wamo_change_sub'
614
+ )
615
+ },
616
+
617
+ /**
618
+ * Wamo helpers
619
+ */
620
+ wamoAfsAgeCollection: async jid =>
621
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_AFS_AGE_COLLECTION, Types.XWAPaths.xwa2_wamo_afs_age_collection),
622
+
623
+ wamoAssetCollection: async jid =>
624
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_ASSET_COLLECTION, Types.XWAPaths.xwa2_wamo_asset_collection),
625
+
626
+ wamoFetchAdhocNotice: async noticeId =>
627
+ mexQuery({ notice_id: noticeId }, Types.QueryIds.WAMO_FETCH_ADHOC_NOTICE, Types.XWAPaths.xwa2_wamo_fetch_adhoc_notice_by_id),
628
+
629
+ wamoFetchIdentityToken: async jid =>
630
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_FETCH_IDENTITY_TOKEN, Types.XWAPaths.xwa2_wamo_fetch_identity_token),
631
+
632
+ wamoSubComplianceInfo: async jid =>
633
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_SUB_COMPLIANCE_INFO, Types.XWAPaths.xwa2_wamo_sub_get_compliance_info),
634
+
635
+ wamoUserIdVersion: async jid =>
636
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.WAMO_USER_ID_VERSION, Types.XWAPaths.xwa2_wamo_user_id_version),
637
+
638
+ wamoSetUserIdVersion: async (jid, version) =>
639
+ mexQuery({ newsletter_id: jid, version }, Types.QueryIds.WAMO_SET_USER_ID_VERSION, Types.XWAPaths.xwa2_wamo_set_user_id_version),
640
+
641
+ /**
642
+ * Leave a newsletter (unsubscribe).
643
+ */
644
+ newsletterLeave: async jid =>
645
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.LEAVE, Types.XWAPaths.xwa2_newsletter_leave_v2),
646
+
647
+ /**
648
+ * Create a verified newsletter.
649
+ */
650
+ newsletterCreateVerified: async (name, description = null) =>
651
+ mexQuery(
652
+ { input: { name, description } },
653
+ Types.QueryIds.CREATE_VERIFIED,
654
+ Types.XWAPaths.xwa2_newsletter_create_verified
655
+ ),
656
+
657
+ /**
658
+ * Fetch newsletter enforcements (ban/restriction info).
659
+ */
660
+ newsletterEnforcements: async jid =>
661
+ mexQuery({ newsletter_id: jid }, Types.QueryIds.ENFORCEMENTS, Types.XWAPaths.xwa2_newsletter_enforcements),
662
+
663
+ /**
664
+ * Fetch user reports for a newsletter (admin action).
665
+ */
666
+ newsletterUserReports: async (jid, cursor = null) => {
667
+ const variables = { newsletter_id: jid }
668
+ if (cursor) variables.cursor = cursor
669
+ return mexQuery(variables, Types.QueryIds.USER_REPORTS, Types.XWAPaths.xwa2_newsletter_user_reports)
670
+ },
671
+
672
+ /**
673
+ * Create a report appeal for a newsletter.
674
+ */
675
+ newsletterCreateReportAppeal: async (jid, reason) =>
676
+ mexQuery(
677
+ { newsletter_id: jid, reason },
678
+ Types.QueryIds.CREATE_REPORT_APPEAL,
679
+ Types.XWAPaths.xwa2_newsletter_create_report_appeal
680
+ ),
681
+
682
+ /**
683
+ * Check a newsletter link preview.
684
+ */
685
+ newsletterLinkPreviewCheck: async url =>
686
+ mexQuery({ url }, Types.QueryIds.LINK_PREVIEW_CHECK, Types.XWAPaths.xwa2_newsletter_link_preview_check),
687
+
688
+ /**
689
+ * Update newsletter verification status.
690
+ */
691
+ newsletterUpdateVerification: async (jid, verification) =>
692
+ mexQuery(
693
+ { newsletter_id: jid, verification },
694
+ Types.QueryIds.UPDATE_VERIFICATION,
695
+ Types.XWAPaths.xwa2_newsletter_update_verification
696
+ ),
697
+
698
+ /**
699
+ * Label a newsletter post as paid partnership.
700
+ */
701
+ newsletterLabelPaidPartnership: async (jid, serverId, isPaidPartnership) =>
702
+ mexQuery(
703
+ { newsletter_id: jid, server_id: serverId, is_paid_partnership: isPaidPartnership },
704
+ Types.QueryIds.LABEL_PAID_PARTNERSHIP,
705
+ Types.XWAPaths.xwa2_newsletter_label_paid_partnership
706
+ ),
707
+
708
+ /**
709
+ * Log newsletter exposure events (analytics).
710
+ */
711
+ newsletterLogExposures: async events =>
712
+ mexQuery({ events }, Types.QueryIds.LOG_EXPOSURES, Types.XWAPaths.xwa2_newsletter_log_exposures),
713
+
714
+ /**
715
+ * Update user-specific newsletter setting.
716
+ */
717
+ newsletterUpdateUserSetting: async (jid, setting) =>
718
+ mexQuery(
719
+ { newsletter_id: jid,...setting },
720
+ Types.QueryIds.UPDATE_USER_SETTING,
721
+ Types.XWAPaths.xwa2_newsletter_update_user_setting
722
+ ),
723
+
724
+ /**
725
+ * Fetch newsletter ranking features (ML signals).
726
+ */
727
+ newsletterRankingFeatures: async jid =>
728
+ mexQuery(
729
+ { newsletter_id: jid },
730
+ Types.QueryIds.RANKING_FEATURES,
731
+ Types.XWAPaths.xwa2_newsletter_ranking_features
732
+ ),
733
+
734
+ /**
735
+ * Send view receipts for newsletter messages.
736
+ */
737
+ newsletterSendViewReceipt: async (jid, serverMessageIds) => {
738
+ const ids = Array.isArray(serverMessageIds)? serverMessageIds : [serverMessageIds]
739
+ const receiptId = generateMessageTag()
740
+ await query({
741
+ tag: 'receipt',
742
+ attrs: {
743
+ to: jid,
744
+ id: receiptId,
745
+ type: 'view'
746
+ },
747
+ content: [
748
+ {
749
+ tag: 'list',
750
+ attrs: {},
751
+ content: ids.map(id => ({ tag: 'item', attrs: { server_id: String(id) } }))
752
+ }
753
+ ]
754
+ })
755
+ }
756
+ }
757
+ }