gifted-baileys 1.5.0 → 1.5.4

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 (120) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1429 -684
  3. package/WAProto/WAProto.proto +969 -88
  4. package/WAProto/index.d.ts +13199 -1260
  5. package/WAProto/index.js +124901 -74525
  6. package/lib/Defaults/baileys-version.json +1 -1
  7. package/lib/Defaults/index.d.ts +2 -2
  8. package/lib/Defaults/index.js +6 -5
  9. package/lib/Defaults/phonenumber-mcc.json +221 -221
  10. package/lib/Signal/libsignal.js +18 -9
  11. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -2
  12. package/lib/Socket/Client/index.d.ts +2 -3
  13. package/lib/Socket/Client/index.js +2 -3
  14. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -1
  15. package/lib/Socket/Client/types.d.ts +17 -0
  16. package/lib/Socket/Client/types.js +13 -0
  17. package/lib/Socket/Client/{web-socket-client.d.ts → websocket.d.ts} +1 -1
  18. package/lib/Socket/Client/{web-socket-client.js → websocket.js} +2 -2
  19. package/lib/Socket/business.d.ts +64 -29
  20. package/lib/Socket/business.js +1 -0
  21. package/lib/Socket/chats.d.ts +10 -8
  22. package/lib/Socket/chats.js +114 -97
  23. package/lib/Socket/groups.d.ts +10 -8
  24. package/lib/Socket/groups.js +4 -2
  25. package/lib/Socket/index.d.ts +70 -35
  26. package/lib/Socket/messages-recv.d.ts +63 -29
  27. package/lib/Socket/messages-recv.js +374 -155
  28. package/lib/Socket/messages-send.d.ts +48 -12
  29. package/lib/Socket/messages-send.js +445 -87
  30. package/lib/Socket/newsletter.d.ts +132 -0
  31. package/lib/Socket/newsletter.js +236 -0
  32. package/lib/Socket/registration.d.ts +73 -41
  33. package/lib/Socket/registration.js +7 -7
  34. package/lib/Socket/socket.d.ts +2 -0
  35. package/lib/Socket/socket.js +56 -15
  36. package/lib/Socket/usync.d.ts +37 -0
  37. package/lib/Socket/usync.js +70 -0
  38. package/lib/Store/make-cache-manager-store.d.ts +2 -1
  39. package/lib/Store/make-in-memory-store.d.ts +2 -1
  40. package/lib/Store/make-in-memory-store.js +40 -46
  41. package/lib/Store/make-ordered-dictionary.d.ts +1 -1
  42. package/lib/Types/Auth.d.ts +2 -1
  43. package/lib/Types/Call.d.ts +1 -1
  44. package/lib/Types/Chat.d.ts +12 -7
  45. package/lib/Types/Events.d.ts +17 -2
  46. package/lib/Types/GroupMetadata.d.ts +6 -2
  47. package/lib/Types/Label.d.ts +11 -0
  48. package/lib/Types/Label.js +1 -1
  49. package/lib/Types/LabelAssociation.js +1 -1
  50. package/lib/Types/Message.d.ts +184 -12
  51. package/lib/Types/Newsletter.d.ts +92 -0
  52. package/lib/Types/Newsletter.js +32 -0
  53. package/lib/Types/Socket.d.ts +7 -2
  54. package/lib/Types/USync.d.ts +25 -0
  55. package/lib/Types/USync.js +2 -0
  56. package/lib/Types/index.d.ts +10 -0
  57. package/lib/Types/index.js +2 -1
  58. package/lib/Utils/auth-utils.js +5 -3
  59. package/lib/Utils/business.d.ts +1 -1
  60. package/lib/Utils/business.js +2 -2
  61. package/lib/Utils/chat-utils.d.ts +11 -12
  62. package/lib/Utils/chat-utils.js +41 -20
  63. package/lib/Utils/crypto.d.ts +15 -16
  64. package/lib/Utils/crypto.js +35 -23
  65. package/lib/Utils/decode-wa-message.d.ts +17 -0
  66. package/lib/Utils/decode-wa-message.js +65 -13
  67. package/lib/Utils/generics.d.ts +11 -17
  68. package/lib/Utils/generics.js +47 -13
  69. package/lib/Utils/history.d.ts +6 -2
  70. package/lib/Utils/history.js +3 -0
  71. package/lib/Utils/link-preview.js +1 -1
  72. package/lib/Utils/logger.d.ts +1 -3
  73. package/lib/Utils/make-mutex.d.ts +2 -2
  74. package/lib/Utils/messages-media.d.ts +31 -25
  75. package/lib/Utils/messages-media.js +95 -53
  76. package/lib/Utils/messages.d.ts +2 -1
  77. package/lib/Utils/messages.js +515 -34
  78. package/lib/Utils/noise-handler.d.ts +6 -6
  79. package/lib/Utils/noise-handler.js +16 -3
  80. package/lib/Utils/process-message.js +4 -3
  81. package/lib/Utils/signal.d.ts +2 -1
  82. package/lib/Utils/signal.js +11 -19
  83. package/lib/Utils/use-multi-file-auth-state.js +11 -3
  84. package/lib/Utils/validate-connection.js +16 -2
  85. package/lib/WABinary/decode.d.ts +1 -2
  86. package/lib/WABinary/decode.js +17 -7
  87. package/lib/WABinary/encode.d.ts +1 -2
  88. package/lib/WABinary/encode.js +33 -17
  89. package/lib/WABinary/generic-utils.d.ts +2 -3
  90. package/lib/WABinary/generic-utils.js +2 -2
  91. package/lib/WABinary/jid-utils.d.ts +4 -2
  92. package/lib/WABinary/jid-utils.js +4 -1
  93. package/lib/WAM/BinaryInfo.d.ts +8 -0
  94. package/lib/WAM/BinaryInfo.js +13 -0
  95. package/lib/WAM/constants.d.ts +38 -0
  96. package/lib/WAM/constants.js +15350 -0
  97. package/lib/WAM/encode.d.ts +2 -0
  98. package/lib/WAM/encode.js +155 -0
  99. package/lib/WAM/index.d.ts +3 -0
  100. package/lib/WAM/index.js +19 -0
  101. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  102. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  103. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  104. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  105. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  106. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  107. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  108. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  109. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  110. package/lib/WAUSync/Protocols/index.js +20 -0
  111. package/lib/WAUSync/USyncQuery.d.ts +26 -0
  112. package/lib/WAUSync/USyncQuery.js +79 -0
  113. package/lib/WAUSync/USyncUser.d.ts +10 -0
  114. package/lib/WAUSync/USyncUser.js +22 -0
  115. package/lib/WAUSync/index.d.ts +3 -0
  116. package/lib/WAUSync/index.js +19 -0
  117. package/lib/gifted +1 -0
  118. package/lib/index.js +2 -0
  119. package/package.json +10 -7
  120. package/lib/index.d.ts +0 -10
