@vanzxy/baileys 1.4.0 → 1.4.2

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 (114) hide show
  1. package/cjs/WAProto/index.js +106053 -0
  2. package/cjs/lib/Defaults/index.js +168 -0
  3. package/cjs/lib/Signal/Group/ciphertext-message.js +16 -0
  4. package/cjs/lib/Signal/Group/group-session-builder.js +67 -0
  5. package/cjs/lib/Signal/Group/group_cipher.js +86 -0
  6. package/cjs/lib/Signal/Group/index.js +58 -0
  7. package/cjs/lib/Signal/Group/keyhelper.js +56 -0
  8. package/cjs/lib/Signal/Group/sender-chain-key.js +30 -0
  9. package/cjs/lib/Signal/Group/sender-key-distribution-message.js +67 -0
  10. package/cjs/lib/Signal/Group/sender-key-message.js +70 -0
  11. package/cjs/lib/Signal/Group/sender-key-name.js +52 -0
  12. package/cjs/lib/Signal/Group/sender-key-record.js +45 -0
  13. package/cjs/lib/Signal/Group/sender-key-state.js +88 -0
  14. package/cjs/lib/Signal/Group/sender-message-key.js +30 -0
  15. package/cjs/lib/Signal/libsignal.js +467 -0
  16. package/cjs/lib/Signal/lid-mapping.js +281 -0
  17. package/cjs/lib/Socket/Client/index.js +19 -0
  18. package/cjs/lib/Socket/Client/types.js +15 -0
  19. package/cjs/lib/Socket/Client/websocket.js +61 -0
  20. package/cjs/lib/Socket/business.js +384 -0
  21. package/cjs/lib/Socket/chats.js +1257 -0
  22. package/cjs/lib/Socket/communities.js +442 -0
  23. package/cjs/lib/Socket/dugong.js +753 -0
  24. package/cjs/lib/Socket/groups.js +360 -0
  25. package/cjs/lib/Socket/index.js +19 -0
  26. package/cjs/lib/Socket/messages-recv.js +1790 -0
  27. package/cjs/lib/Socket/messages-send.js +1390 -0
  28. package/cjs/lib/Socket/mex.js +46 -0
  29. package/cjs/lib/Socket/newsletter.js +340 -0
  30. package/cjs/lib/Socket/socket.js +1007 -0
  31. package/cjs/lib/Store/index.js +20 -0
  32. package/cjs/lib/Store/make-in-memory-store.js +438 -0
  33. package/cjs/lib/Store/make-ordered-dictionary.js +82 -0
  34. package/cjs/lib/Store/object-repository.js +28 -0
  35. package/cjs/lib/Types/Auth.js +3 -0
  36. package/cjs/lib/Types/Bussines.js +3 -0
  37. package/cjs/lib/Types/Call.js +3 -0
  38. package/cjs/lib/Types/Chat.js +11 -0
  39. package/cjs/lib/Types/Contact.js +3 -0
  40. package/cjs/lib/Types/Events.js +4 -0
  41. package/cjs/lib/Types/GroupMetadata.js +3 -0
  42. package/cjs/lib/Types/Label.js +26 -0
  43. package/cjs/lib/Types/LabelAssociation.js +8 -0
  44. package/cjs/lib/Types/Message.js +19 -0
  45. package/cjs/lib/Types/Mex.js +40 -0
  46. package/cjs/lib/Types/Product.js +3 -0
  47. package/cjs/lib/Types/RichType.js +24 -0
  48. package/cjs/lib/Types/Signal.js +4 -0
  49. package/cjs/lib/Types/Socket.js +4 -0
  50. package/cjs/lib/Types/State.js +54 -0
  51. package/cjs/lib/Types/USync.js +4 -0
  52. package/cjs/lib/Types/index.js +42 -0
  53. package/cjs/lib/Utils/MessageBuilder.js +2164 -0
  54. package/cjs/lib/Utils/auth-utils.js +312 -0
  55. package/cjs/lib/Utils/browser-utils.js +32 -0
  56. package/cjs/lib/Utils/business.js +245 -0
  57. package/cjs/lib/Utils/chat-utils.js +937 -0
  58. package/cjs/lib/Utils/companion-reg-client-utils.js +45 -0
  59. package/cjs/lib/Utils/crypto.js +196 -0
  60. package/cjs/lib/Utils/decode-wa-message.js +324 -0
  61. package/cjs/lib/Utils/event-buffer.js +643 -0
  62. package/cjs/lib/Utils/generics.js +429 -0
  63. package/cjs/lib/Utils/history.js +151 -0
  64. package/cjs/lib/Utils/identity-change-handler.js +56 -0
  65. package/cjs/lib/Utils/index.js +42 -0
  66. package/cjs/lib/Utils/link-preview.js +122 -0
  67. package/cjs/lib/Utils/logger.js +8 -0
  68. package/cjs/lib/Utils/lt-hash.js +62 -0
  69. package/cjs/lib/Utils/make-mutex.js +38 -0
  70. package/cjs/lib/Utils/message-retry-manager.js +267 -0
  71. package/cjs/lib/Utils/messages-media.js +933 -0
  72. package/cjs/lib/Utils/messages.js +2175 -0
  73. package/cjs/lib/Utils/noise-handler.js +205 -0
  74. package/cjs/lib/Utils/offline-node-processor.js +43 -0
  75. package/cjs/lib/Utils/pre-key-manager.js +113 -0
  76. package/cjs/lib/Utils/process-message.js +772 -0
  77. package/cjs/lib/Utils/reporting-utils.js +263 -0
  78. package/cjs/lib/Utils/rich-message-utils.js +439 -0
  79. package/cjs/lib/Utils/signal.js +214 -0
  80. package/cjs/lib/Utils/stanza-ack.js +41 -0
  81. package/cjs/lib/Utils/sync-action-utils.js +54 -0
  82. package/cjs/lib/Utils/tc-token-utils.js +174 -0
  83. package/cjs/lib/Utils/use-multi-file-auth-state.js +125 -0
  84. package/cjs/lib/Utils/use-single-file-auth-state.js +121 -0
  85. package/cjs/lib/Utils/use-sqlite-auth-state.js +182 -0
  86. package/cjs/lib/Utils/validate-connection.js +210 -0
  87. package/cjs/lib/WABinary/constants.js +1470 -0
  88. package/cjs/lib/WABinary/decode.js +301 -0
  89. package/cjs/lib/WABinary/encode.js +257 -0
  90. package/cjs/lib/WABinary/generic-utils.js +274 -0
  91. package/cjs/lib/WABinary/index.js +22 -0
  92. package/cjs/lib/WABinary/jid-utils.js +114 -0
  93. package/cjs/lib/WABinary/types.js +37 -0
  94. package/cjs/lib/WAM/BinaryInfo.js +14 -0
  95. package/cjs/lib/WAM/constants.js +22856 -0
  96. package/cjs/lib/WAM/encode.js +154 -0
  97. package/cjs/lib/WAM/index.js +20 -0
  98. package/cjs/lib/WAUSync/Protocols/USyncContactProtocol.js +56 -0
  99. package/cjs/lib/WAUSync/Protocols/USyncDeviceProtocol.js +67 -0
  100. package/cjs/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +31 -0
  101. package/cjs/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  102. package/cjs/lib/WAUSync/Protocols/USyncUsernameProtocol.js +29 -0
  103. package/cjs/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +55 -0
  104. package/cjs/lib/WAUSync/Protocols/UsyncLIDProtocol.js +33 -0
  105. package/cjs/lib/WAUSync/Protocols/index.js +24 -0
  106. package/cjs/lib/WAUSync/USyncQuery.js +126 -0
  107. package/cjs/lib/WAUSync/USyncUser.js +35 -0
  108. package/cjs/lib/WAUSync/index.js +20 -0
  109. package/cjs/lib/index.js +34 -0
  110. package/cjs/package.json +1 -0
  111. package/lib/Socket/messages-send.js +4 -3
  112. package/lib/Utils/messages.js +4 -1
  113. package/package.json +16 -5
  114. package/postinstall-banner.js +3 -2
