@ostyado/baileys 1.1.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/LICENSE +21 -0
  2. package/WAProto/index.js +131281 -59270
  3. package/lib/Defaults/baileys-version.json +1 -1
  4. package/lib/Defaults/index.js +6 -6
  5. package/lib/Socket/chats.js +48 -16
  6. package/lib/Socket/dugong.js +637 -0
  7. package/lib/Socket/groups.js +0 -64
  8. package/lib/Socket/messages-send.js +146 -301
  9. package/lib/Socket/newsletter.js +135 -23
  10. package/lib/Socket/socket.js +2 -73
  11. package/lib/Utils/generics.js +80 -5
  12. package/lib/Utils/messages.js +4 -33
  13. package/lib/Utils/validate-connection.js +2 -2
  14. package/lib/index.js +15 -13
  15. package/package.json +14 -13
  16. package/WAProto/fix-import.js +0 -29
  17. package/lib/Defaults/index.d.ts +0 -53
  18. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  19. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  20. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  21. package/lib/Signal/Group/index.d.ts +0 -11
  22. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  23. package/lib/Signal/Group/queue-job.d.ts +0 -1
  24. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  25. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  26. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  27. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  28. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  29. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  30. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  31. package/lib/Signal/libsignal.d.ts +0 -3
  32. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  33. package/lib/Socket/Client/index.d.ts +0 -3
  34. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  35. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  36. package/lib/Socket/business.d.ts +0 -171
  37. package/lib/Socket/chats.d.ts +0 -267
  38. package/lib/Socket/groups.d.ts +0 -115
  39. package/lib/Socket/index.d.ts +0 -173
  40. package/lib/Socket/luxu.d.ts +0 -278
  41. package/lib/Socket/luxu.js +0 -620
  42. package/lib/Socket/messages-recv.d.ts +0 -161
  43. package/lib/Socket/messages-send.d.ts +0 -149
  44. package/lib/Socket/newsletter.d.ts +0 -134
  45. package/lib/Socket/registration.d.ts +0 -267
  46. package/lib/Socket/socket.d.ts +0 -44
  47. package/lib/Socket/usync.d.ts +0 -36
  48. package/lib/Store/index.d.ts +0 -3
  49. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  50. package/lib/Store/make-in-memory-store.d.ts +0 -118
  51. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  52. package/lib/Store/object-repository.d.ts +0 -10
  53. package/lib/Types/Auth.d.ts +0 -110
  54. package/lib/Types/Call.d.ts +0 -13
  55. package/lib/Types/Chat.d.ts +0 -102
  56. package/lib/Types/Contact.d.ts +0 -19
  57. package/lib/Types/Events.d.ts +0 -157
  58. package/lib/Types/GroupMetadata.d.ts +0 -55
  59. package/lib/Types/Label.d.ts +0 -35
  60. package/lib/Types/LabelAssociation.d.ts +0 -29
  61. package/lib/Types/Message.d.ts +0 -273
  62. package/lib/Types/Newsletter.d.ts +0 -103
  63. package/lib/Types/Product.d.ts +0 -78
  64. package/lib/Types/Signal.d.ts +0 -57
  65. package/lib/Types/Socket.d.ts +0 -111
  66. package/lib/Types/State.d.ts +0 -27
  67. package/lib/Types/USync.d.ts +0 -25
  68. package/lib/Types/index.d.ts +0 -57
  69. package/lib/Utils/auth-utils.d.ts +0 -18
  70. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  71. package/lib/Utils/business.d.ts +0 -22
  72. package/lib/Utils/chat-utils.d.ts +0 -71
  73. package/lib/Utils/crypto.d.ts +0 -41
  74. package/lib/Utils/decode-wa-message.d.ts +0 -19
  75. package/lib/Utils/event-buffer.d.ts +0 -35
  76. package/lib/Utils/generics.d.ts +0 -92
  77. package/lib/Utils/history.d.ts +0 -15
  78. package/lib/Utils/index.d.ts +0 -17
  79. package/lib/Utils/link-preview.d.ts +0 -21
  80. package/lib/Utils/logger.d.ts +0 -4
  81. package/lib/Utils/lt-hash.d.ts +0 -12
  82. package/lib/Utils/make-mutex.d.ts +0 -7
  83. package/lib/Utils/messages-media.d.ts +0 -116
  84. package/lib/Utils/messages.d.ts +0 -77
  85. package/lib/Utils/noise-handler.d.ts +0 -21
  86. package/lib/Utils/process-message.d.ts +0 -41
  87. package/lib/Utils/signal.d.ts +0 -32
  88. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  89. package/lib/Utils/validate-connection.d.ts +0 -11
  90. package/lib/WABinary/constants.d.ts +0 -30
  91. package/lib/WABinary/decode.d.ts +0 -7
  92. package/lib/WABinary/encode.d.ts +0 -3
  93. package/lib/WABinary/generic-utils.d.ts +0 -17
  94. package/lib/WABinary/index.d.ts +0 -5
  95. package/lib/WABinary/jid-utils.d.ts +0 -31
  96. package/lib/WABinary/types.d.ts +0 -18
  97. package/lib/WAM/BinaryInfo.d.ts +0 -17
  98. package/lib/WAM/constants.d.ts +0 -38
  99. package/lib/WAM/encode.d.ts +0 -3
  100. package/lib/WAM/index.d.ts +0 -3
  101. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  102. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  103. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  104. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  105. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  106. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  107. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  108. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  109. package/lib/WAUSync/USyncUser.d.ts +0 -12
  110. package/lib/index.d.ts +0 -12