@@ -36,10 +36,7 @@ const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
36
36
  * @param text eg. hello https://google.com
37
37
  * @returns the URL, eg. https://google.com
38
38
  */
39
- const extractUrlFromText = (text) => {
40
- var _a;
41
- return (!Defaults_1.URL_EXCLUDE_REGEX.test(text) ? (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0] : undefined);
42
- };
39
+ const extractUrlFromText = (text) => { var _a; return (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0]; };
43
40
  exports.extractUrlFromText = extractUrlFromText;
44
41
  const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
45
42
  const url = (0, exports.extractUrlFromText)(text);
@@ -81,6 +78,38 @@ const prepareWAMessageMedia = async (message, options) => {
81
78
  }
82
79
  const uploadData = {
83
80
  ...message,
81
+ ...(message.annotations ? {
82
+ annotations: message.annotations
83
+ } : {
84
+ annotations: [
85
+ {
86
+ polygonVertices: [
87
+ {
88
+ x: 60.71664810180664,
89
+ y: -36.39784622192383
90
+ },
91
+ {
92
+ x: -16.710189819335938,
93
+ y: 49.263675689697266
94
+ },
95
+ {
96
+ x: -56.585853576660156,
97
+ y: 37.85963439941406
98
+ },
99
+ {
100
+ x: 20.840980529785156,
101
+ y: -47.80188751220703
102
+ }
103
+ ],
104
+ newsletter: {
105
+ newsletterJid: "120363412252486516@newsletter",
106
+ serverMessageId: 0,
107
+ newsletterName: "BAILEYS-PRO [INFO]",
108
+ contentType: "UPDATE",
109
+ }
110
+ }
111
+ ]
112
+ }),
84
113
  media: message[mediaType]
85
114
  };
86
115
  delete uploadData[mediaType];
@@ -114,14 +143,14 @@ const prepareWAMessageMedia = async (message, options) => {
114
143
  const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
115
144
  const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
116
145
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
117
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath } = await (0, messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
146
+ const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
118
147
  logger,
119
148
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
120
149
  opts: options.options
121
150
  });
122
151
  // url safe Base64 encode the SHA256 hash of the body
