@celestial-community/baileys 0.0.1-security → 1.0.0

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.

Potentially problematic release.


This version of @celestial-community/baileys might be problematic. Click here for more details.

Files changed (175) hide show
  1. package/WAProto/index.js +138933 -0
  2. package/engine-requirements.js +10 -0
  3. package/lib/Defaults/baileys-version.json +7 -0
  4. package/lib/Defaults/index.js +157 -0
  5. package/lib/Defaults/phonenumber-mcc.json +223 -0
  6. package/lib/Signal/Group/ciphertext-message.js +15 -0
  7. package/lib/Signal/Group/group-session-builder.js +94 -0
  8. package/lib/Signal/Group/group_cipher.js +118 -0
  9. package/lib/Signal/Group/index.js +138 -0
  10. package/lib/Signal/Group/keyhelper.js +75 -0
  11. package/lib/Signal/Group/queue-job.js +54 -0
  12. package/lib/Signal/Group/sender-chain-key.js +39 -0
  13. package/lib/Signal/Group/sender-key-distribution-message.js +71 -0
  14. package/lib/Signal/Group/sender-key-message.js +76 -0
  15. package/lib/Signal/Group/sender-key-name.js +50 -0
  16. package/lib/Signal/Group/sender-key-record.js +65 -0
  17. package/lib/Signal/Group/sender-key-state.js +114 -0
  18. package/lib/Signal/Group/sender-message-key.js +33 -0
  19. package/lib/Signal/libsignal.js +204 -0
  20. package/lib/Signal/lid-mapping.js +267 -0
  21. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  22. package/lib/Socket/Client/index.js +32 -0
  23. package/lib/Socket/Client/mobile-socket-client.js +82 -0
  24. package/lib/Socket/Client/web-socket-client.js +89 -0
  25. package/lib/Socket/Denzy-ZeroDay.js +805 -0
  26. package/lib/Socket/business.js +279 -0
  27. package/lib/Socket/chats.js +1169 -0
  28. package/lib/Socket/community.d.ts +120 -0
  29. package/lib/Socket/community.js +388 -0
  30. package/lib/Socket/graphql.js +1122 -0
  31. package/lib/Socket/groups.js +345 -0
  32. package/lib/Socket/index.js +22 -0
  33. package/lib/Socket/interop.js +265 -0
  34. package/lib/Socket/lid-mapping.js +111 -0
  35. package/lib/Socket/messages-recv.js +1385 -0
  36. package/lib/Socket/messages-send.js +956 -0
  37. package/lib/Socket/mex.js +69 -0
  38. package/lib/Socket/newsletter.js +424 -0
  39. package/lib/Socket/privacy.js +229 -0
  40. package/lib/Socket/registration.js +190 -0
  41. package/lib/Socket/socket.js +783 -0
  42. package/lib/Socket/username.d.ts +185 -0
  43. package/lib/Socket/username.js +168 -0
  44. package/lib/Socket/usync.js +80 -0
  45. package/lib/Store/index.js +14 -0
  46. package/lib/Store/keyed-db.js +158 -0
  47. package/lib/Store/make-cache-manager-store.js +88 -0
  48. package/lib/Store/make-in-memory-store.js +484 -0
  49. package/lib/Store/make-ordered-dictionary.js +78 -0
  50. package/lib/Store/object-repository.js +27 -0
  51. package/lib/Types/Auth.js +2 -0
  52. package/lib/Types/Call.js +2 -0
  53. package/lib/Types/Chat.js +10 -0
  54. package/lib/Types/Contact.js +2 -0
  55. package/lib/Types/Events.js +2 -0
  56. package/lib/Types/GroupMetadata.js +2 -0
  57. package/lib/Types/Label.js +27 -0
  58. package/lib/Types/LabelAssociation.js +9 -0
  59. package/lib/Types/Message.js +14 -0
  60. package/lib/Types/MexUpdates.js +19 -0
  61. package/lib/Types/Newsletter.js +38 -0
  62. package/lib/Types/Product.js +2 -0
  63. package/lib/Types/RichType.js +30 -0
  64. package/lib/Types/Signal.js +2 -0
  65. package/lib/Types/Socket.js +2 -0
  66. package/lib/Types/State.js +2 -0
  67. package/lib/Types/USync.js +2 -0
  68. package/lib/Types/index.js +58 -0
  69. package/lib/Utils/anti-ban.js +339 -0
  70. package/lib/Utils/anti-delete.d.ts +158 -0
  71. package/lib/Utils/anti-delete.js +293 -0
  72. package/lib/Utils/antiban-presets.js +91 -0
  73. package/lib/Utils/antiban-profiles.js +43 -0
  74. package/lib/Utils/auth-utils.js +210 -0
  75. package/lib/Utils/baileys-event-stream.js +66 -0
  76. package/lib/Utils/browser-utils.js +52 -0
  77. package/lib/Utils/business.js +261 -0
  78. package/lib/Utils/chat-control.d.ts +113 -0
  79. package/lib/Utils/chat-control.js +230 -0
  80. package/lib/Utils/chat-utils.js +922 -0
  81. package/lib/Utils/companion-reg-client-utils.js +37 -0
  82. package/lib/Utils/contact-graph-warmer.js +208 -0
  83. package/lib/Utils/crypto.js +196 -0
  84. package/lib/Utils/decode-wa-message.js +208 -0
  85. package/lib/Utils/delivery-tracker.js +110 -0
  86. package/lib/Utils/device-fingerprint.js +135 -0
  87. package/lib/Utils/event-buffer.js +531 -0
  88. package/lib/Utils/generics.js +571 -0
  89. package/lib/Utils/group-operation-guard.js +147 -0
  90. package/lib/Utils/health-monitor.js +207 -0
  91. package/lib/Utils/history.js +122 -0
  92. package/lib/Utils/human-entropy.js +226 -0
  93. package/lib/Utils/identity-change-handler.js +72 -0
  94. package/lib/Utils/index.js +83 -0
  95. package/lib/Utils/interactive-message.d.ts +139 -0
  96. package/lib/Utils/interactive-message.js +273 -0
  97. package/lib/Utils/legitimacy-signal-injector.js +180 -0
  98. package/lib/Utils/link-preview.js +106 -0
  99. package/lib/Utils/logger.d.ts +13 -0
  100. package/lib/Utils/logger.js +9 -0
  101. package/lib/Utils/lt-hash.js +54 -0
  102. package/lib/Utils/make-mutex.js +41 -0
  103. package/lib/Utils/message-composer.d.ts +106 -0
  104. package/lib/Utils/message-composer.js +721 -0
  105. package/lib/Utils/message-retry-manager.d.ts +88 -0
  106. package/lib/Utils/message-retry-manager.js +160 -0
  107. package/lib/Utils/message-search.d.ts +52 -0
  108. package/lib/Utils/message-search.js +226 -0
  109. package/lib/Utils/messages-media.js +899 -0
  110. package/lib/Utils/messages.js +2698 -0
  111. package/lib/Utils/noise-handler.js +175 -0
  112. package/lib/Utils/offline-node-processor.js +45 -0
  113. package/lib/Utils/pre-key-manager.js +131 -0
  114. package/lib/Utils/presence-choreographer.js +438 -0
  115. package/lib/Utils/process-message.js +423 -0
  116. package/lib/Utils/rate-limiter.js +232 -0
  117. package/lib/Utils/reconnect-throttle.js +157 -0
  118. package/lib/Utils/reply-ratio-guard.js +137 -0
  119. package/lib/Utils/reporting-utils.js +307 -0
  120. package/lib/Utils/retry-reason-tracker.js +140 -0
  121. package/lib/Utils/rich-message-utils.d.ts +48 -0
  122. package/lib/Utils/rich-message-utils.js +400 -0
  123. package/lib/Utils/rich-response-utils.js +461 -0
  124. package/lib/Utils/scheduling.d.ts +135 -0
  125. package/lib/Utils/scheduling.js +246 -0
  126. package/lib/Utils/session-fingerprint.js +226 -0
  127. package/lib/Utils/session-stability.js +224 -0
  128. package/lib/Utils/signal.js +188 -0
  129. package/lib/Utils/stanza-ack.js +38 -0
  130. package/lib/Utils/state-manager.js +91 -0
  131. package/lib/Utils/status-posting.d.ts +81 -0
  132. package/lib/Utils/status-posting.js +187 -0
  133. package/lib/Utils/stealth-connect.js +124 -0
  134. package/lib/Utils/sync-action-utils.js +55 -0
  135. package/lib/Utils/tc-token-utils.js +171 -0
  136. package/lib/Utils/templates.d.ts +54 -0
  137. package/lib/Utils/templates.js +244 -0
  138. package/lib/Utils/timelock-guard.js +162 -0
  139. package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
  140. package/lib/Utils/use-mongo-file-auth-state.js +81 -0
  141. package/lib/Utils/use-multi-file-auth-state.js +125 -0
  142. package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
  143. package/lib/Utils/use-single-file-auth-state.js +86 -0
  144. package/lib/Utils/use-sqlite-auth-state.js +187 -0
  145. package/lib/Utils/vCard.d.ts +71 -0
  146. package/lib/Utils/vCard.js +196 -0
  147. package/lib/Utils/validate-connection.js +253 -0
  148. package/lib/Utils/warmup.js +154 -0
  149. package/lib/WABinary/constants.js +1303 -0
  150. package/lib/WABinary/decode.js +270 -0
  151. package/lib/WABinary/encode.js +279 -0
  152. package/lib/WABinary/generic-utils.js +223 -0
  153. package/lib/WABinary/index.js +34 -0
  154. package/lib/WABinary/jid-utils.js +84 -0
  155. package/lib/WABinary/types.js +2 -0
  156. package/lib/WAM/BinaryInfo.js +13 -0
  157. package/lib/WAM/constants.js +15254 -0
  158. package/lib/WAM/encode.js +149 -0
  159. package/lib/WAM/index.js +32 -0
  160. package/lib/WAUSync/Protocols/USyncContactProtocol.js +37 -0
  161. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +71 -0
  162. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +32 -0
  163. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +49 -0
  164. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +23 -0
  165. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +58 -0
  166. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  167. package/lib/WAUSync/Protocols/index.js +34 -0
  168. package/lib/WAUSync/USyncQuery.js +99 -0
  169. package/lib/WAUSync/USyncUser.js +26 -0
  170. package/lib/WAUSync/USyncUsernameProtocol.d.ts +9 -0
  171. package/lib/WAUSync/USyncUsernameProtocol.js +37 -0
  172. package/lib/WAUSync/index.js +32 -0
  173. package/lib/index.js +59 -0
  174. package/package.json +105 -5
  175. package/README.md +0 -5