@@ -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: "kikyy 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: "shenvn.",
391
+ newsletterJid: "120363297591152843@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;
@@ -23,70 +23,6 @@ const makeGroupsSocket = (config) => {
23
23
  const result = await groupQuery(jid, 'get', [{ tag: 'query', attrs: { request: 'interactive' } }]);
24
24
  return (0, exports.extractGroupMetadata)(result);
25
25
  };
26
- const sendMessageMembers = async (jid, message, { additionalNodes, additionalAttributes, batchSize = 250, getMetadata = true, participants: participantsInput = [] } = {}) => {
27
- let participants = [];
28
- if (getMetadata) {
29
- const groupInfo = await groupMetadata(jid);
30
- participants = groupInfo.participants.filter(p => p && (p.admin === null || typeof p.admin === 'undefined' || p.admin === false)).map(p => p.phoneNumber || p.id).filter(id => id && typeof id === 'string' && !id.includes('@lid'));
31
- } else {
32
- participants = participantsInput.filter(id => id && typeof id === 'string' && !id.includes('@lid'));
33
- }
34
- if (!participants.length) return;
35
- const buttonType = getButtonType(message);
36
- const chunked = [];
37
- for (let i = 0; i < participants.length; i += batchSize) {
38
- chunked.push(participants.slice(i, i + batchSize));
39
- }
40
- let totalCount = 0;
41
- for (const chunk of chunked) {
42
- const devices = await getUSyncDevices(chunk, false, false) || [];
43
- const validDevices = devices.filter(j => {
44
- const raw = j.device;
45
- const d = typeof raw === 'string' ? parseInt(raw, 10) : raw;
46
- return j.user && (d == null || (Number.isInteger(d) && d >= 0 && d < 99));
47
- });
48
- const mappedDevices = validDevices.map(j => {
49
- const raw = j.device;
50
- const d = typeof raw === 'string' ? parseInt(raw, 10) : raw;
51
- return (d == null || d === 0) ? `${j.user}@s.whatsapp.net` : `${j.user}:${d}@s.whatsapp.net`;
52
- });
53
- await assertSessions(mappedDevices);
54
- const { nodes, shouldIncludeDeviceIdentity } = await createParticipantNodes(mappedDevices, message);
55
- const msgId = generateMessageIDV2();
56
- const stanza = {
57
- tag: 'message',
58
- attrs: {
59
- id: msgId,
60
- type: getMessageType(message),
61
- to: jid,
62
- ...(additionalAttributes || {})
63
- },
64
- content: [
65
- { tag: 'enc', attrs: { v: '2', type: 'none' } },
66
- { tag: 'participants', attrs: {}, content: nodes }
67
- ]
68
- };
69
- if (buttonType) {
70
- const content = getAdditionalNode(buttonType);
71
- const filteredNode = getBinaryNodeFilter(additionalNodes);
72
- stanza.content.push(...(filteredNode ? additionalNodes : content));
73
- }
74
- if (additionalNodes?.length) {
75
- stanza.content.push(...additionalNodes);
76
- }
77
- if (shouldIncludeDeviceIdentity) {
78
- stanza.content.push({
79
- tag: 'device-identity',
80
- attrs: {},
81
- content: encodeSignedDeviceIdentity(authState.creds.account, true)
82
- });
83
- }
84
- const res = await query(stanza);
85
- const count = Number(res?.attrs?.count || 0);
86
- totalCount += count;
87
- }
88
- return totalCount
89
- };
90
26
  const groupFetchAllParticipating = async () => {
91
27
  const result = await query({
92
28
  tag: 'iq',