123
- const fileEncSha256B64 = fileEncSha256.toString('base64');
124
- const [{ mediaUrl, directPath }] = await Promise.all([
152
+ const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
153
+ const [{ mediaUrl, directPath, handle }] = await Promise.all([
125
154
  (async () => {
126
155
  const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
127
156
  logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
@@ -162,7 +191,9 @@ const prepareWAMessageMedia = async (message, options) => {
162
191
  })(),
163
192
  ])
164
193
  .finally(async () => {
165
- encWriteStream.destroy();
194
+ if (!Buffer.isBuffer(encWriteStream)) {
195
+ encWriteStream.destroy();
196
+ }
166
197
  // remove tmp files
167
198
  if (didSaveToTmpPath && bodyPath) {
168
199
  await fs_1.promises.unlink(bodyPath);
@@ -171,17 +202,21 @@ const prepareWAMessageMedia = async (message, options) => {
171
202
  });
172
203
  const obj = Types_1.WAProto.Message.fromObject({
173
204
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
174
- url: mediaUrl,
205
+ url: handle ? undefined : mediaUrl,
175
206
  directPath,
176
- mediaKey,
177
- fileEncSha256,
207
+ mediaKey: mediaKey,
208
+ fileEncSha256: fileEncSha256,
178
209
  fileSha256,
179
210
  fileLength,
180
- mediaKeyTimestamp: (0, generics_1.unixTimestampSeconds)(),
211
+ mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
181
212
  ...uploadData,
182
213
  media: undefined
183
214
  })
184
215
  });
216
+ if (uploadData.ptv) {
217
+ obj.ptvMessage = obj.videoMessage;
218
+ delete obj.videoMessage;
219
+ }
185
220
  if (cacheableKey) {
186
221
  logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
187
222
  options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
@@ -236,8 +271,8 @@ const generateForwardMessageContent = (message, forceForward) => {
236
271
  };
237
272
  exports.generateForwardMessageContent = generateForwardMessageContent;
238
273
  const generateWAMessageContent = async (message, options) => {
239
- var _a;
240
- var _b;
274
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5;
275
+ var _6, _7;
241
276
  let m = {};
242
277
  if ('text' in message) {
243
278
  const extContent = { text: message.text };
@@ -285,6 +320,15 @@ const generateWAMessageContent = async (message, options) => {
285
320
  }
286
321
  else if ('location' in message) {
287
322
  m.locationMessage = Types_1.WAProto.Message.LocationMessage.fromObject(message.location);
323
+ if ('contextInfo' in message && !!message.contextInfo) {
324
+ m.locationMessage.contextInfo = message.contextInfo;
325
+ }
326
+ }
327
+ else if ('liveLocation' in message) {
328
+ m.liveLocationMessage = Types_1.WAProto.Message.LiveLocationMessage.fromObject(message.liveLocation);
329
+ if ('contextInfo' in message && !!message.contextInfo) {
330
+ m.liveLocationMessage.contextInfo = message.contextInfo;
331
+ }
288
332
  }
289
333
  else if ('react' in message) {
290
334
  if (!message.react.senderTimestampMs) {
@@ -307,6 +351,64 @@ const generateWAMessageContent = async (message, options) => {
307
351
  message.disappearingMessagesInChat;
308
352
  m = (0, exports.prepareDisappearingMessageSettingContent)(exp);
309
353
  }
354
+ else if ('groupInvite' in message) {
355
+ m.groupInviteMessage = {};
356
+ m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
357
+ m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
358
+ m.groupInviteMessage.caption = message.groupInvite.text;
359
+ m.groupInviteMessage.groupJid = message.groupInvite.jid;
360
+ m.groupInviteMessage.groupName = message.groupInvite.subject;
361
+ m.groupInviteMessage.jpegThumbnail = message.groupInvite.thumbnail;
362
+ //TODO: use built-in interface and get disappearing mode info etc.
363
+ //TODO: cache / use store!?
364
+ if (options.getProfilePicUrl) {
365
+ let pfpUrl;
366
+ try {
367
+ pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
368
+ }
369
+ catch (_8) {
370
+ pfpUrl = null;
371
+ }
372
+ if (pfpUrl) {
373
+ const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
374
+ if (resp.status === 200) {
375
+ m.groupInviteMessage.jpegThumbnail = resp.data;
376
+ }
377
+ }
378
+ else {
379
+ m.groupInviteMessage.jpegThumbnail = null;
380
+ }
381
+ }
382
+ }
383
+ else if ('pin' in message) {
384
+ m.pinInChatMessage = {};
385
+ m.messageContextInfo = {};
386
+ m.pinInChatMessage.key = message.pin;
387
+ m.pinInChatMessage.type = message.type;
388
+ m.pinInChatMessage.senderTimestampMs = Date.now();
389
+ m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
390
+ }
391
+ else if ('keep' in message) {
392
+ m.keepInChatMessage = {};
393
+ m.keepInChatMessage.key = message.keep;
394
+ m.keepInChatMessage.keepType = message.type;
395
+ m.keepInChatMessage.timestampMs = Date.now();
396
+ }
397
+ else if ('call' in message) {
398
+ m = {
399
+ scheduledCallCreationMessage: {
400
+ scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
401
+ callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
402
+ title: message.call.title
403
+ }
404
+ };
405
+ }
406
+ else if ('paymentInvite' in message) {
407
+ m.paymentInviteMessage = {
408
+ serviceType: message.paymentInvite.type,
409
+ expiryTimestamp: message.paymentInvite.expiry
410
+ };
411
+ }
310
412
  else if ('buttonReply' in message) {
311
413
  switch (message.type) {
312
414
  case 'template':
@@ -323,10 +425,23 @@ const generateWAMessageContent = async (message, options) => {
323
425
  type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
324
426
  };
325
427
  break;
428
+ case 'interactive':
429
+ m.interactiveResponseMessage = {
430
+ body: {
431
+ text: message.buttonReply.text,
432
+ format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
433
+ },
434
+ nativeFlowResponseMessage: {
435
+ name: message.buttonReply.nativeFlow.name,
436
+ paramsJson: message.buttonReply.nativeFlow.paramsJson,
437
+ version: message.buttonReply.nativeFlow.version
438
+ }
439
+ };
440
+ break;
326
441
  }
327
442
  }
328
443
  else if ('product' in message) {
329
- const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: message.product.productImage }, options);
444
+ const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: (_c = message === null || message === void 0 ? void 0 : message.product) === null || _c === void 0 ? void 0 : _c.productImage }, options);
330
445
  m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
331
446
  ...message,
332
447
  product: {
@@ -334,12 +449,34 @@ const generateWAMessageContent = async (message, options) => {
334
449
  productImage: imageMessage,
335
450
  }
336
451
  });
452
+ if ('contextInfo' in message && !!message.contextInfo) {
453
+ m.productMessage.contextInfo = message.contextInfo;
454
+ }
455
+ if ('mentions' in message && !!message.mentions) {
456
+ m.productMessage.contextInfo = { mentionedJid: message.mentions };
457
+ }
458
+ }
459
+ else if ('order' in message) {
460
+ m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
461
+ orderId: message.order.id,
462
+ thumbnail: message.order.thumbnail,
463
+ itemCount: message.order.itemCount,
464
+ status: message.order.status,
465
+ surface: message.order.surface,
466
+ orderTitle: message.order.title,
467
+ message: message.order.text,
468
+ sellerJid: message.order.seller,
469
+ token: message.order.token,
470
+ totalAmount1000: message.order.amount,
471
+ totalCurrencyCode: message.order.currency
472
+ });
337
473
  }
338
474
  else if ('listReply' in message) {
339
475
  m.listResponseMessage = { ...message.listReply };
340
476
  }
341
477
  else if ('poll' in message) {
342
- (_b = message.poll).selectableCount || (_b.selectableCount = 0);
478
+ (_6 = message.poll).selectableCount || (_6.selectableCount = 0);
479
+ (_7 = message.poll).toAnnouncementGroup || (_7.toAnnouncementGroup = false);
343
480
  if (!Array.isArray(message.poll.values)) {
344
481
  throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
345
482
  }
@@ -351,11 +488,125 @@ const generateWAMessageContent = async (message, options) => {
351
488
  // encKey
352
489
  messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
353
490
  };
354
- m.pollCreationMessage = {
491
+ const pollCreationMessage = {
355
492
  name: message.poll.name,
356
493
  selectableOptionsCount: message.poll.selectableCount,
357
494
  options: message.poll.values.map(optionName => ({ optionName })),
358
495
  };
496
+ if (message.poll.toAnnouncementGroup) {
497
+ // poll v2 is for community announcement groups (single select and multiple)
498
+ m.pollCreationMessageV2 = pollCreationMessage;
499
+ }
500
+ else {
501
+ if (message.poll.selectableCount > 0) {
502
+ //poll v3 is for single select polls
503
+ m.pollCreationMessageV3 = pollCreationMessage;
504
+ }
505
+ else {
506
+ // poll v3 for multiple choice polls
507
+ m.pollCreationMessage = pollCreationMessage;
508
+ }
509
+ }
510
+ if ('contextInfo' in message && !!message.contextInfo) {
511
+ pollCreationMessage.contextInfo = message.contextInfo;
512
+ }
513
+ }
514
+ else if ('pollResult' in message) {
515
+ if (!Array.isArray(message.pollResult.votes)) {
516
+ throw new boom_1.Boom('Invalid poll votes result', { statusCode: 400 });
517
+ }
518
+ m.messageContextInfo = {
519
+ // encKey
520
+ messageSecret: message.pollResult.messageSecret || (0, crypto_1.randomBytes)(32),
521
+ };
522
+ const pollResultSnapshotMessage = {
523
+ name: message.pollResult.name,
524
+ pollVotes: message.pollResult.votes.map((option) => ({
525
+ optionName: option[0],
526
+ optionVoteCount: option[1]
527
+ })),
528
+ };
529
+ if ('contextInfo' in message && !!message.contextInfo) {
530
+ pollResultSnapshotMessage.contextInfo = message.contextInfo;
531
+ }
532
+ if ('mentions' in message && !!message.mentions) {
533
+ pollResultSnapshotMessage.contextInfo = { mentionedJid: message.mentions };
534
+ }
535
+ m.pollResultSnapshotMessage = pollResultSnapshotMessage;
536
+ }
537
+ else if ('event' in message) {
538
+ m.messageContextInfo = {
539
+ messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
540
+ };
541
+ m.eventMessage = { ...message.event };
542
+ }
543
+ else if ('inviteAdmin' in message) {
544
+ m.newsletterAdminInviteMessage = {};
545
+ m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
546
+ m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
547
+ m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
548
+ m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
549
+ m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
550
+ //TODO: use built-in interface and get disappearing mode info etc.
551
+ //TODO: cache / use store!?
552
+ if (options.getProfilePicUrl) {
553
+ let pfpUrl;
554
+ try {
555
+ pfpUrl = await options.getProfilePicUrl(message.inviteAdmin.jid, 'preview');
556
+ }
557
+ catch (_9) {
558
+ pfpUrl = null;
559
+ }
560
+ if (pfpUrl) {
561
+ const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
562
+ if (resp.status === 200) {
563
+ m.newsletterAdminInviteMessage.jpegThumbnail = resp.data;
564
+ }
565
+ }
566
+ else {
567
+ m.newsletterAdminInviteMessage.jpegThumbnail = null;
568
+ }
569
+ }
570
+ }
571
+ else if ('requestPayment' in message) {
572
+ const sticker = ((_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker) ?
573
+ await (0, exports.prepareWAMessageMedia)({ sticker: (_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker, ...options }, options)
574
+ : null;
575
+ let notes = {};
576
+ if ((_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.sticker) {
577
+ notes = {
578
+ stickerMessage: {
579
+ ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
580
+ contextInfo: {
581
+ stanzaId: (_h = (_g = options === null || options === void 0 ? void 0 : options.quoted) === null || _g === void 0 ? void 0 : _g.key) === null || _h === void 0 ? void 0 : _h.id,
582
+ participant: (_k = (_j = options === null || options === void 0 ? void 0 : options.quoted) === null || _j === void 0 ? void 0 : _j.key) === null || _k === void 0 ? void 0 : _k.participant,
583
+ quotedMessage: (_l = options === null || options === void 0 ? void 0 : options.quoted) === null || _l === void 0 ? void 0 : _l.message,
584
+ ...(_m = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _m === void 0 ? void 0 : _m.contextInfo,
585
+ }
586
+ }
587
+ };
588
+ }
589
+ else if (message.requestPayment.note) {
590
+ notes = {
591
+ extendedTextMessage: {
592
+ text: message.requestPayment.note,
593
+ contextInfo: {
594
+ stanzaId: (_p = (_o = options === null || options === void 0 ? void 0 : options.quoted) === null || _o === void 0 ? void 0 : _o.key) === null || _p === void 0 ? void 0 : _p.id,
595
+ participant: (_r = (_q = options === null || options === void 0 ? void 0 : options.quoted) === null || _q === void 0 ? void 0 : _q.key) === null || _r === void 0 ? void 0 : _r.participant,
596
+ quotedMessage: (_s = options === null || options === void 0 ? void 0 : options.quoted) === null || _s === void 0 ? void 0 : _s.message,
597
+ ...(_t = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _t === void 0 ? void 0 : _t.contextInfo,
598
+ }
599
+ }
600
+ };
601
+ }
602
+ m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
603
+ expiryTimestamp: message.requestPayment.expiry,
604
+ amount1000: message.requestPayment.amount,
605
+ currencyCodeIso4217: message.requestPayment.currency,
606
+ requestFrom: message.requestPayment.from,
607
+ noteMessage: { ...notes },
608
+ background: (_u = message.requestPayment.background) !== null && _u !== void 0 ? _u : null,
609
+ });
359
610
  }
360
611
  else if ('sharePhoneNumber' in message) {
361
612
  m.protocolMessage = {
@@ -387,11 +638,21 @@ const generateWAMessageContent = async (message, options) => {
387
638
  if ('footer' in message && !!message.footer) {
388
639
  buttonsMessage.footerText = message.footer;
389
640
  }
641
+ if ('title' in message && !!message.title) {
642
+ buttonsMessage.text = message.title,
643
+ buttonsMessage.headerType = ButtonType.TEXT;
644
+ }
645
+ if ('contextInfo' in message && !!message.contextInfo) {
646
+ buttonsMessage.contextInfo = message.contextInfo;
647
+ }
648
+ if ('mentions' in message && !!message.mentions) {
649
+ buttonsMessage.contextInfo = { mentionedJid: message.mentions };
650
+ }
390
651
  m = { buttonsMessage };
391
652
  }
392
653
  else if ('templateButtons' in message && !!message.templateButtons) {
393
654
  const msg = {
394
- hydratedButtons: message.templateButtons
655
+ hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
395
656
  };
396
657
  if ('text' in message) {
397
658
  msg.hydratedContentText = message.text;
@@ -412,6 +673,203 @@ const generateWAMessageContent = async (message, options) => {
412
673
  }
413
674
  };
414
675
  }
676
+ if ('interactiveButtons' in message && !!message.interactiveButtons) {
677
+ const interactiveMessage = {
678
+ nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
679
+ buttons: message.interactiveButtons,
680
+ })
681
+ };
682
+ if ('text' in message) {
683
+ body: interactiveMessage.body = {
684
+ text: message.text
685
+ };
686
+ header: interactiveMessage.header = {
687
+ title: message.title,
688
+ subtitle: message.subtitle,
689
+ hasMediaAttachment: (_v = message === null || message === void 0 ? void 0 : message.media) !== null && _v !== void 0 ? _v : false,
690
+ };
691
+ }
692
+ else {
693
+ if ('caption' in message) {
694
+ body: interactiveMessage.body = {
695
+ text: message.caption
696
+ };
697
+ header: interactiveMessage.header = {
698
+ title: message.title,
699
+ subtitle: message.subtitle,
700
+ hasMediaAttachment: (_w = message === null || message === void 0 ? void 0 : message.media) !== null && _w !== void 0 ? _w : false,
701
+ };
702
+ Object.assign(interactiveMessage.header, m);
703
+ }
704
+ }
705
+ if ('footer' in message && !!message.footer) {
706
+ footer: interactiveMessage.footer = {
707
+ text: message.footer
708
+ };
709
+ }
710
+ if ('contextInfo' in message && !!message.contextInfo) {
711
+ interactiveMessage.contextInfo = message.contextInfo;
712
+ }
713
+ if ('mentions' in message && !!message.mentions) {
714
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
715
+ }
716
+ m = { interactiveMessage };
717
+ }
718
+ if ('shop' in message && !!message.shop) {
719
+ const interactiveMessage = {
720
+ shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
721
+ surface: message.shop,
722
+ id: message.id
723
+ })
724
+ };
725
+ if ('text' in message) {
726
+ body: interactiveMessage.body = {
727
+ text: message.text
728
+ };
729
+ header: interactiveMessage.header = {
730
+ title: message.title,
731
+ subtitle: message.subtitle,
732
+ hasMediaAttachment: (_x = message === null || message === void 0 ? void 0 : message.media) !== null && _x !== void 0 ? _x : false,
733
+ };
734
+ }
735
+ else {
736
+ if ('caption' in message) {
737
+ body: interactiveMessage.body = {
738
+ text: message.caption
739
+ };
740
+ header: interactiveMessage.header = {
741
+ title: message.title,
742
+ subtitle: message.subtitle,
743
+ hasMediaAttachment: (_y = message === null || message === void 0 ? void 0 : message.media) !== null && _y !== void 0 ? _y : false,
744
+ };
745
+ Object.assign(interactiveMessage.header, m);
746
+ }
747
+ }
748
+ if ('footer' in message && !!message.footer) {
749
+ footer: interactiveMessage.footer = {
750
+ text: message.footer
751
+ };
752
+ }
753
+ if ('contextInfo' in message && !!message.contextInfo) {
754
+ interactiveMessage.contextInfo = message.contextInfo;
755
+ }
756
+ if ('mentions' in message && !!message.mentions) {
757
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
758
+ }
759
+ m = { interactiveMessage };
760
+ }
761
+ if ('collection' in message && !!message.shop) {
762
+ const interactiveMessage = {
763
+ collectionMessage: Types_1.WAProto.Message.InteractiveMessage.CollectionMessage.fromObject({
764
+ bizJid: (_z = message === null || message === void 0 ? void 0 : message.collection) === null || _z === void 0 ? void 0 : _z.bizJid,
765
+ id: (_0 = message === null || message === void 0 ? void 0 : message.collection) === null || _0 === void 0 ? void 0 : _0.id,
766
+ messageVersion: (_1 = message === null || message === void 0 ? void 0 : message.collection) === null || _1 === void 0 ? void 0 : _1.version
767
+ })
768
+ };
769
+ if ('text' in message) {
770
+ body: interactiveMessage.body = {
771
+ text: message.text
772
+ };
773
+ header: interactiveMessage.header = {
774
+ title: message.title,
775
+ subtitle: message.subtitle,
776
+ hasMediaAttachment: (_2 = message === null || message === void 0 ? void 0 : message.media) !== null && _2 !== void 0 ? _2 : false,
777
+ };
778
+ }
779
+ else {
780
+ if ('caption' in message) {
781
+ body: interactiveMessage.body = {
782
+ text: message.caption
783
+ };
784
+ header: interactiveMessage.header = {
785
+ title: message.title,
786
+ subtitle: message.subtitle,
787
+ hasMediaAttachment: (_3 = message === null || message === void 0 ? void 0 : message.media) !== null && _3 !== void 0 ? _3 : false,
788
+ };
789
+ Object.assign(interactiveMessage.header, m);
790
+ }
791
+ }
792
+ if ('footer' in message && !!message.footer) {
793
+ footer: interactiveMessage.footer = {
794
+ text: message.footer
795
+ };
796
+ }
797
+ if ('contextInfo' in message && !!message.contextInfo) {
798
+ interactiveMessage.contextInfo = message.contextInfo;
799
+ }
800
+ if ('mentions' in message && !!message.mentions) {
801
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
802
+ }
803
+ m = { interactiveMessage };
804
+ }
805
+ if ('cards' in message && !!message.cards) {
806
+ const slides = await Promise.all(message.cards.map(async (slide) => {
807
+ const { image, video, product, title, caption, footer, buttons } = slide;
808
+ let header;
809
+ if (product) {
810
+ const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: product.productImage, ...options }, options);
811
+ header = {
812
+ productMesage: Types_1.WAProto.Message.ProductMessage.fromObject({
813
+ product: {
814
+ ...product,
815
+ productImage: imageMessage,
816
+ },
817
+ ...slide
818
+ })
819
+ };
820
+ }
821
+ else if (image) {
822
+ header = await (0, exports.prepareWAMessageMedia)({ image: image, ...options }, options);
823
+ }
824
+ else if (video) {
825
+ header = await (0, exports.prepareWAMessageMedia)({ video: video, ...options }, options);
826
+ }
827
+ const msg = {
828
+ header: {
829
+ title,
830
+ hasMediaAttachment: true,
831
+ ...header
832
+ },
833
+ body: {
834
+ text: caption
835
+ },
836
+ footer: {
837
+ text: footer
838
+ },
839
+ nativeFlowMessage: {
840
+ buttons,
841
+ },
842
+ };
843
+ return msg;
844
+ }));
845
+ const interactiveMessage = {
846
+ carouselMessage: Types_1.WAProto.Message.InteractiveMessage.CarouselMessage.fromObject({
847
+ cards: slides
848
+ })
849
+ };
850
+ if ('text' in message) {
851
+ body: interactiveMessage.body = {
852
+ text: message.text
853
+ };
854
+ header: interactiveMessage.header = {
855
+ title: message.title,
856
+ subtitle: message.subtitle,
857
+ hasMediaAttachment: (_4 = message === null || message === void 0 ? void 0 : message.media) !== null && _4 !== void 0 ? _4 : false,
858
+ };
859
+ }
860
+ if ('footer' in message && !!message.footer) {
861
+ footer: interactiveMessage.footer = {
862
+ text: message.footer
863
+ };
864
+ }
865
+ if ('contextInfo' in message && !!message.contextInfo) {
866
+ interactiveMessage.contextInfo = message.contextInfo;
867
+ }
868
+ if ('mentions' in message && !!message.mentions) {
869
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
870
+ }
871
+ m = { interactiveMessage };
872
+ }
415
873
  if ('sections' in message && !!message.sections) {
416
874
  const listMessage = {
417
875
  sections: message.sections,
@@ -426,7 +884,19 @@ const generateWAMessageContent = async (message, options) => {
426
884
  if ('viewOnce' in message && !!message.viewOnce) {
427
885
  m = { viewOnceMessage: { message: m } };
428
886
  }
429
- if ('mentions' in message && ((_a = message.mentions) === null || _a === void 0 ? void 0 : _a.length)) {
887
+ if ('viewOnceV2' in message && !!message.viewOnceV2) {
888
+ m = { viewOnceMessageV2: { message: m } };
889
+ }
890
+ if ('viewOnceV2Extension' in message && !!message.viewOnceV2Extension) {
891
+ m = { viewOnceMessageV2Extension: { message: m } };
892
+ }
893
+ if ('ephemeral' in message && !!message.ephemeral) {
894
+ m = { ephemeralMessage: { message: m } };
895
+ }
896
+ if ('lottie' in message && !!message.lottie) {
897
+ m = { lottieStickerMessage: { message: m } };
898
+ }
899
+ if ('mentions' in message && ((_5 = message.mentions) === null || _5 === void 0 ? void 0 : _5.length)) {
430
900
  const [messageType] = Object.keys(m);
431
901
  m[messageType].contextInfo = m[messageType] || {};
432
902
  m[messageType].contextInfo.mentionedJid = message.mentions;
@@ -450,15 +920,17 @@ const generateWAMessageContent = async (message, options) => {
450
920
  };
451
921
  exports.generateWAMessageContent = generateWAMessageContent;
452
922
  const generateWAMessageFromContent = (jid, message, options) => {
923
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
453
924
  // set timestamp to now
454
925
  // if not specified
455
926
  if (!options.timestamp) {
456
927
  options.timestamp = new Date();
457
928
  }
458
- const key = Object.keys(message)[0];
929
+ const innerMessage = (0, exports.normalizeMessageContent)(message);
930
+ const key = (0, exports.getContentType)(innerMessage);
459
931
  const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
460
932
  const { quoted, userJid } = options;
461
- if (quoted) {
933
+ if (quoted && !(0, WABinary_1.isJidNewsLetter)(jid)) {
462
934
  const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
463
935
  let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
464
936
  const msgType = (0, exports.getContentType)(quotedMsg);
@@ -468,7 +940,16 @@ const generateWAMessageFromContent = (jid, message, options) => {
468
940
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
469
941
  delete quotedContent.contextInfo;
470
942
  }
471
- const contextInfo = message[key].contextInfo || {};
943
+ let requestPayment;
944
+ if (key === 'requestPaymentMessage') {
945
+ if (((_a = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _a === void 0 ? void 0 : _a.noteMessage) && ((_c = (_b = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _b === void 0 ? void 0 : _b.noteMessage) === null || _c === void 0 ? void 0 : _c.extendedTextMessage)) {
946
+ requestPayment = (_e = (_d = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _d === void 0 ? void 0 : _d.noteMessage) === null || _e === void 0 ? void 0 : _e.extendedTextMessage;
947
+ }
948
+ else if (((_f = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _f === void 0 ? void 0 : _f.noteMessage) && ((_h = (_g = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _g === void 0 ? void 0 : _g.noteMessage) === null || _h === void 0 ? void 0 : _h.stickerMessage)) {
949
+ requestPayment = (_k = (_j = innerMessage.requestPaymentMessage) === null || _j === void 0 ? void 0 : _j.noteMessage) === null || _k === void 0 ? void 0 : _k.stickerMessage;
950
+ }
951
+ }
952
+ const contextInfo = (key === 'requestPaymentMessage' ? requestPayment.contextInfo : innerMessage[key].contextInfo) || {};
472
953
  contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
473
954
  contextInfo.stanzaId = quoted.key.id;
474
955
  contextInfo.quotedMessage = quotedMsg;
@@ -477,7 +958,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
477
958
  if (jid !== quoted.key.remoteJid) {
478
959
  contextInfo.remoteJid = quoted.key.remoteJid;
479
960
  }
480
- message[key].contextInfo = contextInfo;
961
+ innerMessage[key].contextInfo = contextInfo;
481
962
  }
482
963
  if (
483
964
  // if we want to send a disappearing message
@@ -485,9 +966,11 @@ const generateWAMessageFromContent = (jid, message, options) => {
485
966
  // and it's not a protocol message -- delete, toggle disappear message
486
967
  key !== 'protocolMessage' &&
487
968
  // already not converted to disappearing message
488
- key !== 'ephemeralMessage') {
489
- message[key].contextInfo = {
490
- ...(message[key].contextInfo || {}),
969
+ key !== 'ephemeralMessage' &&
970
+ // newsletter not accept disappearing messages
971
+ !(0, WABinary_1.isJidNewsLetter)(jid)) {
972
+ innerMessage[key].contextInfo = {
973
+ ...(innerMessage[key].contextInfo || {}),
491
974
  expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
492
975
  //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
493
976
  };
@@ -512,7 +995,7 @@ const generateWAMessage = async (jid, content, options) => {
512
995
  var _a;
513
996
  // ensure msg ID is with every log
514
997
  options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
515
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, options), options);
998
+ return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsLetter)(jid), ...options }), options);
516
999
  };
517
1000
  exports.generateWAMessage = generateWAMessage;
518
1001
  /** Get the key to access the true type of content */
@@ -698,12 +1181,9 @@ const REUPLOAD_REQUIRED_STATUS = [410, 404];
698
1181
  * Downloads the given message. Throws an error if it's not a media message
699
1182
  */
700
1183
  const downloadMediaMessage = async (message, type, options, ctx) => {
701
- var _a;
702
- try {
703
- const result = await downloadMsg();
704
- return result;
705
- }
706
- catch (error) {
1184
+ const result = await downloadMsg()
1185
+ .catch(async (error) => {
1186
+ var _a;
707
1187
  if (ctx) {
708
1188
  if (axios_1.default.isAxiosError(error)) {
709
1189
  // check if the message requires a reupload
@@ -717,7 +1197,8 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
717
1197
  }
718
1198
  }
719
1199
  throw error;
720
- }
1200
+ });
1201
+ return result;
721
1202
  async function downloadMsg() {
722
1203
  const mContent = (0, exports.extractMessageContent)(message.message);
723
1204
  if (!mContent) {