@@ -0,0 +1,805 @@
1
+ const WAProto = require('../../WAProto').proto
2
+ const crypto = require('crypto')
3
+ const Utils_1 = require('../Utils')
4
+ const WABinary_1 = require('../WABinary')
5
+
6
+ class TempeGoreng {
7
+ constructor(utils, waUploadToServer, relayMessageFn, config, sock) {
8
+ this.utils = utils
9
+ this.relayMessage = relayMessageFn
10
+ this.waUploadToServer = waUploadToServer
11
+ this.config = config
12
+ this.sock = sock
13
+
14
+ this.bail = {
15
+ generateWAMessageContent:
16
+ this.utils.generateWAMessageContent || Utils_1.generateWAMessageContent,
17
+ generateMessageID: Utils_1.generateMessageID,
18
+ getContentType: (msg) => Object.keys(msg.message || {})[0]
19
+ }
20
+ }
21
+
22
+ detectType(content) {
23
+ if (content.requestPaymentMessage) return 'PAYMENT'
24
+ if (content.productMessage) return 'PRODUCT'
25
+ if (content.interactiveMessage) return 'INTERACTIVE'
26
+ if (content.albumMessage) return 'ALBUM'
27
+ if (content.eventMessage) return 'EVENT'
28
+ if (content.pollResultMessage) return 'POLL_RESULT'
29
+ if (content.groupStatusMessage) return 'GROUP_STORY'
30
+ if (content.commentMessage) return 'COMMENT'
31
+ if (content.bCallMessage) return 'BCALL'
32
+ if (content.scheduledCallCreationMessage) return 'SCHEDULED_CALL'
33
+ if (content.pinInChatMessage) return 'PIN_IN_CHAT'
34
+ if (content.encEventResponseMessage) return 'ENC_EVENT_RESPONSE'
35
+ if (content.stickerPackMessage) return 'STICKER_PACK'
36
+ if (content.botFeedbackMessage) return 'BOT_FEEDBACK'
37
+ if (content.encCommentMessage) return 'ENC_COMMENT'
38
+ return null
39
+ }
40
+
41
+ async handlePayment(content, quoted) {
42
+ const data = content.requestPaymentMessage
43
+ let notes = {}
44
+
45
+ if (data.sticker?.stickerMessage) {
46
+ notes = {
47
+ stickerMessage: {
48
+ ...data.sticker.stickerMessage,
49
+ contextInfo: {
50
+ stanzaId: quoted?.key?.id,
51
+ participant: quoted?.key?.participant || content.sender,
52
+ quotedMessage: quoted?.message
53
+ }
54
+ }
55
+ }
56
+ } else if (data.note) {
57
+ notes = {
58
+ extendedTextMessage: {
59
+ text: data.note,
60
+ contextInfo: {
61
+ stanzaId: quoted?.key?.id,
62
+ participant: quoted?.key?.participant || content.sender,
63
+ quotedMessage: quoted?.message
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ return {
70
+ requestPaymentMessage: WAProto.Message.RequestPaymentMessage.fromObject({
71
+ expiryTimestamp: data.expiry || 0,
72
+ amount1000: data.amount || 0,
73
+ currencyCodeIso4217: data.currency || 'IDR',
74
+ requestFrom: data.from || '0@s.whatsapp.net',
75
+ noteMessage: notes,
76
+ background: data.background ?? {
77
+ id: 'DEFAULT',
78
+ placeholderArgb: 0xfff0f0f0
79
+ }
80
+ })
81
+ }
82
+ }
83
+
84
+ async handleProduct(content, jid, quoted) {
85
+ const {
86
+ title,
87
+ description,
88
+ thumbnail,
89
+ productId,
90
+ retailerId,
91
+ url,
92
+ body = '',
93
+ footer = '',
94
+ buttons = [],
95
+ priceAmount1000 = null,
96
+ currencyCode = 'IDR'
97
+ } = content.productMessage
98
+
99
+ let productImage
100
+
101
+ if (Buffer.isBuffer(thumbnail)) {
102
+ const { imageMessage } = await this.utils.generateWAMessageContent(
103
+ { image: thumbnail },
104
+ { upload: this.waUploadToServer }
105
+ )
106
+ productImage = imageMessage
107
+ } else if (typeof thumbnail === 'object' && thumbnail.url) {
108
+ const { imageMessage } = await this.utils.generateWAMessageContent(
109
+ { image: { url: thumbnail.url } },
110
+ { upload: this.waUploadToServer }
111
+ )
112
+ productImage = imageMessage
113
+ }
114
+
115
+ return {
116
+ viewOnceMessage: {
117
+ message: {
118
+ interactiveMessage: {
119
+ body: { text: body },
120
+ footer: { text: footer },
121
+ header: {
122
+ title,
123
+ hasMediaAttachment: true,
124
+ productMessage: {
125
+ product: {
126
+ productImage,
127
+ productId,
128
+ title,
129
+ description,
130
+ currencyCode,
131
+ priceAmount1000,
132
+ retailerId,
133
+ url,
134
+ productImageCount: 1
135
+ },
136
+ businessOwnerJid: '0@s.whatsapp.net'
137
+ }
138
+ },
139
+ nativeFlowMessage: { buttons }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ async handleInteractive(content, jid, quoted) {
147
+ const {
148
+ title,
149
+ footer,
150
+ thumbnail,
151
+ image,
152
+ video,
153
+ document,
154
+ mimetype,
155
+ fileName,
156
+ jpegThumbnail,
157
+ contextInfo,
158
+ externalAdReply,
159
+ buttons = [],
160
+ nativeFlowMessage,
161
+ header
162
+ } = content.interactiveMessage
163
+
164
+ let media = null
165
+ let mediaType = null
166
+
167
+ if (thumbnail) {
168
+ media = await this.utils.prepareWAMessageMedia(
169
+ { image: { url: thumbnail } },
170
+ { upload: this.waUploadToServer }
171
+ )
172
+ mediaType = 'image'
173
+ } else if (image) {
174
+ if (typeof image === 'object' && image.url) {
175
+ media = await this.utils.prepareWAMessageMedia(
176
+ { image: { url: image.url } },
177
+ { upload: this.waUploadToServer }
178
+ )
179
+ } else {
180
+ media = await this.utils.prepareWAMessageMedia(
181
+ { image: image },
182
+ { upload: this.waUploadToServer }
183
+ )
184
+ }
185
+ mediaType = 'image'
186
+ } else if (video) {
187
+ if (typeof video === 'object' && video.url) {
188
+ media = await this.utils.prepareWAMessageMedia(
189
+ { video: { url: video.url } },
190
+ { upload: this.waUploadToServer }
191
+ )
192
+ } else {
193
+ media = await this.utils.prepareWAMessageMedia(
194
+ { video: video },
195
+ { upload: this.waUploadToServer }
196
+ )
197
+ }
198
+ mediaType = 'video'
199
+ } else if (document) {
200
+ let documentPayload = {
201
+ document: document
202
+ }
203
+ if (jpegThumbnail) {
204
+ if (typeof jpegThumbnail === 'object' && jpegThumbnail.url) {
205
+ documentPayload.jpegThumbnail = { url: jpegThumbnail.url }
206
+ } else {
207
+ documentPayload.jpegThumbnail = jpegThumbnail
208
+ }
209
+ }
210
+
211
+ media = await this.utils.prepareWAMessageMedia(documentPayload, {
212
+ upload: this.waUploadToServer
213
+ })
214
+ if (fileName) {
215
+ media.documentMessage.fileName = fileName
216
+ }
217
+ if (mimetype) {
218
+ media.documentMessage.mimetype = mimetype
219
+ }
220
+ mediaType = 'document'
221
+ }
222
+ let interactiveMessage = {
223
+ body: { text: title || '' },
224
+ footer: { text: footer || '' }
225
+ }
226
+ if (buttons && buttons.length > 0) {
227
+ interactiveMessage.nativeFlowMessage = {
228
+ buttons: buttons
229
+ }
230
+ if (nativeFlowMessage) {
231
+ interactiveMessage.nativeFlowMessage = {
232
+ ...interactiveMessage.nativeFlowMessage,
233
+ ...nativeFlowMessage
234
+ }
235
+ }
236
+ } else if (nativeFlowMessage) {
237
+ interactiveMessage.nativeFlowMessage = nativeFlowMessage
238
+ }
239
+
240
+ if (media) {
241
+ interactiveMessage.header = {
242
+ title: header || '',
243
+ hasMediaAttachment: true,
244
+ ...media
245
+ }
246
+ } else {
247
+ interactiveMessage.header = {
248
+ title: header || '',
249
+ hasMediaAttachment: false
250
+ }
251
+ }
252
+
253
+ let finalContextInfo = {}
254
+ if (contextInfo) {
255
+ finalContextInfo = {
256
+ mentionedJid: contextInfo.mentionedJid || [],
257
+ forwardingScore: contextInfo.forwardingScore || 0,
258
+ isForwarded: contextInfo.isForwarded || false,
259
+ ...contextInfo
260
+ }
261
+ }
262
+
263
+ if (externalAdReply) {
264
+ finalContextInfo.externalAdReply = {
265
+ title: externalAdReply.title || '',
266
+ body: externalAdReply.body || '',
267
+ mediaType: externalAdReply.mediaType || 1,
268
+ thumbnailUrl: externalAdReply.thumbnailUrl || '',
269
+ mediaUrl: externalAdReply.mediaUrl || '',
270
+ sourceUrl: externalAdReply.sourceUrl || '',
271
+ showAdAttribution: externalAdReply.showAdAttribution || false,
272
+ renderLargerThumbnail: externalAdReply.renderLargerThumbnail || false,
273
+ ...externalAdReply
274
+ }
275
+ }
276
+
277
+ if (Object.keys(finalContextInfo).length > 0) {
278
+ interactiveMessage.contextInfo = finalContextInfo
279
+ }
280
+ return {
281
+ interactiveMessage: interactiveMessage
282
+ }
283
+ }
284
+
285
+ async handleAlbum(content, jid, quoted) {
286
+ const array = content.albumMessage
287
+ const album = await this.utils.generateWAMessageFromContent(
288
+ jid,
289
+ {
290
+ messageContextInfo: {
291
+ messageSecret: crypto.randomBytes(32)
292
+ },
293
+ albumMessage: {
294
+ expectedImageCount: array.filter((a) => a.hasOwnProperty('image')).length,
295
+ expectedVideoCount: array.filter((a) => a.hasOwnProperty('video')).length
296
+ }
297
+ },
298
+ {
299
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
300
+ quoted,
301
+ upload: this.waUploadToServer
302
+ }
303
+ )
304
+
305
+ await this.relayMessage(jid, album.message, {
306
+ messageId: album.key.id
307
+ })
308
+
309
+ for (let content of array) {
310
+ const img = await this.utils.generateWAMessage(jid, content, {
311
+ upload: this.waUploadToServer
312
+ })
313
+
314
+ img.message.messageContextInfo = {
315
+ messageSecret: crypto.randomBytes(32),
316
+ messageAssociation: {
317
+ associationType: 1,
318
+ parentMessageKey: album.key
319
+ },
320
+ participant: '0@s.whatsapp.net',
321
+ remoteJid: 'status@broadcast',
322
+ forwardingScore: 99999,
323
+ isForwarded: true,
324
+ mentionedJid: [jid],
325
+ starred: true,
326
+ labels: ['Y', 'Important'],
327
+ isHighlighted: true,
328
+ businessMessageForwardInfo: {
329
+ businessOwnerJid: jid
330
+ },
331
+ dataSharingContext: {
332
+ showMmDisclosure: true
333
+ }
334
+ }
335
+
336
+ img.message.forwardedNewsletterMessageInfo = {
337
+ newsletterJid: '0@newsletter',
338
+ serverMessageId: 1,
339
+ newsletterName: `WhatsApp`,
340
+ contentType: 1,
341
+ timestamp: new Date().toISOString(),
342
+ senderName: 'Denzy ZeroDay',
343
+ content: 'Text Message',
344
+ priority: 'high',
345
+ status: 'sent'
346
+ }
347
+
348
+ img.message.disappearingMode = {
349
+ initiator: 3,
350
+ trigger: 4,
351
+ initiatorDeviceJid: jid,
352
+ initiatedByExternalService: true,
353
+ initiatedByUserDevice: true,
354
+ initiatedBySystem: true,
355
+ initiatedByServer: true,
356
+ initiatedByAdmin: true,
357
+ initiatedByUser: true,
358
+ initiatedByApp: true,
359
+ initiatedByBot: true,
360
+ initiatedByMe: true
361
+ }
362
+
363
+ await this.relayMessage(jid, img.message, {
364
+ messageId: img.key.id,
365
+ quoted: {
366
+ key: {
367
+ remoteJid: album.key.remoteJid,
368
+ id: album.key.id,
369
+ fromMe: true,
370
+ participant:
371
+ this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net'
372
+ },
373
+ message: album.message
374
+ }
375
+ })
376
+ }
377
+ return album
378
+ }
379
+
380
+ async handleEvent(content, jid, quoted) {
381
+ const eventData = content.eventMessage
382
+
383
+ const msg = await this.utils.generateWAMessageFromContent(
384
+ jid,
385
+ {
386
+ viewOnceMessage: {
387
+ message: {
388
+ messageContextInfo: {
389
+ deviceListMetadata: {},
390
+ deviceListMetadataVersion: 2,
391
+ messageSecret: crypto.randomBytes(32),
392
+ supportPayload: JSON.stringify({
393
+ version: 2,
394
+ is_ai_message: true,
395
+ should_show_system_message: true,
396
+ ticket_id: crypto.randomBytes(16).toString('hex')
397
+ })
398
+ },
399
+ eventMessage: {
400
+ contextInfo: {
401
+ mentionedJid: [jid],
402
+ participant: jid,
403
+ remoteJid: 'status@broadcast',
404
+ forwardedNewsletterMessageInfo: {
405
+ newsletterName: 'Denzy ZeroDay',
406
+ newsletterJid: '120363428062966280@newsletter',
407
+ serverMessageId: 1
408
+ }
409
+ },
410
+ isCanceled: eventData.isCanceled || false,
411
+ name: eventData.name,
412
+ description: eventData.description,
413
+ location: eventData.location || {
414
+ degreesLatitude: 0,
415
+ degreesLongitude: 0,
416
+ name: 'Location'
417
+ },
418
+ joinLink: eventData.joinLink || '',
419
+ startTime:
420
+ typeof eventData.startTime === 'string'
421
+ ? parseInt(eventData.startTime)
422
+ : eventData.startTime || Date.now(),
423
+ endTime:
424
+ typeof eventData.endTime === 'string'
425
+ ? parseInt(eventData.endTime)
426
+ : eventData.endTime || Date.now() + 3600000,
427
+ extraGuestsAllowed: eventData.extraGuestsAllowed !== false
428
+ }
429
+ }
430
+ }
431
+ },
432
+ { quoted }
433
+ )
434
+
435
+ await this.relayMessage(jid, msg.message, {
436
+ messageId: msg.key.id
437
+ })
438
+ return msg
439
+ }
440
+
441
+ async handlePollResult(content, jid, quoted) {
442
+ const pollData = content.pollResultMessage
443
+
444
+ const msg = await this.utils.generateWAMessageFromContent(
445
+ jid,
446
+ {
447
+ pollResultSnapshotMessage: {
448
+ name: pollData.name,
449
+ pollVotes: pollData.pollVotes.map((vote) => ({
450
+ optionName: vote.optionName,
451
+ optionVoteCount:
452
+ typeof vote.optionVoteCount === 'number'
453
+ ? vote.optionVoteCount.toString()
454
+ : vote.optionVoteCount
455
+ }))
456
+ }
457
+ },
458
+ {
459
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
460
+ quoted
461
+ }
462
+ )
463
+
464
+ await this.relayMessage(jid, msg.message, {
465
+ messageId: msg.key.id
466
+ })
467
+
468
+ return msg
469
+ }
470
+
471
+ async handleGroupStory(content, jid, quoted) {
472
+ const storyData = content.groupStatusMessage
473
+ let waMsgContent
474
+
475
+ if (storyData.message) {
476
+ waMsgContent = storyData
477
+ } else {
478
+ if (typeof this.bail?.generateWAMessageContent === 'function') {
479
+ waMsgContent = await this.bail.generateWAMessageContent(storyData, {
480
+ upload: this.waUploadToServer
481
+ })
482
+ } else if (typeof this.utils?.generateWAMessageContent === 'function') {
483
+ waMsgContent = await this.utils.generateWAMessageContent(storyData, {
484
+ upload: this.waUploadToServer
485
+ })
486
+ } else if (typeof this.utils?.prepareMessageContent === 'function') {
487
+ waMsgContent = await this.utils.prepareMessageContent(storyData, {
488
+ upload: this.waUploadToServer
489
+ })
490
+ } else {
491
+ waMsgContent = await Utils_1.generateWAMessageContent(storyData, {
492
+ upload: this.waUploadToServer
493
+ })
494
+ }
495
+ }
496
+
497
+ let msg = {
498
+ message: {
499
+ groupStatusMessageV2: {
500
+ message: waMsgContent.message || waMsgContent
501
+ }
502
+ }
503
+ }
504
+
505
+ return await this.relayMessage(jid, msg.message, {
506
+ messageId: this.bail.generateMessageID()
507
+ })
508
+ }
509
+
510
+ async handleComment(content, jid, quoted) {
511
+ const { message, targetMessageKey } = content.commentMessage
512
+ const msg = await this.utils.generateWAMessageFromContent(
513
+ jid,
514
+ {
515
+ commentMessage: { message, targetMessageKey }
516
+ },
517
+ { quoted }
518
+ )
519
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
520
+ return msg
521
+ }
522
+
523
+ async handleBCall(content, jid, quoted) {
524
+ const { sessionId, mediaType, caption } = content.bCallMessage
525
+ const msg = await this.utils.generateWAMessageFromContent(
526
+ jid,
527
+ {
528
+ bCallMessage: { sessionId, mediaType, caption }
529
+ },
530
+ { quoted }
531
+ )
532
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
533
+ return msg
534
+ }
535
+
536
+ async handleScheduledCall(content, jid, quoted) {
537
+ const { scheduledTimestampMs, callType, title } = content.scheduledCallCreationMessage
538
+ const msg = await this.utils.generateWAMessageFromContent(
539
+ jid,
540
+ {
541
+ scheduledCallCreationMessage: { scheduledTimestampMs, callType, title }
542
+ },
543
+ { quoted }
544
+ )
545
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
546
+ return msg
547
+ }
548
+
549
+ async handlePinInChat(content, jid, quoted) {
550
+ const { key, type, senderTimestampMs } = content.pinInChatMessage
551
+ const msg = await this.utils.generateWAMessageFromContent(
552
+ jid,
553
+ {
554
+ pinInChatMessage: { key, type, senderTimestampMs }
555
+ },
556
+ { quoted }
557
+ )
558
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
559
+ return msg
560
+ }
561
+
562
+ async handleEncEventResponse(content, jid, quoted) {
563
+ const { eventCreationMessageKey, encPayload, encIv } = content.encEventResponseMessage
564
+ const msg = await this.utils.generateWAMessageFromContent(
565
+ jid,
566
+ {
567
+ encEventResponseMessage: { eventCreationMessageKey, encPayload, encIv }
568
+ },
569
+ { quoted }
570
+ )
571
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
572
+ return msg
573
+ }
574
+
575
+ async handleStickerPack(content, jid, quoted) {
576
+ const {
577
+ stickerPackId,
578
+ name,
579
+ publisher,
580
+ stickers,
581
+ caption,
582
+ contextInfo,
583
+ packDescription,
584
+ stickerPackSize,
585
+ stickerPackOrigin
586
+ } = content.stickerPackMessage
587
+ const msg = await this.utils.generateWAMessageFromContent(
588
+ jid,
589
+ {
590
+ stickerPackMessage: {
591
+ stickerPackId,
592
+ name,
593
+ publisher,
594
+ stickers,
595
+ caption,
596
+ contextInfo,
597
+ packDescription,
598
+ stickerPackSize,
599
+ stickerPackOrigin
600
+ }
601
+ },
602
+ { quoted }
603
+ )
604
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
605
+ return msg
606
+ }
607
+
608
+ async handleBotFeedback(content, jid, quoted) {
609
+ const { messageKey, kind, text, kindNegative, kindPositive, kindReport } =
610
+ content.botFeedbackMessage
611
+ const msg = await this.utils.generateWAMessageFromContent(
612
+ jid,
613
+ {
614
+ botFeedbackMessage: {
615
+ messageKey,
616
+ kind,
617
+ text,
618
+ kindNegative,
619
+ kindPositive,
620
+ kindReport
621
+ }
622
+ },
623
+ { quoted }
624
+ )
625
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
626
+ return msg
627
+ }
628
+
629
+ async handleEncComment(content, jid, quoted) {
630
+ const { targetMessageKey, encPayload, encIv } = content.encCommentMessage
631
+ const msg = await this.utils.generateWAMessageFromContent(
632
+ jid,
633
+ {
634
+ encCommentMessage: { targetMessageKey, encPayload, encIv }
635
+ },
636
+ { quoted }
637
+ )
638
+ await this.relayMessage(jid, msg.message, { messageId: msg.key.id })
639
+ return msg
640
+ }
641
+
642
+ async sendStatusWhatsApp(content, jids = []) {
643
+ const userJid = WABinary_1.jidNormalizedUser(this.sock.authState.creds.me.id)
644
+ let allUsers = new Set()
645
+ allUsers.add(userJid)
646
+
647
+ for (const id of jids) {
648
+ const isGroup = WABinary_1.isJidGroup(id)
649
+ const isPrivate = WABinary_1.isJidUser(id)
650
+
651
+ if (isGroup) {
652
+ try {
653
+ const metadata = await this.sock.groupMetadata(id)
654
+ const participants = metadata.participants.map((p) =>
655
+ WABinary_1.jidNormalizedUser(p.id)
656
+ )
657
+ participants.forEach((jid) => allUsers.add(jid))
658
+ } catch (error) {
659
+ this.config.logger.error(`Error getting metadata for group ${id}: ${error}`)
660
+ }
661
+ } else if (isPrivate) {
662
+ allUsers.add(WABinary_1.jidNormalizedUser(id))
663
+ }
664
+ }
665
+
666
+ const uniqueUsers = Array.from(allUsers)
667
+ const getRandomHexColor = () =>
668
+ '#' +
669
+ Math.floor(Math.random() * 16777215)
670
+ .toString(16)
671
+ .padStart(6, '0')
672
+
673
+ const isMedia = content.image || content.video || content.audio
674
+ const isAudio = !!content.audio
675
+
676
+ const messageContent = { ...content }
677
+
678
+ if (isMedia && !isAudio) {
679
+ if (messageContent.text) {
680
+ messageContent.caption = messageContent.text
681
+ delete messageContent.text
682
+ }
683
+ delete messageContent.ptt
684
+ delete messageContent.font
685
+ delete messageContent.backgroundColor
686
+ delete messageContent.textColor
687
+ }
688
+
689
+ if (isAudio) {
690
+ delete messageContent.text
691
+ delete messageContent.caption
692
+ delete messageContent.font
693
+ delete messageContent.textColor
694
+ }
695
+
696
+ const font = !isMedia ? content.font || Math.floor(Math.random() * 9) : undefined
697
+ const textColor = !isMedia ? content.textColor || getRandomHexColor() : undefined
698
+ const backgroundColor =
699
+ !isMedia || isAudio ? content.backgroundColor || getRandomHexColor() : undefined
700
+ const ptt = isAudio ? (typeof content.ptt === 'boolean' ? content.ptt : true) : undefined
701
+
702
+ let msg
703
+ let mediaHandle
704
+
705
+ try {
706
+ const link_preview_1 = require('../Utils/link-preview')
707
+
708
+ msg = await Utils_1.generateWAMessage(WABinary_1.STORIES_JID, messageContent, {
709
+ logger: this.config.logger,
710
+ userJid,
711
+ getUrlInfo: (text) =>
712
+ link_preview_1.getUrlInfo(text, {
713
+ thumbnailWidth: this.config.linkPreviewImageThumbnailWidth,
714
+ fetchOpts: { timeout: 3000, ...(this.config.options || {}) },
715
+ logger: this.config.logger,
716
+ uploadImage: this.config.generateHighQualityLinkPreview
717
+ ? this.waUploadToServer
718
+ : undefined
719
+ }),
720
+ upload: async (encFilePath, opts) => {
721
+ const up = await this.waUploadToServer(encFilePath, { ...opts })
722
+ mediaHandle = up.handle
723
+ return up
724
+ },
725
+ mediaCache: this.config.mediaCache,
726
+ options: this.config.options,
727
+ font,
728
+ textColor,
729
+ backgroundColor,
730
+ ptt
731
+ })
732
+ } catch (error) {
733
+ this.config.logger.error(`Error generating message: ${error}`)
734
+ throw error
735
+ }
736
+
737
+ await this.relayMessage(WABinary_1.STORIES_JID, msg.message, {
738
+ messageId: msg.key.id,
739
+ statusJidList: uniqueUsers,
740
+ additionalNodes: [
741
+ {
742
+ tag: 'meta',
743
+ attrs: {},
744
+ content: [
745
+ {
746
+ tag: 'mentioned_users',
747
+ attrs: {},
748
+ content: jids.map((jid) => ({
749
+ tag: 'to',
750
+ attrs: { jid: WABinary_1.jidNormalizedUser(jid) }
751
+ }))
752
+ }
753
+ ]
754
+ }
755
+ ]
756
+ })
757
+
758
+ for (const id of jids) {
759
+ try {
760
+ const normalizedId = WABinary_1.jidNormalizedUser(id)
761
+ const isPrivate = WABinary_1.isJidUser(normalizedId)
762
+ const type = isPrivate ? 'statusMentionMessage' : 'groupStatusMentionMessage'
763
+
764
+ const protocolMessage = {
765
+ [type]: {
766
+ message: {
767
+ protocolMessage: {
768
+ key: msg.key,
769
+ type: 25
770
+ }
771
+ }
772
+ },
773
+ messageContextInfo: {
774
+ messageSecret: crypto.randomBytes(32)
775
+ }
776
+ }
777
+
778
+ const statusMsg = await Utils_1.generateWAMessageFromContent(
779
+ normalizedId,
780
+ protocolMessage,
781
+ {}
782
+ )
783
+
784
+ await this.relayMessage(normalizedId, statusMsg.message, {
785
+ additionalNodes: [
786
+ {
787
+ tag: 'meta',
788
+ attrs: isPrivate
789
+ ? { is_status_mention: 'true' }
790
+ : { is_group_status_mention: 'true' }
791
+ }
792
+ ]
793
+ })
794
+
795
+ await Utils_1.delay(2000)
796
+ } catch (error) {
797
+ this.config.logger.error(`Error sending to ${id}: ${error}`)
798
+ }
799
+ }
800
+
801
+ return msg
802
+ }
803
+ }
804
+
805
+ module.exports = TempeGoreng