@@ -0,0 +1,753 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Dugong = void 0;
40
+ const crypto_1 = __importDefault(require("crypto"));
41
+ const index_js_1 = require("../../WAProto/index.js");
42
+ const index_js_2 = require("../Utils/index.js");
43
+ const index_js_3 = require("../WABinary/index.js");
44
+ class Dugong {
45
+ constructor(waUploadToServer, relayMessageFn, config, sock) {
46
+ this.relayMessage = relayMessageFn;
47
+ this.waUploadToServer = waUploadToServer;
48
+ this.config = config;
49
+ this.sock = sock;
50
+ }
51
+ detectType(content) {
52
+ if (content.requestPaymentMessage)
53
+ return "PAYMENT";
54
+ if (content.productMessage)
55
+ return "PRODUCT";
56
+ if (content.groupInviteMessage)
57
+ return "GROUP_INVITE"; // Vanz@Fix (bug: field name mismatch — real message content is `groupInviteMessage`, not `groupInvite`, so this never actually matched a received message)
58
+ if (content.interactiveButtons)
59
+ return "INTERACTIVE_BUTTONS";
60
+ if (content.interactiveMessage?.carouselMessage)
61
+ return "CAROUSEL";
62
+ if (content.interactiveMessage)
63
+ return "INTERACTIVE";
64
+ if (content.albumMessage || content.album)
65
+ return "ALBUM";
66
+ if (content.eventMessage)
67
+ return "EVENT";
68
+ if (content.pollResultMessage)
69
+ return "POLL_RESULT";
70
+ if (content.groupStatusMessage)
71
+ return "GROUP_STORY";
72
+ return null;
73
+ }
74
+ async handlePayment(content, quoted) {
75
+ const data = content.requestPaymentMessage;
76
+ let notes = {};
77
+ if (data.sticker?.stickerMessage) {
78
+ notes = {
79
+ stickerMessage: {
80
+ ...data.sticker.stickerMessage,
81
+ contextInfo: {
82
+ stanzaId: quoted?.key?.id,
83
+ participant: quoted?.key?.participant || content.sender,
84
+ quotedMessage: quoted?.message,
85
+ },
86
+ },
87
+ };
88
+ }
89
+ else if (data.note) {
90
+ notes = {
91
+ extendedTextMessage: {
92
+ text: data.note,
93
+ contextInfo: {
94
+ stanzaId: quoted?.key?.id,
95
+ participant: quoted?.key?.participant || content.sender,
96
+ quotedMessage: quoted?.message,
97
+ },
98
+ },
99
+ };
100
+ }
101
+ return {
102
+ requestPaymentMessage: index_js_1.proto.Message.RequestPaymentMessage.fromObject({
103
+ expiryTimestamp: data.expiry || 0,
104
+ amount1000: data.amount || 0,
105
+ currencyCodeIso4217: data.currency || "IDR",
106
+ requestFrom: data.from || "0@s.whatsapp.net",
107
+ noteMessage: notes,
108
+ background: data.background ?? {
109
+ id: "DEFAULT",
110
+ placeholderArgb: 0xfff0f0f0,
111
+ },
112
+ }),
113
+ };
114
+ }
115
+ async handleProduct(content, _jid, _quoted) {
116
+ const { title, description, thumbnail, productId, retailerId, url, body = "", footer = "", buttons = [], priceAmount1000 = null, currencyCode = "IDR", } = content.productMessage;
117
+ let productImage;
118
+ if (Buffer.isBuffer(thumbnail)) {
119
+ const { imageMessage } = await (0, index_js_2.generateWAMessageContent)({ image: thumbnail }, { upload: this.waUploadToServer });
120
+ productImage = imageMessage;
121
+ }
122
+ else if (typeof thumbnail === "object" && thumbnail.url) {
123
+ const { imageMessage } = await (0, index_js_2.generateWAMessageContent)({ image: { url: thumbnail.url } }, { upload: this.waUploadToServer });
124
+ productImage = imageMessage;
125
+ }
126
+ return {
127
+ viewOnceMessage: {
128
+ message: {
129
+ interactiveMessage: {
130
+ body: { text: body },
131
+ footer: { text: footer },
132
+ header: {
133
+ title,
134
+ hasMediaAttachment: true,
135
+ productMessage: {
136
+ product: {
137
+ productImage,
138
+ productId,
139
+ title,
140
+ description,
141
+ currencyCode,
142
+ priceAmount1000,
143
+ retailerId,
144
+ url,
145
+ productImageCount: 1,
146
+ },
147
+ businessOwnerJid: "0@s.whatsapp.net",
148
+ },
149
+ },
150
+ nativeFlowMessage: { buttons },
151
+ },
152
+ },
153
+ },
154
+ };
155
+ }
156
+ async handleInteractive(content, _jid, _quoted) {
157
+ const { title, footer, thumbnail, image, video, document, mimetype, fileName, jpegThumbnail, contextInfo, externalAdReply, buttons = [], nativeFlowMessage, header, } = content.interactiveMessage;
158
+ let media = null;
159
+ let _mediaType = null;
160
+ if (thumbnail) {
161
+ media = await (0, index_js_2.prepareWAMessageMedia)({ image: { url: thumbnail } }, { upload: this.waUploadToServer });
162
+ _mediaType = "image";
163
+ }
164
+ else if (image) {
165
+ const src = typeof image === "object" && image.url
166
+ ? { image: { url: image.url } }
167
+ : { image };
168
+ media = await (0, index_js_2.prepareWAMessageMedia)(src, {
169
+ upload: this.waUploadToServer,
170
+ });
171
+ _mediaType = "image";
172
+ }
173
+ else if (video) {
174
+ const src = typeof video === "object" && video.url
175
+ ? { video: { url: video.url } }
176
+ : { video };
177
+ media = await (0, index_js_2.prepareWAMessageMedia)(src, {
178
+ upload: this.waUploadToServer,
179
+ });
180
+ _mediaType = "video";
181
+ }
182
+ else if (document) {
183
+ const docPayload = { document };
184
+ if (jpegThumbnail) {
185
+ docPayload.jpegThumbnail =
186
+ typeof jpegThumbnail === "object" && jpegThumbnail.url
187
+ ? { url: jpegThumbnail.url }
188
+ : jpegThumbnail;
189
+ }
190
+ media = await (0, index_js_2.prepareWAMessageMedia)(docPayload, {
191
+ upload: this.waUploadToServer,
192
+ });
193
+ if (fileName)
194
+ media.documentMessage.fileName = fileName;
195
+ if (mimetype)
196
+ media.documentMessage.mimetype = mimetype;
197
+ _mediaType = "document";
198
+ }
199
+ const interactiveMessage = {
200
+ body: { text: title || "" },
201
+ footer: { text: footer || "" },
202
+ };
203
+ if (buttons && buttons.length > 0) {
204
+ interactiveMessage.nativeFlowMessage = { buttons };
205
+ if (nativeFlowMessage) {
206
+ interactiveMessage.nativeFlowMessage = {
207
+ ...interactiveMessage.nativeFlowMessage,
208
+ ...nativeFlowMessage,
209
+ };
210
+ }
211
+ }
212
+ else if (nativeFlowMessage) {
213
+ interactiveMessage.nativeFlowMessage = nativeFlowMessage;
214
+ }
215
+ if (media) {
216
+ interactiveMessage.header = {
217
+ title: header || "",
218
+ hasMediaAttachment: true,
219
+ ...media,
220
+ };
221
+ }
222
+ else {
223
+ interactiveMessage.header = {
224
+ title: header || "",
225
+ hasMediaAttachment: false,
226
+ };
227
+ }
228
+ const finalContextInfo = {};
229
+ if (contextInfo) {
230
+ Object.assign(finalContextInfo, {
231
+ mentionedJid: contextInfo.mentionedJid || [],
232
+ forwardingScore: contextInfo.forwardingScore || 0,
233
+ isForwarded: contextInfo.isForwarded || false,
234
+ ...contextInfo,
235
+ });
236
+ }
237
+ if (externalAdReply) {
238
+ finalContextInfo.externalAdReply = {
239
+ title: externalAdReply.title || "",
240
+ body: externalAdReply.body || "",
241
+ mediaType: externalAdReply.mediaType || 1,
242
+ thumbnailUrl: externalAdReply.thumbnailUrl || "",
243
+ mediaUrl: externalAdReply.mediaUrl || "",
244
+ sourceUrl: externalAdReply.sourceUrl || "",
245
+ showAdAttribution: externalAdReply.showAdAttribution || false,
246
+ renderLargerThumbnail: externalAdReply.renderLargerThumbnail || false,
247
+ ...externalAdReply,
248
+ };
249
+ }
250
+ if (Object.keys(finalContextInfo).length > 0) {
251
+ interactiveMessage.contextInfo = finalContextInfo;
252
+ }
253
+ return { interactiveMessage };
254
+ }
255
+ async handleInteractiveButtons(content, _jid, _quoted) {
256
+ const { text, caption, title, subtitle, footer, interactiveButtons, hasMediaAttachment, image, video, document, mimetype, jpegThumbnail, location, product, businessOwnerJid, } = content;
257
+ const bodyText = text || caption || "";
258
+ const buttons = interactiveButtons.map((btn) => ({
259
+ name: btn.name,
260
+ buttonParamsJson: typeof btn.buttonParamsJson === "string"
261
+ ? btn.buttonParamsJson
262
+ : JSON.stringify(btn.buttonParamsJson),
263
+ }));
264
+ let headerContent = {};
265
+ let mediaAttached = typeof hasMediaAttachment === "boolean" ? hasMediaAttachment : false;
266
+ if (image) {
267
+ const src = typeof image === "object" && image.url
268
+ ? { image: { url: image.url } }
269
+ : { image };
270
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(src, {
271
+ upload: this.waUploadToServer,
272
+ });
273
+ headerContent = { ...uploaded };
274
+ mediaAttached =
275
+ typeof hasMediaAttachment === "boolean" ? hasMediaAttachment : true;
276
+ }
277
+ else if (video) {
278
+ const src = typeof video === "object" && video.url
279
+ ? { video: { url: video.url } }
280
+ : { video };
281
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(src, {
282
+ upload: this.waUploadToServer,
283
+ });
284
+ headerContent = { ...uploaded };
285
+ mediaAttached =
286
+ typeof hasMediaAttachment === "boolean" ? hasMediaAttachment : true;
287
+ }
288
+ else if (document) {
289
+ const docPayload = typeof document === "object" && document.url
290
+ ? { document: { url: document.url } }
291
+ : { document };
292
+ if (mimetype)
293
+ docPayload.mimetype = mimetype;
294
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(docPayload, {
295
+ upload: this.waUploadToServer,
296
+ });
297
+ if (jpegThumbnail) {
298
+ uploaded.documentMessage.jpegThumbnail =
299
+ typeof jpegThumbnail === "string"
300
+ ? Buffer.from(jpegThumbnail, "base64")
301
+ : jpegThumbnail;
302
+ }
303
+ headerContent = { ...uploaded };
304
+ mediaAttached =
305
+ typeof hasMediaAttachment === "boolean" ? hasMediaAttachment : true;
306
+ }
307
+ else if (location) {
308
+ headerContent = {
309
+ locationMessage: {
310
+ degreesLatitude: location.degressLatitude || location.degreesLatitude || 0,
311
+ degreesLongitude: location.degressLongitude || location.degreesLongitude || 0,
312
+ name: location.name || "",
313
+ },
314
+ };
315
+ mediaAttached =
316
+ typeof hasMediaAttachment === "boolean" ? hasMediaAttachment : true;
317
+ }
318
+ else if (product) {
319
+ let productImage;
320
+ if (product.productImage) {
321
+ const imgSrc = typeof product.productImage === "object" && product.productImage.url
322
+ ? { image: { url: product.productImage.url } }
323
+ : { image: product.productImage };
324
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(imgSrc, {
325
+ upload: this.waUploadToServer,
326
+ });
327
+ productImage = uploaded.imageMessage;
328
+ }
329
+ headerContent = {
330
+ productMessage: {
331
+ product: {
332
+ productImage,
333
+ productId: product.productId,
334
+ title: product.title,
335
+ description: product.description,
336
+ currencyCode: product.currencyCode || "IDR",
337
+ priceAmount1000: product.priceAmount1000,
338
+ retailerId: product.retailerId,
339
+ url: product.url,
340
+ productImageCount: product.productImageCount || 1,
341
+ },
342
+ businessOwnerJid: businessOwnerJid || "0@s.whatsapp.net",
343
+ },
344
+ };
345
+ mediaAttached =
346
+ typeof hasMediaAttachment === "boolean" ? hasMediaAttachment : true;
347
+ }
348
+ const interactiveMessage = {
349
+ body: { text: bodyText },
350
+ footer: { text: footer || "" },
351
+ header: {
352
+ title: title || "",
353
+ subtitle: subtitle || "",
354
+ hasMediaAttachment: mediaAttached,
355
+ ...headerContent,
356
+ },
357
+ nativeFlowMessage: { buttons },
358
+ };
359
+ return {
360
+ viewOnceMessage: {
361
+ message: {
362
+ messageContextInfo: {
363
+ deviceListMetadata: {},
364
+ deviceListMetadataVersion: 2,
365
+ messageSecret: crypto_1.default.randomBytes(32),
366
+ },
367
+ interactiveMessage,
368
+ },
369
+ },
370
+ };
371
+ }
372
+ async handleCarousel(content, _jid, _quoted) {
373
+ const { interactiveMessage } = content;
374
+ const { body, footer, header, carouselMessage, contextInfo } = interactiveMessage;
375
+ const processedCards = [];
376
+ for (const card of carouselMessage.cards) {
377
+ const cardMsg = {
378
+ body: card.body || { text: "" },
379
+ footer: card.footer || { text: "" },
380
+ header: {
381
+ title: card.header?.title || "",
382
+ hasMediaAttachment: false,
383
+ },
384
+ };
385
+ if (card.nativeFlowMessage) {
386
+ cardMsg.nativeFlowMessage = card.nativeFlowMessage;
387
+ }
388
+ if (card.header?.imageMessage ||
389
+ card.header?.videoMessage ||
390
+ card.header?.documentMessage) {
391
+ let headerContent = {};
392
+ let mediaAttached = true;
393
+ if (card.header.imageMessage) {
394
+ const url = card.header.imageMessage.url || card.header.imageMessage;
395
+ const src = typeof url === "string" ? { image: { url } } : { image: url };
396
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(src, {
397
+ upload: this.waUploadToServer,
398
+ });
399
+ headerContent = { ...uploaded };
400
+ }
401
+ else if (card.header.videoMessage) {
402
+ const url = card.header.videoMessage.url || card.header.videoMessage;
403
+ const src = typeof url === "string" ? { video: { url } } : { video: url };
404
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(src, {
405
+ upload: this.waUploadToServer,
406
+ });
407
+ headerContent = { ...uploaded };
408
+ }
409
+ else if (card.header.documentMessage) {
410
+ const url = card.header.documentMessage.url || card.header.documentMessage;
411
+ const src = typeof url === "string" ? { document: { url } } : { document: url };
412
+ const uploaded = await (0, index_js_2.prepareWAMessageMedia)(src, {
413
+ upload: this.waUploadToServer,
414
+ });
415
+ headerContent = { ...uploaded };
416
+ }
417
+ cardMsg.header = {
418
+ title: card.header?.title || "",
419
+ hasMediaAttachment: mediaAttached,
420
+ ...headerContent,
421
+ };
422
+ }
423
+ processedCards.push(cardMsg);
424
+ }
425
+ const interactiveMsg = {
426
+ body: body || { text: "" },
427
+ footer: footer || { text: "" },
428
+ header: header || { title: "", hasMediaAttachment: false },
429
+ carouselMessage: {
430
+ cards: processedCards,
431
+ messageVersion: carouselMessage.messageVersion || 1,
432
+ carouselCardType: carouselMessage.carouselCardType ?? 1,
433
+ },
434
+ };
435
+ if (contextInfo) {
436
+ interactiveMsg.contextInfo = contextInfo;
437
+ }
438
+ return {
439
+ viewOnceMessage: {
440
+ message: {
441
+ messageContextInfo: {
442
+ deviceListMetadata: {},
443
+ deviceListMetadataVersion: 2,
444
+ messageSecret: crypto_1.default.randomBytes(32),
445
+ },
446
+ interactiveMessage: interactiveMsg,
447
+ },
448
+ },
449
+ };
450
+ }
451
+ async handleAlbum(content, jid, quoted) {
452
+ const array = content.albumMessage || content.album;
453
+ const ctxInfo = content.contextInfo || {};
454
+ const album = await (0, index_js_2.generateWAMessageFromContent)(jid, {
455
+ messageContextInfo: {
456
+ messageSecret: crypto_1.default.randomBytes(32),
457
+ },
458
+ albumMessage: {
459
+ expectedImageCount: array.filter((a) => "image" in a).length,
460
+ expectedVideoCount: array.filter((a) => "video" in a).length,
461
+ },
462
+ }, {
463
+ userJid: (0, index_js_3.jidNormalizedUser)(this.sock.authState?.creds?.me?.id || ""),
464
+ quoted,
465
+ upload: this.waUploadToServer,
466
+ });
467
+ await this.relayMessage(jid, album.message, {
468
+ messageId: album.key.id,
469
+ });
470
+ for (let item of array) {
471
+ if (ctxInfo && Object.keys(ctxInfo).length > 0 && !item.contextInfo) {
472
+ item = { ...item, contextInfo: ctxInfo };
473
+ }
474
+ try { // Vanz@Fix: per-item try-catch so one failed upload doesn't abort the whole album
475
+ const img = await (0, index_js_2.generateWAMessage)(jid, item, {
476
+ upload: this.waUploadToServer,
477
+ userJid: (0, index_js_3.jidNormalizedUser)(this.sock.authState?.creds?.me?.id || ""),
478
+ });
479
+ img.message.messageContextInfo = {
480
+ messageSecret: crypto_1.default.randomBytes(32),
481
+ messageAssociation: {
482
+ associationType: 1,
483
+ parentMessageKey: album.key,
484
+ },
485
+ };
486
+ await this.relayMessage(jid, img.message, {
487
+ messageId: img.key.id,
488
+ });
489
+ }
490
+ catch (err) {
491
+ this.config.logger?.error(`handleAlbum: failed to send item — ${err}`);
492
+ }
493
+ await (0, index_js_2.delay)(300); // Vanz@Fix: prevent WA rate-limit / out-of-order delivery
494
+ }
495
+ return album;
496
+ }
497
+ async handleEvent(content, jid, quoted) {
498
+ const eventData = content.eventMessage;
499
+ const msg = await (0, index_js_2.generateWAMessageFromContent)(jid, {
500
+ viewOnceMessage: {
501
+ message: {
502
+ messageContextInfo: {
503
+ deviceListMetadata: {},
504
+ deviceListMetadataVersion: 2,
505
+ messageSecret: crypto_1.default.randomBytes(32),
506
+ },
507
+ eventMessage: {
508
+ isCanceled: eventData.isCanceled || false,
509
+ name: eventData.name,
510
+ description: eventData.description,
511
+ location: eventData.location || {
512
+ degreesLatitude: 0,
513
+ degreesLongitude: 0,
514
+ name: "Location",
515
+ },
516
+ joinLink: eventData.joinLink || "",
517
+ startTime: typeof eventData.startTime === "string"
518
+ ? parseInt(eventData.startTime)
519
+ : eventData.startTime || Date.now(),
520
+ endTime: typeof eventData.endTime === "string"
521
+ ? parseInt(eventData.endTime)
522
+ : eventData.endTime || Date.now() + 3600000,
523
+ extraGuestsAllowed: eventData.extraGuestsAllowed !== false,
524
+ },
525
+ },
526
+ },
527
+ }, {
528
+ quoted,
529
+ userJid: (0, index_js_3.jidNormalizedUser)(this.sock.authState?.creds?.me?.id || ""),
530
+ });
531
+ await this.relayMessage(jid, msg.message, {
532
+ messageId: msg.key.id,
533
+ });
534
+ return msg;
535
+ }
536
+ async handlePollResult(content, jid, quoted) {
537
+ const pollData = content.pollResultMessage;
538
+ const msg = await (0, index_js_2.generateWAMessageFromContent)(jid, {
539
+ pollResultSnapshotMessage: {
540
+ name: pollData.name,
541
+ pollVotes: pollData.pollVotes.map((vote) => ({
542
+ optionName: vote.optionName,
543
+ optionVoteCount: typeof vote.optionVoteCount === "number"
544
+ ? vote.optionVoteCount.toString()
545
+ : vote.optionVoteCount,
546
+ })),
547
+ },
548
+ }, {
549
+ quoted,
550
+ userJid: (0, index_js_3.jidNormalizedUser)(this.sock.authState?.creds?.me?.id || ""),
551
+ });
552
+ await this.relayMessage(jid, msg.message, {
553
+ messageId: msg.key.id,
554
+ });
555
+ return msg;
556
+ }
557
+ async handleGroupInvite(content, jid, quoted) {
558
+ const inviteData = content.groupInviteMessage;
559
+ const msg = await (0, index_js_2.generateWAMessageFromContent)(jid, {
560
+ groupInviteMessage: {
561
+ groupJid: inviteData.groupJid,
562
+ inviteCode: inviteData.inviteCode,
563
+ inviteExpiration: inviteData.inviteExpiration ?? 0,
564
+ groupName: inviteData.groupName,
565
+ jpegThumbnail: inviteData.jpegThumbnail,
566
+ caption: inviteData.caption,
567
+ groupType: inviteData.groupType,
568
+ },
569
+ }, {
570
+ quoted,
571
+ userJid: (0, index_js_3.jidNormalizedUser)(this.sock.authState?.creds?.me?.id || ""),
572
+ });
573
+ await this.relayMessage(jid, msg.message, {
574
+ messageId: msg.key.id,
575
+ });
576
+ return msg;
577
+ }
578
+ async handleGroupStory(content, jid, _quoted, options = {}) {
579
+ const storyData = content.groupStatusMessage;
580
+ let waMsgContent;
581
+ if (storyData.message) {
582
+ waMsgContent = storyData;
583
+ }
584
+ else {
585
+ waMsgContent = await (0, index_js_2.generateWAMessageContent)(storyData, {
586
+ upload: this.waUploadToServer,
587
+ });
588
+ }
589
+ const innerMsg = waMsgContent.message || waMsgContent;
590
+ const msgKey = Object.keys(innerMsg).find((k) => innerMsg[k] && typeof innerMsg[k] === "object");
591
+ if (msgKey) {
592
+ innerMsg[msgKey].contextInfo = innerMsg[msgKey].contextInfo || {};
593
+ innerMsg[msgKey].contextInfo.isGroupStatus = true;
594
+ if (!innerMsg[msgKey].contextInfo.statusSourceType) {
595
+ if (innerMsg.imageMessage)
596
+ innerMsg[msgKey].contextInfo.statusSourceType = 0;
597
+ else if (innerMsg.videoMessage)
598
+ innerMsg[msgKey].contextInfo.statusSourceType = 1;
599
+ else if (innerMsg.audioMessage)
600
+ innerMsg[msgKey].contextInfo.statusSourceType = 3;
601
+ else if (innerMsg.extendedTextMessage)
602
+ innerMsg[msgKey].contextInfo.statusSourceType = 4;
603
+ }
604
+ }
605
+ const finalMsg = {
606
+ groupStatusMessageV2: {
607
+ message: innerMsg,
608
+ },
609
+ };
610
+ return await this.relayMessage(jid, finalMsg, {
611
+ messageId: (0, index_js_2.generateMessageID)(),
612
+ });
613
+ }
614
+ async sendStatusWhatsApp(content, jids = []) {
615
+ const userJid = (0, index_js_3.jidNormalizedUser)(this.sock.authState.creds.me.id);
616
+ const allUsers = new Set();
617
+ allUsers.add(userJid);
618
+ for (const id of jids) {
619
+ if ((0, index_js_3.isJidGroup)(id)) {
620
+ try {
621
+ const metadata = await this.sock.groupMetadata(id);
622
+ metadata.participants.forEach((p) => allUsers.add((0, index_js_3.jidNormalizedUser)(p.id)));
623
+ }
624
+ catch (error) {
625
+ this.config.logger.error(`Error getting metadata for group ${id}: ${error}`);
626
+ }
627
+ }
628
+ else if ((0, index_js_3.isPnUser)(id)) {
629
+ allUsers.add((0, index_js_3.jidNormalizedUser)(id));
630
+ }
631
+ }
632
+ const uniqueUsers = Array.from(allUsers);
633
+ const getRandomHexColor = () => "#" +
634
+ Math.floor(Math.random() * 16777215)
635
+ .toString(16)
636
+ .padStart(6, "0");
637
+ const isMedia = content.image || content.video || content.audio;
638
+ const isAudio = !!content.audio;
639
+ const messageContent = { ...content };
640
+ if (isMedia && !isAudio) {
641
+ if (messageContent.text) {
642
+ messageContent.caption = messageContent.text;
643
+ delete messageContent.text;
644
+ }
645
+ delete messageContent.ptt;
646
+ delete messageContent.font;
647
+ delete messageContent.backgroundColor;
648
+ delete messageContent.textColor;
649
+ }
650
+ if (isAudio) {
651
+ delete messageContent.text;
652
+ delete messageContent.caption;
653
+ delete messageContent.font;
654
+ delete messageContent.textColor;
655
+ }
656
+ const font = !isMedia
657
+ ? content.font || Math.floor(Math.random() * 9)
658
+ : undefined;
659
+ const textColor = !isMedia
660
+ ? content.textColor || getRandomHexColor()
661
+ : undefined;
662
+ const backgroundColor = !isMedia || isAudio
663
+ ? content.backgroundColor || getRandomHexColor()
664
+ : undefined;
665
+ const ptt = isAudio
666
+ ? typeof content.ptt === "boolean"
667
+ ? content.ptt
668
+ : true
669
+ : undefined;
670
+ const { getUrlInfo } = await Promise.resolve().then(() => __importStar(require("../Utils/link-preview.js")));
671
+ const msg = await (0, index_js_2.generateWAMessage)(index_js_3.STORIES_JID, messageContent, {
672
+ logger: this.config.logger,
673
+ userJid,
674
+ getUrlInfo: (text) => getUrlInfo(text, {
675
+ thumbnailWidth: this.config.linkPreviewImageThumbnailWidth,
676
+ fetchOpts: { timeout: 3000, ...(this.config.options || {}) },
677
+ logger: this.config.logger,
678
+ uploadImage: this.config.generateHighQualityLinkPreview
679
+ ? this.waUploadToServer
680
+ : undefined,
681
+ }),
682
+ upload: this.waUploadToServer,
683
+ mediaCache: this.config.mediaCache,
684
+ options: this.config.options,
685
+ font,
686
+ textColor,
687
+ backgroundColor,
688
+ ptt,
689
+ });
690
+ await this.relayMessage(index_js_3.STORIES_JID, msg.message, {
691
+ messageId: msg.key.id,
692
+ statusJidList: uniqueUsers,
693
+ additionalNodes: [
694
+ {
695
+ tag: "meta",
696
+ attrs: {},
697
+ content: [
698
+ {
699
+ tag: "mentioned_users",
700
+ attrs: {},
701
+ content: jids.map((jid) => ({
702
+ tag: "to",
703
+ attrs: { jid: (0, index_js_3.jidNormalizedUser)(jid) },
704
+ })),
705
+ },
706
+ ],
707
+ },
708
+ ],
709
+ });
710
+ for (const id of jids) {
711
+ try {
712
+ const normalizedId = (0, index_js_3.jidNormalizedUser)(id);
713
+ const isPrivate = (0, index_js_3.isPnUser)(normalizedId);
714
+ const type = isPrivate
715
+ ? "statusMentionMessage"
716
+ : "groupStatusMentionMessage";
717
+ const protocolMessage = {
718
+ [type]: {
719
+ message: {
720
+ protocolMessage: {
721
+ key: msg.key,
722
+ type: 25,
723
+ },
724
+ },
725
+ },
726
+ messageContextInfo: {
727
+ messageSecret: crypto_1.default.randomBytes(32),
728
+ },
729
+ };
730
+ const statusMsg = await (0, index_js_2.generateWAMessageFromContent)(normalizedId, protocolMessage, {
731
+ userJid: (0, index_js_3.jidNormalizedUser)(this.sock.authState?.creds?.me?.id || ""),
732
+ });
733
+ await this.relayMessage(normalizedId, statusMsg.message, {
734
+ additionalNodes: [
735
+ {
736
+ tag: "meta",
737
+ attrs: isPrivate
738
+ ? { is_status_mention: "true" }
739
+ : { is_group_status_mention: "true" },
740
+ },
741
+ ],
742
+ });
743
+ await (0, index_js_2.delay)(2000);
744
+ }
745
+ catch (error) {
746
+ this.config.logger.error(`Error sending to ${id}: ${error}`);
747
+ }
748
+ }
749
+ return msg;
750
+ }
751
+ }
752
+ exports.Dugong = Dugong;
753
+ //# sourceMappingURL=dugong.js.map