@than-xs/baileys 2.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 (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +422 -0
  3. package/WAProto/index.js +169661 -0
  4. package/engine-requirements.js +10 -0
  5. package/lib/Defaults/baileys-version.json +3 -0
  6. package/lib/Defaults/index.js +147 -0
  7. package/lib/Defaults/phonenumber-mcc.json +223 -0
  8. package/lib/Signal/Group/ciphertext-message.js +15 -0
  9. package/lib/Signal/Group/group-session-builder.js +64 -0
  10. package/lib/Signal/Group/group_cipher.js +96 -0
  11. package/lib/Signal/Group/index.js +57 -0
  12. package/lib/Signal/Group/keyhelper.js +55 -0
  13. package/lib/Signal/Group/queue-job.js +57 -0
  14. package/lib/Signal/Group/sender-chain-key.js +34 -0
  15. package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
  16. package/lib/Signal/Group/sender-key-message.js +69 -0
  17. package/lib/Signal/Group/sender-key-name.js +51 -0
  18. package/lib/Signal/Group/sender-key-record.js +53 -0
  19. package/lib/Signal/Group/sender-key-state.js +99 -0
  20. package/lib/Signal/Group/sender-message-key.js +29 -0
  21. package/lib/Signal/libsignal.js +174 -0
  22. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  23. package/lib/Socket/Client/index.js +19 -0
  24. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  25. package/lib/Socket/Client/web-socket-client.js +62 -0
  26. package/lib/Socket/business.js +260 -0
  27. package/lib/Socket/chats.js +1002 -0
  28. package/lib/Socket/dugong.js +637 -0
  29. package/lib/Socket/groups.js +317 -0
  30. package/lib/Socket/index.js +11 -0
  31. package/lib/Socket/messages-recv.js +1110 -0
  32. package/lib/Socket/messages-send.js +831 -0
  33. package/lib/Socket/newsletter.js +459 -0
  34. package/lib/Socket/registration.js +166 -0
  35. package/lib/Socket/socket.js +662 -0
  36. package/lib/Socket/usync.js +70 -0
  37. package/lib/Store/index.js +10 -0
  38. package/lib/Store/make-cache-manager-store.js +83 -0
  39. package/lib/Store/make-in-memory-store.js +427 -0
  40. package/lib/Store/make-ordered-dictionary.js +81 -0
  41. package/lib/Store/object-repository.js +27 -0
  42. package/lib/Types/Auth.js +2 -0
  43. package/lib/Types/Call.js +2 -0
  44. package/lib/Types/Chat.js +4 -0
  45. package/lib/Types/Contact.js +2 -0
  46. package/lib/Types/Events.js +2 -0
  47. package/lib/Types/GroupMetadata.js +2 -0
  48. package/lib/Types/Label.js +27 -0
  49. package/lib/Types/LabelAssociation.js +9 -0
  50. package/lib/Types/Message.js +9 -0
  51. package/lib/Types/Newsletter.js +38 -0
  52. package/lib/Types/Product.js +2 -0
  53. package/lib/Types/Signal.js +2 -0
  54. package/lib/Types/Socket.js +2 -0
  55. package/lib/Types/State.js +2 -0
  56. package/lib/Types/USync.js +2 -0
  57. package/lib/Types/index.js +42 -0
  58. package/lib/Utils/auth-utils.js +206 -0
  59. package/lib/Utils/baileys-event-stream.js +63 -0
  60. package/lib/Utils/business.js +234 -0
  61. package/lib/Utils/chat-utils.js +729 -0
  62. package/lib/Utils/crypto.js +151 -0
  63. package/lib/Utils/decode-wa-message.js +198 -0
  64. package/lib/Utils/event-buffer.js +514 -0
  65. package/lib/Utils/generics.js +498 -0
  66. package/lib/Utils/history.js +96 -0
  67. package/lib/Utils/index.js +33 -0
  68. package/lib/Utils/link-preview.js +93 -0
  69. package/lib/Utils/logger.js +7 -0
  70. package/lib/Utils/lt-hash.js +51 -0
  71. package/lib/Utils/make-mutex.js +43 -0
  72. package/lib/Utils/messages-media.js +819 -0
  73. package/lib/Utils/messages.js +819 -0
  74. package/lib/Utils/noise-handler.js +155 -0
  75. package/lib/Utils/process-message.js +321 -0
  76. package/lib/Utils/signal.js +153 -0
  77. package/lib/Utils/use-multi-file-auth-state.js +119 -0
  78. package/lib/Utils/validate-connection.js +229 -0
  79. package/lib/WABinary/constants.js +40 -0
  80. package/lib/WABinary/decode.js +252 -0
  81. package/lib/WABinary/encode.js +265 -0
  82. package/lib/WABinary/generic-utils.js +198 -0
  83. package/lib/WABinary/index.js +21 -0
  84. package/lib/WABinary/jid-utils.js +62 -0
  85. package/lib/WABinary/types.js +2 -0
  86. package/lib/WAM/BinaryInfo.js +13 -0
  87. package/lib/WAM/constants.js +15350 -0
  88. package/lib/WAM/encode.js +155 -0
  89. package/lib/WAM/index.js +19 -0
  90. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  91. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  92. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  93. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  94. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  95. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  96. package/lib/WAUSync/Protocols/index.js +20 -0
  97. package/lib/WAUSync/USyncQuery.js +89 -0
  98. package/lib/WAUSync/USyncUser.js +26 -0
  99. package/lib/WAUSync/index.js +19 -0
  100. package/lib/index.js +84 -0
  101. package/package.json +110 -0
@@ -0,0 +1,637 @@
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 kikyy {
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: this.utils.generateWAMessageContent || Utils_1.generateWAMessageContent,
16
+ generateMessageID: Utils_1.generateMessageID,
17
+ getContentType: (msg) => Object.keys(msg.message || {})[0]
18
+ };
19
+ }
20
+
21
+ detectType(content) {
22
+ if (content.requestPaymentMessage) return 'PAYMENT';
23
+ if (content.productMessage) return 'PRODUCT';
24
+ if (content.interactiveMessage) return 'INTERACTIVE';
25
+ if (content.albumMessage) return 'ALBUM';
26
+ if (content.eventMessage) return 'EVENT';
27
+ if (content.pollResultMessage) return 'POLL_RESULT';
28
+ if (content.groupStatusMessage) return 'GROUP_STORY';
29
+ return null;
30
+ }
31
+
32
+ async handlePayment(content, quoted) {
33
+ const data = content.requestPaymentMessage;
34
+ let notes = {};
35
+
36
+ if (data.sticker?.stickerMessage) {
37
+ notes = {
38
+ stickerMessage: {
39
+ ...data.sticker.stickerMessage,
40
+ contextInfo: {
41
+ stanzaId: quoted?.key?.id,
42
+ participant: quoted?.key?.participant || content.sender,
43
+ quotedMessage: quoted?.message
44
+ }
45
+ }
46
+ };
47
+ } else if (data.note) {
48
+ notes = {
49
+ extendedTextMessage: {
50
+ text: data.note,
51
+ contextInfo: {
52
+ stanzaId: quoted?.key?.id,
53
+ participant: quoted?.key?.participant || content.sender,
54
+ quotedMessage: quoted?.message
55
+ }
56
+ }
57
+ };
58
+ }
59
+
60
+ return {
61
+ requestPaymentMessage: WAProto.Message.RequestPaymentMessage.fromObject({
62
+ expiryTimestamp: data.expiry || 0,
63
+ amount1000: data.amount || 0,
64
+ currencyCodeIso4217: data.currency || "IDR",
65
+ requestFrom: data.from || "0@s.whatsapp.net",
66
+ noteMessage: notes,
67
+ background: data.background ?? {
68
+ id: "DEFAULT",
69
+ placeholderArgb: 0xFFF0F0F0
70
+ }
71
+ })
72
+ };
73
+ }
74
+
75
+ async handleProduct(content, jid, quoted) {
76
+ const {
77
+ title,
78
+ description,
79
+ thumbnail,
80
+ productId,
81
+ retailerId,
82
+ url,
83
+ body = "",
84
+ footer = "",
85
+ buttons = [],
86
+ priceAmount1000 = null,
87
+ currencyCode = "IDR"
88
+ } = content.productMessage;
89
+
90
+ let productImage;
91
+
92
+ if (Buffer.isBuffer(thumbnail)) {
93
+ const { imageMessage } = await this.utils.generateWAMessageContent(
94
+ { image: thumbnail },
95
+ { upload: this.waUploadToServer }
96
+ );
97
+ productImage = imageMessage;
98
+ } else if (typeof thumbnail === 'object' && thumbnail.url) {
99
+ const { imageMessage } = await this.utils.generateWAMessageContent(
100
+ { image: { url: thumbnail.url }},
101
+ { upload: this.waUploadToServer }
102
+ );
103
+ productImage = imageMessage;
104
+ }
105
+
106
+ return {
107
+ viewOnceMessage: {
108
+ message: {
109
+ interactiveMessage: {
110
+ body: { text: body },
111
+ footer: { text: footer },
112
+ header: {
113
+ title,
114
+ hasMediaAttachment: true,
115
+ productMessage: {
116
+ product: {
117
+ productImage,
118
+ productId,
119
+ title,
120
+ description,
121
+ currencyCode,
122
+ priceAmount1000,
123
+ retailerId,
124
+ url,
125
+ productImageCount: 1
126
+ },
127
+ businessOwnerJid: "0@s.whatsapp.net"
128
+ }
129
+ },
130
+ nativeFlowMessage: { buttons }
131
+ }
132
+ }
133
+ }
134
+ };
135
+ }
136
+
137
+ async handleInteractive(content, jid, quoted) {
138
+ const {
139
+ title,
140
+ footer,
141
+ thumbnail,
142
+ image,
143
+ video,
144
+ document,
145
+ mimetype,
146
+ fileName,
147
+ jpegThumbnail,
148
+ contextInfo,
149
+ externalAdReply,
150
+ buttons = [],
151
+ nativeFlowMessage,
152
+ header
153
+ } = content.interactiveMessage;
154
+
155
+ let media = null;
156
+ let mediaType = null;
157
+
158
+ if (thumbnail) {
159
+ media = await this.utils.prepareWAMessageMedia(
160
+ { image: { url: thumbnail } },
161
+ { upload: this.waUploadToServer }
162
+ );
163
+ mediaType = 'image';
164
+ } else if (image) {
165
+ if (typeof image === 'object' && image.url) {
166
+ media = await this.utils.prepareWAMessageMedia(
167
+ { image: { url: image.url } },
168
+ { upload: this.waUploadToServer }
169
+ );
170
+ } else {
171
+ media = await this.utils.prepareWAMessageMedia(
172
+ { image: image },
173
+ { upload: this.waUploadToServer }
174
+ );
175
+ }
176
+ mediaType = 'image';
177
+ } else if (video) {
178
+ if (typeof video === 'object' && video.url) {
179
+ media = await this.utils.prepareWAMessageMedia(
180
+ { video: { url: video.url } },
181
+ { upload: this.waUploadToServer }
182
+ );
183
+ } else {
184
+ media = await this.utils.prepareWAMessageMedia(
185
+ { video: video },
186
+ { upload: this.waUploadToServer }
187
+ );
188
+ }
189
+ mediaType = 'video';
190
+ } else if (document) {
191
+ let documentPayload = {
192
+ document: document
193
+ };
194
+ if (jpegThumbnail) {
195
+ if (typeof jpegThumbnail === 'object' && jpegThumbnail.url) {
196
+ documentPayload.jpegThumbnail = { url: jpegThumbnail.url };
197
+ } else {
198
+ documentPayload.jpegThumbnail = jpegThumbnail;
199
+ }
200
+ }
201
+
202
+ media = await this.utils.prepareWAMessageMedia(
203
+ documentPayload,
204
+ { upload: this.waUploadToServer }
205
+ );
206
+ if (fileName) {
207
+ media.documentMessage.fileName = fileName;
208
+ }
209
+ if (mimetype) {
210
+ media.documentMessage.mimetype = mimetype;
211
+ }
212
+ mediaType = 'document';
213
+ }
214
+ let interactiveMessage = {
215
+ body: { text: title || "" },
216
+ footer: { text: footer || "" }
217
+ };
218
+ if (buttons && buttons.length > 0) {
219
+ interactiveMessage.nativeFlowMessage = {
220
+ buttons: buttons
221
+ };
222
+ if (nativeFlowMessage) {
223
+ interactiveMessage.nativeFlowMessage = {
224
+ ...interactiveMessage.nativeFlowMessage,
225
+ ...nativeFlowMessage
226
+ };
227
+ }
228
+ } else if (nativeFlowMessage) {
229
+ interactiveMessage.nativeFlowMessage = nativeFlowMessage;
230
+ }
231
+
232
+ if (media) {
233
+ interactiveMessage.header = {
234
+ title: header || "",
235
+ hasMediaAttachment: true,
236
+ ...media
237
+ };
238
+ } else {
239
+ interactiveMessage.header = {
240
+ title: header || "",
241
+ hasMediaAttachment: false
242
+ };
243
+ }
244
+
245
+ let finalContextInfo = {};
246
+ if (contextInfo) {
247
+ finalContextInfo = {
248
+ mentionedJid: contextInfo.mentionedJid || [],
249
+ forwardingScore: contextInfo.forwardingScore || 0,
250
+ isForwarded: contextInfo.isForwarded || false,
251
+ ...contextInfo
252
+ };
253
+ }
254
+
255
+ if (externalAdReply) {
256
+ finalContextInfo.externalAdReply = {
257
+ title: externalAdReply.title || "",
258
+ body: externalAdReply.body || "",
259
+ mediaType: externalAdReply.mediaType || 1,
260
+ thumbnailUrl: externalAdReply.thumbnailUrl || "",
261
+ mediaUrl: externalAdReply.mediaUrl || "",
262
+ sourceUrl: externalAdReply.sourceUrl || "",
263
+ showAdAttribution: externalAdReply.showAdAttribution || false,
264
+ renderLargerThumbnail: externalAdReply.renderLargerThumbnail || false,
265
+ ...externalAdReply
266
+ };
267
+ }
268
+
269
+ if (Object.keys(finalContextInfo).length > 0) {
270
+ interactiveMessage.contextInfo = finalContextInfo;
271
+ }
272
+ return {
273
+ interactiveMessage: interactiveMessage
274
+ };
275
+ }
276
+
277
+ async handleAlbum(content, jid, quoted) {
278
+ const array = content.albumMessage;
279
+ const album = await this.utils.generateWAMessageFromContent(jid, {
280
+ messageContextInfo: {
281
+ messageSecret: crypto.randomBytes(32),
282
+ },
283
+ albumMessage: {
284
+ expectedImageCount: array.filter((a) => a.hasOwnProperty("image")).length,
285
+ expectedVideoCount: array.filter((a) => a.hasOwnProperty("video")).length,
286
+ },
287
+ }, {
288
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
289
+ quoted,
290
+ upload: this.waUploadToServer
291
+ });
292
+
293
+ await this.relayMessage(jid, album.message, {
294
+ messageId: album.key.id,
295
+ });
296
+
297
+ for (let content of array) {
298
+ const img = await this.utils.generateWAMessage(jid, content, {
299
+ upload: this.waUploadToServer,
300
+ });
301
+
302
+ img.message.messageContextInfo = {
303
+ messageSecret: crypto.randomBytes(32),
304
+ messageAssociation: {
305
+ associationType: 1,
306
+ parentMessageKey: album.key,
307
+ },
308
+ participant: "0@s.whatsapp.net",
309
+ remoteJid: "status@broadcast",
310
+ forwardingScore: 99999,
311
+ isForwarded: true,
312
+ mentionedJid: [jid],
313
+ starred: true,
314
+ labels: ["Y", "Important"],
315
+ isHighlighted: true,
316
+ businessMessageForwardInfo: {
317
+ businessOwnerJid: jid,
318
+ },
319
+ dataSharingContext: {
320
+ showMmDisclosure: true,
321
+ },
322
+ };
323
+
324
+ img.message.forwardedNewsletterMessageInfo = {
325
+ newsletterJid: "0@newsletter",
326
+ serverMessageId: 1,
327
+ newsletterName: `WhatsApp`,
328
+ contentType: 1,
329
+ timestamp: new Date().toISOString(),
330
+ senderName: "thann dugonggg",
331
+ content: "Text Message",
332
+ priority: "high",
333
+ status: "sent",
334
+ };
335
+
336
+ img.message.disappearingMode = {
337
+ initiator: 3,
338
+ trigger: 4,
339
+ initiatorDeviceJid: jid,
340
+ initiatedByExternalService: true,
341
+ initiatedByUserDevice: true,
342
+ initiatedBySystem: true,
343
+ initiatedByServer: true,
344
+ initiatedByAdmin: true,
345
+ initiatedByUser: true,
346
+ initiatedByApp: true,
347
+ initiatedByBot: true,
348
+ initiatedByMe: true,
349
+ };
350
+
351
+ await this.relayMessage(jid, img.message, {
352
+ messageId: img.key.id,
353
+ quoted: {
354
+ key: {
355
+ remoteJid: album.key.remoteJid,
356
+ id: album.key.id,
357
+ fromMe: true,
358
+ participant: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
359
+ },
360
+ message: album.message,
361
+ },
362
+ });
363
+ }
364
+ return album;
365
+ }
366
+
367
+ async handleEvent(content, jid, quoted) {
368
+ const eventData = content.eventMessage;
369
+
370
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
371
+ viewOnceMessage: {
372
+ message: {
373
+ messageContextInfo: {
374
+ deviceListMetadata: {},
375
+ deviceListMetadataVersion: 2,
376
+ messageSecret: crypto.randomBytes(32),
377
+ supportPayload: JSON.stringify({
378
+ version: 2,
379
+ is_ai_message: true,
380
+ should_show_system_message: true,
381
+ ticket_id: crypto.randomBytes(16).toString('hex')
382
+ })
383
+ },
384
+ eventMessage: {
385
+ contextInfo: {
386
+ mentionedJid: [jid],
387
+ participant: jid,
388
+ remoteJid: "status@broadcast",
389
+ forwardedNewsletterMessageInfo: {
390
+ newsletterName: "than.xs",
391
+ newsletterJid: "120363400738305381@newsletter",
392
+ serverMessageId: 1
393
+ }
394
+ },
395
+ isCanceled: eventData.isCanceled || false,
396
+ name: eventData.name,
397
+ description: eventData.description,
398
+ location: eventData.location || {
399
+ degreesLatitude: 0,
400
+ degreesLongitude: 0,
401
+ name: "Location"
402
+ },
403
+ joinLink: eventData.joinLink || '',
404
+ startTime: typeof eventData.startTime === 'string' ? parseInt(eventData.startTime) : eventData.startTime || Date.now(),
405
+ endTime: typeof eventData.endTime === 'string' ? parseInt(eventData.endTime) : eventData.endTime || Date.now() + 3600000,
406
+ extraGuestsAllowed: eventData.extraGuestsAllowed !== false
407
+ }
408
+ }
409
+ }
410
+ }, { quoted });
411
+
412
+ await this.relayMessage(jid, msg.message, {
413
+ messageId: msg.key.id
414
+ });
415
+ return msg;
416
+ }
417
+
418
+ async handlePollResult(content, jid, quoted) {
419
+ const pollData = content.pollResultMessage;
420
+
421
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
422
+ pollResultSnapshotMessage: {
423
+ name: pollData.name,
424
+ pollVotes: pollData.pollVotes.map(vote => ({
425
+ optionName: vote.optionName,
426
+ optionVoteCount: typeof vote.optionVoteCount === 'number'
427
+ ? vote.optionVoteCount.toString()
428
+ : vote.optionVoteCount
429
+ }))
430
+ }
431
+ }, {
432
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
433
+ quoted
434
+ });
435
+
436
+ await this.relayMessage(jid, msg.message, {
437
+ messageId: msg.key.id
438
+ });
439
+
440
+ return msg;
441
+ }
442
+
443
+ async handleGroupStory(content, jid, quoted) {
444
+ const storyData = content.groupStatusMessage;
445
+ let waMsgContent;
446
+
447
+ if (storyData.message) {
448
+ waMsgContent = storyData;
449
+ } else {
450
+ if (typeof this.bail?.generateWAMessageContent === "function") {
451
+ waMsgContent = await this.bail.generateWAMessageContent(storyData, {
452
+ upload: this.waUploadToServer
453
+ });
454
+ } else if (typeof this.utils?.generateWAMessageContent === "function") {
455
+ waMsgContent = await this.utils.generateWAMessageContent(storyData, {
456
+ upload: this.waUploadToServer
457
+ });
458
+ } else if (typeof this.utils?.prepareMessageContent === "function") {
459
+ waMsgContent = await this.utils.prepareMessageContent(storyData, {
460
+ upload: this.waUploadToServer
461
+ });
462
+ } else {
463
+ waMsgContent = await Utils_1.generateWAMessageContent(storyData, {
464
+ upload: this.waUploadToServer
465
+ });
466
+ }
467
+ }
468
+
469
+ let msg = {
470
+ message: {
471
+ groupStatusMessageV2: {
472
+ message: waMsgContent.message || waMsgContent
473
+ }
474
+ }
475
+ };
476
+
477
+ return await this.relayMessage(jid, msg.message, {
478
+ messageId: this.bail.generateMessageID()
479
+ });
480
+ }
481
+
482
+ async sendStatusWhatsApp(content, jids = []) {
483
+ const userJid = WABinary_1.jidNormalizedUser(this.sock.authState.creds.me.id);
484
+ let allUsers = new Set();
485
+ allUsers.add(userJid);
486
+
487
+ for (const id of jids) {
488
+ const isGroup = WABinary_1.isJidGroup(id);
489
+ const isPrivate = WABinary_1.isJidUser(id);
490
+
491
+ if (isGroup) {
492
+ try {
493
+ const metadata = await this.sock.groupMetadata(id);
494
+ const participants = metadata.participants.map(p => WABinary_1.jidNormalizedUser(p.id));
495
+ participants.forEach(jid => allUsers.add(jid));
496
+ } catch (error) {
497
+ this.config.logger.error(`Error getting metadata for group ${id}: ${error}`);
498
+ }
499
+ } else if (isPrivate) {
500
+ allUsers.add(WABinary_1.jidNormalizedUser(id));
501
+ }
502
+ }
503
+
504
+ const uniqueUsers = Array.from(allUsers);
505
+ const getRandomHexColor = () => "#" + Math.floor(Math.random() * 16777215).toString(16).padStart(6, "0");
506
+
507
+ const isMedia = content.image || content.video || content.audio;
508
+ const isAudio = !!content.audio;
509
+
510
+ const messageContent = { ...content };
511
+
512
+ if (isMedia && !isAudio) {
513
+ if (messageContent.text) {
514
+ messageContent.caption = messageContent.text;
515
+ delete messageContent.text;
516
+ }
517
+ delete messageContent.ptt;
518
+ delete messageContent.font;
519
+ delete messageContent.backgroundColor;
520
+ delete messageContent.textColor;
521
+ }
522
+
523
+ if (isAudio) {
524
+ delete messageContent.text;
525
+ delete messageContent.caption;
526
+ delete messageContent.font;
527
+ delete messageContent.textColor;
528
+ }
529
+
530
+ const font = !isMedia ? (content.font || Math.floor(Math.random() * 9)) : undefined;
531
+ const textColor = !isMedia ? (content.textColor || getRandomHexColor()) : undefined;
532
+ const backgroundColor = (!isMedia || isAudio) ? (content.backgroundColor || getRandomHexColor()) : undefined;
533
+ const ptt = isAudio ? (typeof content.ptt === 'boolean' ? content.ptt : true) : undefined;
534
+
535
+ let msg;
536
+ let mediaHandle;
537
+
538
+ try {
539
+ const link_preview_1 = require("../Utils/link-preview");
540
+
541
+ msg = await Utils_1.generateWAMessage(WABinary_1.STORIES_JID, messageContent, {
542
+ logger: this.config.logger,
543
+ userJid,
544
+ getUrlInfo: text => link_preview_1.getUrlInfo(text, {
545
+ thumbnailWidth: this.config.linkPreviewImageThumbnailWidth,
546
+ fetchOpts: { timeout: 3000, ...this.config.options || {} },
547
+ logger: this.config.logger,
548
+ uploadImage: this.config.generateHighQualityLinkPreview ? this.waUploadToServer : undefined
549
+ }),
550
+ upload: async (encFilePath, opts) => {
551
+ const up = await this.waUploadToServer(encFilePath, { ...opts });
552
+ mediaHandle = up.handle;
553
+ return up;
554
+ },
555
+ mediaCache: this.config.mediaCache,
556
+ options: this.config.options,
557
+ font,
558
+ textColor,
559
+ backgroundColor,
560
+ ptt
561
+ });
562
+ } catch (error) {
563
+ this.config.logger.error(`Error generating message: ${error}`);
564
+ throw error;
565
+ }
566
+
567
+ await this.relayMessage(WABinary_1.STORIES_JID, msg.message, {
568
+ messageId: msg.key.id,
569
+ statusJidList: uniqueUsers,
570
+ additionalNodes: [
571
+ {
572
+ tag: 'meta',
573
+ attrs: {},
574
+ content: [
575
+ {
576
+ tag: 'mentioned_users',
577
+ attrs: {},
578
+ content: jids.map(jid => ({
579
+ tag: 'to',
580
+ attrs: { jid: WABinary_1.jidNormalizedUser(jid) }
581
+ }))
582
+ }
583
+ ]
584
+ }
585
+ ]
586
+ });
587
+
588
+ for (const id of jids) {
589
+ try {
590
+ const normalizedId = WABinary_1.jidNormalizedUser(id);
591
+ const isPrivate = WABinary_1.isJidUser(normalizedId);
592
+ const type = isPrivate ? 'statusMentionMessage' : 'groupStatusMentionMessage';
593
+
594
+ const protocolMessage = {
595
+ [type]: {
596
+ message: {
597
+ protocolMessage: {
598
+ key: msg.key,
599
+ type: 25
600
+ }
601
+ }
602
+ },
603
+ messageContextInfo: {
604
+ messageSecret: crypto.randomBytes(32)
605
+ }
606
+ };
607
+
608
+ const statusMsg = await Utils_1.generateWAMessageFromContent(
609
+ normalizedId,
610
+ protocolMessage,
611
+ {}
612
+ );
613
+
614
+ await this.relayMessage(
615
+ normalizedId,
616
+ statusMsg.message,
617
+ {
618
+ additionalNodes: [{
619
+ tag: 'meta',
620
+ attrs: isPrivate ?
621
+ { is_status_mention: 'true' } :
622
+ { is_group_status_mention: 'true' }
623
+ }]
624
+ }
625
+ );
626
+
627
+ await Utils_1.delay(2000);
628
+ } catch (error) {
629
+ this.config.logger.error(`Error sending to ${id}: ${error}`);
630
+ }
631
+ }
632
+
633
+ return msg;
634
+ }
635
+ }
636
+
637
+ module.exports = kikyy;