@blckrose/baileys 1.0.0 → 1.0.5
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.
- package/lib/Defaults/index.js +5 -0
- package/lib/Defaults/phonenumber-mcc.json +223 -0
- package/lib/Socket/community.js +361 -0
- package/lib/Socket/messages-recv.js +11 -0
- package/lib/Socket/newsletter.js +23 -0
- package/lib/Socket/usync.js +76 -0
- package/lib/Store/index.js +4 -0
- package/lib/Store/make-cache-manager-store.js +77 -0
- package/lib/Store/make-in-memory-store.js +400 -0
- package/lib/Store/make-ordered-dictionary.js +78 -0
- package/lib/Store/object-repository.js +23 -0
- package/lib/Types/MexUpdates.js +9 -0
- package/lib/Types/Newsletter.js +10 -0
- package/lib/Types/index.js +1 -0
- package/lib/Utils/audioToBuffer.js +31 -0
- package/lib/Utils/baileys-event-stream.js +54 -0
- package/lib/Utils/browser-utils.js +33 -20
- package/lib/Utils/generics.js +27 -0
- package/lib/Utils/index.js +5 -0
- package/lib/Utils/messages-media.js +44 -1
- package/lib/Utils/messages.js +443 -5
- package/lib/Utils/streamToBuffer.js +17 -0
- package/lib/Utils/use-mongo-file-auth-state.js +77 -0
- package/lib/Utils/use-single-file-auth-state.js +74 -0
- package/lib/WABinary/generic-utils.js +15 -0
- package/lib/WABinary/index.js +1 -0
- package/lib/WABinary/jid-utils.js +2 -0
- package/lib/WAUSync/Protocols/index.js +2 -1
- package/lib/index.js +2 -0
- package/package.json +2 -1
package/lib/Utils/messages.js
CHANGED
|
@@ -365,13 +365,50 @@ export const generateWAMessageContent = async (message, options) => {
|
|
|
365
365
|
else if (hasNonNullishProperty(message, 'pin')) {
|
|
366
366
|
m.pinInChatMessage = {};
|
|
367
367
|
m.messageContextInfo = {};
|
|
368
|
-
m.pinInChatMessage.key = message.pin;
|
|
369
|
-
m.pinInChatMessage.type = message.type;
|
|
370
|
-
m.pinInChatMessage.senderTimestampMs = Date.now();
|
|
371
|
-
m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
|
|
368
|
+
m.pinInChatMessage.key = message.pin.key;
|
|
369
|
+
m.pinInChatMessage.type = message.pin?.type || 1;
|
|
370
|
+
m.pinInChatMessage.senderTimestampMs = message.pin?.time || Date.now();
|
|
371
|
+
m.messageContextInfo.messageAddOnDurationInSecs = message.pin.type === 1 ? message.pin.time || 86400 : 0;
|
|
372
|
+
m.messageContextInfo.messageAddOnExpiryType = proto.MessageContextInfo.MessageAddonExpiryType.STATIC;
|
|
373
|
+
}
|
|
374
|
+
else if (hasNonNullishProperty(message, 'keep')) {
|
|
375
|
+
m.keepInChatMessage = {};
|
|
376
|
+
m.keepInChatMessage.key = message.keep.key;
|
|
377
|
+
m.keepInChatMessage.keepType = message.keep?.type || 1;
|
|
378
|
+
m.keepInChatMessage.timestampMs = message.keep?.time || Date.now();
|
|
379
|
+
}
|
|
380
|
+
else if (hasNonNullishProperty(message, 'call')) {
|
|
381
|
+
m.scheduledCallCreationMessage = {};
|
|
382
|
+
m.scheduledCallCreationMessage.scheduledTimestampMs = message.call?.time || Date.now();
|
|
383
|
+
m.scheduledCallCreationMessage.callType = message.call?.type || 1;
|
|
384
|
+
m.scheduledCallCreationMessage.title = message.call?.name || 'Call Creation';
|
|
385
|
+
m.scheduledCallCreationMessage.contextInfo = {
|
|
386
|
+
...(message.contextInfo || {}),
|
|
387
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
else if (hasNonNullishProperty(message, 'paymentInvite')) {
|
|
391
|
+
m.messageContextInfo = {};
|
|
392
|
+
m.paymentInviteMessage = {};
|
|
393
|
+
m.paymentInviteMessage.expiryTimestamp = message.paymentInvite?.expiry || 0;
|
|
394
|
+
m.paymentInviteMessage.serviceType = message.paymentInvite?.type || 2;
|
|
395
|
+
m.paymentInviteMessage.contextInfo = {
|
|
396
|
+
...(message.contextInfo || {}),
|
|
397
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
398
|
+
};
|
|
372
399
|
}
|
|
373
400
|
else if (hasNonNullishProperty(message, 'buttonReply')) {
|
|
374
401
|
switch (message.type) {
|
|
402
|
+
case 'list':
|
|
403
|
+
m.listResponseMessage = {
|
|
404
|
+
title: message.buttonReply.title,
|
|
405
|
+
description: message.buttonReply.description,
|
|
406
|
+
singleSelectReply: {
|
|
407
|
+
selectedRowId: message.buttonReply.rowId
|
|
408
|
+
},
|
|
409
|
+
listType: proto.Message.ListResponseMessage.ListType.SINGLE_SELECT
|
|
410
|
+
};
|
|
411
|
+
break;
|
|
375
412
|
case 'template':
|
|
376
413
|
m.templateButtonReplyMessage = {
|
|
377
414
|
selectedDisplayText: message.buttonReply.displayText,
|
|
@@ -386,7 +423,81 @@ export const generateWAMessageContent = async (message, options) => {
|
|
|
386
423
|
type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
|
|
387
424
|
};
|
|
388
425
|
break;
|
|
426
|
+
case 'interactive':
|
|
427
|
+
m.interactiveResponseMessage = {
|
|
428
|
+
body: {
|
|
429
|
+
text: message.buttonReply.displayText,
|
|
430
|
+
format: proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
|
|
431
|
+
},
|
|
432
|
+
nativeFlowResponseMessage: {
|
|
433
|
+
name: message.buttonReply.nativeFlows.name,
|
|
434
|
+
paramsJson: message.buttonReply.nativeFlows.paramsJson,
|
|
435
|
+
version: message.buttonReply.nativeFlows.version
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
else if (hasNonNullishProperty(message, 'album')) {
|
|
442
|
+
const imageMessages = message.album.filter(item => 'image' in item);
|
|
443
|
+
const videoMessages = message.album.filter(item => 'video' in item);
|
|
444
|
+
m.albumMessage = WAProto.Message.AlbumMessage.fromObject({
|
|
445
|
+
expectedImageCount: imageMessages.length,
|
|
446
|
+
expectedVideoCount: videoMessages.length
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
else if (hasNonNullishProperty(message, 'order')) {
|
|
450
|
+
m.orderMessage = WAProto.Message.OrderMessage.fromObject(message.order);
|
|
451
|
+
m.orderMessage.contextInfo = {
|
|
452
|
+
...(message.contextInfo || {}),
|
|
453
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
else if (hasNonNullishProperty(message, 'payment')) {
|
|
457
|
+
const requestPaymentMessage = {
|
|
458
|
+
amount: {
|
|
459
|
+
currencyCode: message.payment?.currency || 'IDR',
|
|
460
|
+
offset: message.payment?.offset || 0,
|
|
461
|
+
value: message.payment?.amount || 999999999
|
|
462
|
+
},
|
|
463
|
+
expiryTimestamp: message.payment?.expiry || 0,
|
|
464
|
+
amount1000: (message.payment?.amount || 999999999) * 1000,
|
|
465
|
+
currencyCodeIso4217: message.payment?.currency || 'IDR',
|
|
466
|
+
requestFrom: message.payment?.from || '0@s.whatsapp.net',
|
|
467
|
+
noteMessage: {
|
|
468
|
+
extendedTextMessage: {
|
|
469
|
+
text: message.payment?.note || 'Notes'
|
|
470
|
+
}
|
|
471
|
+
},
|
|
472
|
+
background: {
|
|
473
|
+
placeholderArgb: message.payment?.image?.placeholderArgb || 4278190080,
|
|
474
|
+
textArgb: message.payment?.image?.textArgb || 4294967295,
|
|
475
|
+
subtextArgb: message.payment?.image?.subtextArgb || 4294967295,
|
|
476
|
+
type: 1
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
requestPaymentMessage.noteMessage.extendedTextMessage.contextInfo = {
|
|
480
|
+
...(message.contextInfo || {}),
|
|
481
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
482
|
+
};
|
|
483
|
+
m.requestPaymentMessage = requestPaymentMessage;
|
|
484
|
+
}
|
|
485
|
+
else if (hasNonNullishProperty(message, 'pollResult')) {
|
|
486
|
+
if (!Array.isArray(message.pollResult.values)) {
|
|
487
|
+
throw new Boom('Invalid pollResult values', { statusCode: 400 });
|
|
389
488
|
}
|
|
489
|
+
const pollResultSnapshotMessage = {
|
|
490
|
+
name: message.pollResult.name,
|
|
491
|
+
pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
|
|
492
|
+
optionName,
|
|
493
|
+
optionVoteCount
|
|
494
|
+
}))
|
|
495
|
+
};
|
|
496
|
+
pollResultSnapshotMessage.contextInfo = {
|
|
497
|
+
...(message.contextInfo || {}),
|
|
498
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
499
|
+
};
|
|
500
|
+
m.pollResultSnapshotMessage = pollResultSnapshotMessage;
|
|
390
501
|
}
|
|
391
502
|
else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
|
|
392
503
|
const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
|
|
@@ -482,8 +593,267 @@ export const generateWAMessageContent = async (message, options) => {
|
|
|
482
593
|
else {
|
|
483
594
|
m = await prepareWAMessageMedia(message, options);
|
|
484
595
|
}
|
|
596
|
+
if ('sections' in message && !!message.sections) {
|
|
597
|
+
const listMessage = {
|
|
598
|
+
title: message.title,
|
|
599
|
+
buttonText: message.buttonText,
|
|
600
|
+
footerText: message.footer,
|
|
601
|
+
description: message.text,
|
|
602
|
+
sections: message.sections,
|
|
603
|
+
listType: proto.Message.ListMessage.ListType.SINGLE_SELECT
|
|
604
|
+
};
|
|
605
|
+
listMessage.contextInfo = {
|
|
606
|
+
...(message.contextInfo || {}),
|
|
607
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
608
|
+
};
|
|
609
|
+
m = { listMessage };
|
|
610
|
+
}
|
|
611
|
+
else if ('productList' in message && !!message.productList) {
|
|
612
|
+
const thumbnail = message.thumbnail ? await generateThumbnail(message.thumbnail, 'image') : null;
|
|
613
|
+
const listMessage = {
|
|
614
|
+
title: message.title,
|
|
615
|
+
buttonText: message.buttonText,
|
|
616
|
+
footerText: message.footer,
|
|
617
|
+
description: message.text,
|
|
618
|
+
productListInfo: {
|
|
619
|
+
productSections: message.productList,
|
|
620
|
+
headerImage: {
|
|
621
|
+
productId: message.productList[0].products[0].productId,
|
|
622
|
+
jpegThumbnail: thumbnail?.thumbnail || null
|
|
623
|
+
},
|
|
624
|
+
businessOwnerJid: message.businessOwnerJid
|
|
625
|
+
},
|
|
626
|
+
listType: proto.Message.ListMessage.ListType.PRODUCT_LIST
|
|
627
|
+
};
|
|
628
|
+
listMessage.contextInfo = {
|
|
629
|
+
...(message.contextInfo || {}),
|
|
630
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
631
|
+
};
|
|
632
|
+
m = { listMessage };
|
|
633
|
+
}
|
|
634
|
+
else if ('buttons' in message && !!message.buttons) {
|
|
635
|
+
const buttonsMessage = {
|
|
636
|
+
buttons: message.buttons.map(b => ({ ...b, type: proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
|
|
637
|
+
};
|
|
638
|
+
if ('text' in message) {
|
|
639
|
+
buttonsMessage.contentText = message.text;
|
|
640
|
+
buttonsMessage.headerType = proto.Message.ButtonsMessage.HeaderType.EMPTY;
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
if ('caption' in message) {
|
|
644
|
+
buttonsMessage.contentText = message.caption;
|
|
645
|
+
}
|
|
646
|
+
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
|
647
|
+
buttonsMessage.headerType = proto.Message.ButtonsMessage.HeaderType[type];
|
|
648
|
+
Object.assign(buttonsMessage, m);
|
|
649
|
+
}
|
|
650
|
+
if ('footer' in message && !!message.footer) {
|
|
651
|
+
buttonsMessage.footerText = message.footer;
|
|
652
|
+
}
|
|
653
|
+
if ('title' in message && !!message.title) {
|
|
654
|
+
buttonsMessage.text = message.title;
|
|
655
|
+
buttonsMessage.headerType = proto.Message.ButtonsMessage.HeaderType.TEXT;
|
|
656
|
+
}
|
|
657
|
+
buttonsMessage.contextInfo = {
|
|
658
|
+
...(message.contextInfo || {}),
|
|
659
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
660
|
+
};
|
|
661
|
+
m = { buttonsMessage };
|
|
662
|
+
}
|
|
663
|
+
else if ('templateButtons' in message && !!message.templateButtons) {
|
|
664
|
+
const hydratedTemplate = {
|
|
665
|
+
hydratedButtons: message.templateButtons
|
|
666
|
+
};
|
|
667
|
+
if ('text' in message) {
|
|
668
|
+
hydratedTemplate.hydratedContentText = message.text;
|
|
669
|
+
}
|
|
670
|
+
else {
|
|
671
|
+
if ('caption' in message) {
|
|
672
|
+
hydratedTemplate.hydratedContentText = message.caption;
|
|
673
|
+
}
|
|
674
|
+
Object.assign(hydratedTemplate, m);
|
|
675
|
+
}
|
|
676
|
+
if ('footer' in message && !!message.footer) {
|
|
677
|
+
hydratedTemplate.hydratedFooterText = message.footer;
|
|
678
|
+
}
|
|
679
|
+
hydratedTemplate.contextInfo = {
|
|
680
|
+
...(message.contextInfo || {}),
|
|
681
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
682
|
+
};
|
|
683
|
+
m = { templateMessage: { fourRowTemplate: hydratedTemplate, hydratedTemplate } };
|
|
684
|
+
}
|
|
685
|
+
else if ('interactiveButtons' in message && !!message.interactiveButtons) {
|
|
686
|
+
const interactiveMessage = {
|
|
687
|
+
nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
|
688
|
+
buttons: message.interactiveButtons,
|
|
689
|
+
})
|
|
690
|
+
};
|
|
691
|
+
if ('text' in message) {
|
|
692
|
+
interactiveMessage.body = { text: message.text };
|
|
693
|
+
}
|
|
694
|
+
else if ('caption' in message) {
|
|
695
|
+
interactiveMessage.body = { text: message.caption };
|
|
696
|
+
interactiveMessage.header = {
|
|
697
|
+
title: message.title,
|
|
698
|
+
subtitle: message.subtitle,
|
|
699
|
+
hasMediaAttachment: message?.media ?? false,
|
|
700
|
+
};
|
|
701
|
+
Object.assign(interactiveMessage.header, m);
|
|
702
|
+
}
|
|
703
|
+
if ('footer' in message && !!message.footer) {
|
|
704
|
+
interactiveMessage.footer = { text: message.footer };
|
|
705
|
+
}
|
|
706
|
+
if ('title' in message && !!message.title) {
|
|
707
|
+
interactiveMessage.header = {
|
|
708
|
+
title: message.title,
|
|
709
|
+
subtitle: message.subtitle,
|
|
710
|
+
hasMediaAttachment: message?.media ?? false,
|
|
711
|
+
};
|
|
712
|
+
Object.assign(interactiveMessage.header, m);
|
|
713
|
+
}
|
|
714
|
+
if ('contextInfo' in message && !!message.contextInfo) {
|
|
715
|
+
interactiveMessage.contextInfo = message.contextInfo;
|
|
716
|
+
}
|
|
717
|
+
if ('mentions' in message && !!message.mentions) {
|
|
718
|
+
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
719
|
+
}
|
|
720
|
+
m = { interactiveMessage };
|
|
721
|
+
}
|
|
722
|
+
else if ('shop' in message && !!message.shop) {
|
|
723
|
+
const interactiveMessage = {
|
|
724
|
+
shopStorefrontMessage: proto.Message.InteractiveMessage.ShopMessage.fromObject({
|
|
725
|
+
surface: message.shop,
|
|
726
|
+
id: message.id
|
|
727
|
+
})
|
|
728
|
+
};
|
|
729
|
+
if ('text' in message) {
|
|
730
|
+
interactiveMessage.body = { text: message.text };
|
|
731
|
+
}
|
|
732
|
+
else if ('caption' in message) {
|
|
733
|
+
interactiveMessage.body = { text: message.caption };
|
|
734
|
+
interactiveMessage.header = {
|
|
735
|
+
title: message.title,
|
|
736
|
+
subtitle: message.subtitle,
|
|
737
|
+
hasMediaAttachment: message?.media ?? false,
|
|
738
|
+
};
|
|
739
|
+
Object.assign(interactiveMessage.header, m);
|
|
740
|
+
}
|
|
741
|
+
if ('footer' in message && !!message.footer) {
|
|
742
|
+
interactiveMessage.footer = { text: message.footer };
|
|
743
|
+
}
|
|
744
|
+
if ('title' in message && !!message.title) {
|
|
745
|
+
interactiveMessage.header = {
|
|
746
|
+
title: message.title,
|
|
747
|
+
subtitle: message.subtitle,
|
|
748
|
+
hasMediaAttachment: message?.media ?? false,
|
|
749
|
+
};
|
|
750
|
+
Object.assign(interactiveMessage.header, m);
|
|
751
|
+
}
|
|
752
|
+
if ('contextInfo' in message && !!message.contextInfo) {
|
|
753
|
+
interactiveMessage.contextInfo = message.contextInfo;
|
|
754
|
+
}
|
|
755
|
+
if ('mentions' in message && !!message.mentions) {
|
|
756
|
+
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
|
757
|
+
}
|
|
758
|
+
m = { interactiveMessage };
|
|
759
|
+
}
|
|
760
|
+
else if ('collection' in message && !!message.collection) {
|
|
761
|
+
const interactiveMessage = {
|
|
762
|
+
collectionMessage: {
|
|
763
|
+
bizJid: message.collection.bizJid,
|
|
764
|
+
id: message.collection.id,
|
|
765
|
+
messageVersion: message?.collection?.version
|
|
766
|
+
}
|
|
767
|
+
};
|
|
768
|
+
if ('text' in message) {
|
|
769
|
+
interactiveMessage.body = { text: message.text };
|
|
770
|
+
interactiveMessage.header = {
|
|
771
|
+
title: message.title,
|
|
772
|
+
subtitle: message.subtitle,
|
|
773
|
+
hasMediaAttachment: false
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
else {
|
|
777
|
+
if ('caption' in message) {
|
|
778
|
+
interactiveMessage.body = { text: message.caption };
|
|
779
|
+
interactiveMessage.header = {
|
|
780
|
+
title: message.title,
|
|
781
|
+
subtitle: message.subtitle,
|
|
782
|
+
hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
|
|
783
|
+
...Object.assign(interactiveMessage, m)
|
|
784
|
+
};
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
if ('footer' in message && !!message.footer) {
|
|
788
|
+
interactiveMessage.footer = { text: message.footer };
|
|
789
|
+
}
|
|
790
|
+
interactiveMessage.contextInfo = {
|
|
791
|
+
...(message.contextInfo || {}),
|
|
792
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
793
|
+
};
|
|
794
|
+
m = { interactiveMessage };
|
|
795
|
+
}
|
|
796
|
+
else if ('cards' in message && !!message.cards) {
|
|
797
|
+
const slides = await Promise.all(message.cards.map(async (slide) => {
|
|
798
|
+
const { image, video, product, title, body, footer, buttons } = slide;
|
|
799
|
+
let header;
|
|
800
|
+
if (product) {
|
|
801
|
+
const { imageMessage } = await prepareWAMessageMedia({ image: product.productImage, ...options }, options);
|
|
802
|
+
header = {
|
|
803
|
+
productMessage: {
|
|
804
|
+
product: {
|
|
805
|
+
...product,
|
|
806
|
+
productImage: imageMessage,
|
|
807
|
+
},
|
|
808
|
+
...slide
|
|
809
|
+
}
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
else if (image) {
|
|
813
|
+
header = await prepareWAMessageMedia({ image: image, ...options }, options);
|
|
814
|
+
}
|
|
815
|
+
else if (video) {
|
|
816
|
+
header = await prepareWAMessageMedia({ video: video, ...options }, options);
|
|
817
|
+
}
|
|
818
|
+
return {
|
|
819
|
+
header: {
|
|
820
|
+
title,
|
|
821
|
+
hasMediaAttachment: true,
|
|
822
|
+
...header
|
|
823
|
+
},
|
|
824
|
+
body: { text: body },
|
|
825
|
+
footer: { text: footer },
|
|
826
|
+
nativeFlowMessage: { buttons }
|
|
827
|
+
};
|
|
828
|
+
}));
|
|
829
|
+
const interactiveMessage = {
|
|
830
|
+
carouselMessage: { cards: slides }
|
|
831
|
+
};
|
|
832
|
+
if ('text' in message) {
|
|
833
|
+
interactiveMessage.body = { text: message.text };
|
|
834
|
+
interactiveMessage.header = {
|
|
835
|
+
title: message.title,
|
|
836
|
+
subtitle: message.subtitle,
|
|
837
|
+
hasMediaAttachment: false
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
if ('footer' in message && !!message.footer) {
|
|
841
|
+
interactiveMessage.footer = { text: message.footer };
|
|
842
|
+
}
|
|
843
|
+
interactiveMessage.contextInfo = {
|
|
844
|
+
...(message.contextInfo || {}),
|
|
845
|
+
...(message.mentions ? { mentionedJid: message.mentions } : {})
|
|
846
|
+
};
|
|
847
|
+
m = { interactiveMessage };
|
|
848
|
+
}
|
|
849
|
+
if (hasOptionalProperty(message, 'ephemeral') && !!message.ephemeral) {
|
|
850
|
+
m = { ephemeralMessage: { message: m } };
|
|
851
|
+
}
|
|
485
852
|
if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
|
|
486
|
-
m = {
|
|
853
|
+
m = { viewOnceMessageV2: { message: m } };
|
|
854
|
+
}
|
|
855
|
+
if (hasOptionalProperty(message, 'viewOnceExt') && !!message.viewOnceExt) {
|
|
856
|
+
m = { viewOnceMessageV2Extension: { message: m } };
|
|
487
857
|
}
|
|
488
858
|
if (hasOptionalProperty(message, 'mentions') && message.mentions?.length) {
|
|
489
859
|
const messageType = Object.keys(m)[0];
|
|
@@ -867,4 +1237,72 @@ export const assertMediaContent = (content) => {
|
|
|
867
1237
|
}
|
|
868
1238
|
return mediaContent;
|
|
869
1239
|
};
|
|
1240
|
+
|
|
1241
|
+
export const patchMessageForMdIfRequired = (message) => {
|
|
1242
|
+
if (message?.buttonsMessage ||
|
|
1243
|
+
message?.templateMessage ||
|
|
1244
|
+
message?.listMessage ||
|
|
1245
|
+
message?.interactiveMessage?.nativeFlowMessage
|
|
1246
|
+
) {
|
|
1247
|
+
message = {
|
|
1248
|
+
viewOnceMessageV2Extension: {
|
|
1249
|
+
message: {
|
|
1250
|
+
messageContextInfo: {
|
|
1251
|
+
deviceListMetadataVersion: 2,
|
|
1252
|
+
deviceListMetadata: {}
|
|
1253
|
+
},
|
|
1254
|
+
...message
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
};
|
|
1258
|
+
}
|
|
1259
|
+
return message;
|
|
1260
|
+
};
|
|
1261
|
+
export const prepareAlbumMessageContent = async (jid, albums, options) => {
|
|
1262
|
+
let mediaHandle;
|
|
1263
|
+
let mediaMsg;
|
|
1264
|
+
const message = [];
|
|
1265
|
+
const albumMsg = generateWAMessageFromContent(jid, {
|
|
1266
|
+
albumMessage: {
|
|
1267
|
+
expectedImageCount: albums.filter(item => 'image' in item).length,
|
|
1268
|
+
expectedVideoCount: albums.filter(item => 'video' in item).length
|
|
1269
|
+
}
|
|
1270
|
+
}, options);
|
|
1271
|
+
await options.sock.relayMessage(jid, albumMsg.message, { messageId: albumMsg.key.id });
|
|
1272
|
+
for (const i in albums) {
|
|
1273
|
+
const media = albums[i];
|
|
1274
|
+
if ('image' in media) {
|
|
1275
|
+
mediaMsg = await generateWAMessage(jid, { image: media.image, ...media, ...options }, {
|
|
1276
|
+
userJid: options.userJid,
|
|
1277
|
+
upload: async (encFilePath, opts) => {
|
|
1278
|
+
const up = await options.sock.waUploadToServer(encFilePath, { ...opts, newsletter: isJidNewsletter(jid) });
|
|
1279
|
+
mediaHandle = up.handle;
|
|
1280
|
+
return up;
|
|
1281
|
+
},
|
|
1282
|
+
...options
|
|
1283
|
+
});
|
|
1284
|
+
} else if ('video' in media) {
|
|
1285
|
+
mediaMsg = await generateWAMessage(jid, { video: media.video, ...media, ...options }, {
|
|
1286
|
+
userJid: options.userJid,
|
|
1287
|
+
upload: async (encFilePath, opts) => {
|
|
1288
|
+
const up = await options.sock.waUploadToServer(encFilePath, { ...opts, newsletter: isJidNewsletter(jid) });
|
|
1289
|
+
mediaHandle = up.handle;
|
|
1290
|
+
return up;
|
|
1291
|
+
},
|
|
1292
|
+
...options
|
|
1293
|
+
});
|
|
1294
|
+
}
|
|
1295
|
+
if (mediaMsg) {
|
|
1296
|
+
mediaMsg.message.messageContextInfo = {
|
|
1297
|
+
messageSecret: randomBytes(32),
|
|
1298
|
+
messageAssociation: {
|
|
1299
|
+
associationType: 1,
|
|
1300
|
+
parentMessageKey: albumMsg.key
|
|
1301
|
+
}
|
|
1302
|
+
};
|
|
1303
|
+
}
|
|
1304
|
+
message.push(mediaMsg);
|
|
1305
|
+
}
|
|
1306
|
+
return message;
|
|
1307
|
+
};
|
|
870
1308
|
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Mengonversi Node.js Readable Stream menjadi Buffer.
|
|
5
|
+
* @param {Readable} stream Aliran data yang dapat dibaca.
|
|
6
|
+
* @returns {Promise<Buffer>} Promise yang diselesaikan dengan Buffer berisi semua data dari aliran.
|
|
7
|
+
*/
|
|
8
|
+
async function streamToBuffer(stream) {
|
|
9
|
+
const chunks = [];
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
stream.on('data', chunk => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
|
|
12
|
+
stream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
13
|
+
stream.on('error', reject);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { streamToBuffer };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { proto } from '../../WAProto/index.js';
|
|
2
|
+
import { initAuthCreds } from './auth-utils.js';
|
|
3
|
+
import { BufferJSON } from './generics.js';
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
code from amiruldev readjusted by @irull2nd, don't delete WM!
|
|
7
|
+
*/
|
|
8
|
+
export const useMongoFileAuthState = async (collection) => {
|
|
9
|
+
const writeData = (data, id) => {
|
|
10
|
+
const informationToStore = JSON.parse(
|
|
11
|
+
JSON.stringify(data, BufferJSON.replacer)
|
|
12
|
+
);
|
|
13
|
+
const update = {
|
|
14
|
+
$set: {
|
|
15
|
+
...informationToStore,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return collection.updateOne({ _id: id }, update, { upsert: true });
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const readData = async (id) => {
|
|
23
|
+
try {
|
|
24
|
+
const data = JSON.stringify(await collection.findOne({ _id: id }));
|
|
25
|
+
return JSON.parse(data, BufferJSON.reviver);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.log(err);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const removeData = async (id) => {
|
|
33
|
+
try {
|
|
34
|
+
await collection.deleteOne({ _id: id });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.log('error', err);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const creds = (await readData('creds')) || initAuthCreds();
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
state: {
|
|
45
|
+
creds,
|
|
46
|
+
keys: {
|
|
47
|
+
get: async (type, ids) => {
|
|
48
|
+
const data = {};
|
|
49
|
+
await Promise.all(
|
|
50
|
+
ids.map(async (id) => {
|
|
51
|
+
let value = await readData(`${type}-${id}`);
|
|
52
|
+
if (type === 'app-state-sync-key') {
|
|
53
|
+
value = proto.Message.AppStateSyncKeyData.fromObject(data);
|
|
54
|
+
}
|
|
55
|
+
data[id] = value;
|
|
56
|
+
})
|
|
57
|
+
);
|
|
58
|
+
return data;
|
|
59
|
+
},
|
|
60
|
+
set: async (data) => {
|
|
61
|
+
const tasks = [];
|
|
62
|
+
for (const category of Object.keys(data)) {
|
|
63
|
+
for (const id of Object.keys(data[category])) {
|
|
64
|
+
const value = data[category][id];
|
|
65
|
+
const key = `${category}-${id}`;
|
|
66
|
+
tasks.push(value ? writeData(value, key) : removeData(key));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await Promise.all(tasks);
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
saveCreds: () => {
|
|
74
|
+
return writeData(creds, 'creds');
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createRequire } from 'module';
|
|
2
|
+
import { proto } from '../../WAProto/index.js';
|
|
3
|
+
import { initAuthCreds } from './auth-utils.js';
|
|
4
|
+
import { BufferJSON } from './generics.js';
|
|
5
|
+
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
|
|
8
|
+
// useless key map only there to maintain backwards compatibility
|
|
9
|
+
// do not use in your own systems please
|
|
10
|
+
const KEY_MAP = {
|
|
11
|
+
'pre-key': 'preKeys',
|
|
12
|
+
'session': 'sessions',
|
|
13
|
+
'sender-key': 'senderKeys',
|
|
14
|
+
'app-state-sync-key': 'appStateSyncKeys',
|
|
15
|
+
'app-state-sync-version': 'appStateVersions',
|
|
16
|
+
'sender-key-memory': 'senderKeyMemory'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated use multi file auth state instead please
|
|
21
|
+
* stores the full authentication state in a single JSON file
|
|
22
|
+
*
|
|
23
|
+
* DO NOT USE IN A PROD ENVIRONMENT, only meant to serve as an example
|
|
24
|
+
* */
|
|
25
|
+
export const useSingleFileAuthState = (filename, logger) => {
|
|
26
|
+
const { readFileSync, writeFileSync, existsSync } = require('fs');
|
|
27
|
+
let creds;
|
|
28
|
+
let keys = {};
|
|
29
|
+
// save the authentication state to a file
|
|
30
|
+
const saveState = () => {
|
|
31
|
+
logger && logger.trace('saving auth state');
|
|
32
|
+
writeFileSync(filename,
|
|
33
|
+
// BufferJSON replacer utility saves buffers nicely
|
|
34
|
+
JSON.stringify({ creds, keys }, BufferJSON.replacer, 2));
|
|
35
|
+
};
|
|
36
|
+
if (existsSync(filename)) {
|
|
37
|
+
const result = JSON.parse(readFileSync(filename, { encoding: 'utf-8' }), BufferJSON.reviver);
|
|
38
|
+
creds = result.creds;
|
|
39
|
+
keys = result.keys;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
creds = initAuthCreds();
|
|
43
|
+
keys = {};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
state: {
|
|
47
|
+
creds,
|
|
48
|
+
keys: {
|
|
49
|
+
get: (type, ids) => {
|
|
50
|
+
const key = KEY_MAP[type];
|
|
51
|
+
return ids.reduce((dict, id) => {
|
|
52
|
+
let value = keys[key]?.[id];
|
|
53
|
+
if (value) {
|
|
54
|
+
if (type === 'app-state-sync-key') {
|
|
55
|
+
value = proto.Message.AppStateSyncKeyData.fromObject(value);
|
|
56
|
+
}
|
|
57
|
+
dict[id] = value;
|
|
58
|
+
}
|
|
59
|
+
return dict;
|
|
60
|
+
}, {});
|
|
61
|
+
},
|
|
62
|
+
set: (data) => {
|
|
63
|
+
for (const _key in data) {
|
|
64
|
+
const key = KEY_MAP[_key];
|
|
65
|
+
keys[key] = keys[key] || {};
|
|
66
|
+
Object.assign(keys[key], data[_key]);
|
|
67
|
+
}
|
|
68
|
+
saveState();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
saveState
|
|
73
|
+
};
|
|
74
|
+
};
|
|
@@ -110,4 +110,19 @@ export function binaryNodeToString(node, i = 0) {
|
|
|
110
110
|
const content = children ? `>\n${children}\n${tabs(i)}</${node.tag}>` : '/>';
|
|
111
111
|
return tag + content;
|
|
112
112
|
}
|
|
113
|
+
|
|
114
|
+
export const getBinaryFilteredButtons = (nodeContent) => {
|
|
115
|
+
if (!Array.isArray(nodeContent)) return false;
|
|
116
|
+
return nodeContent.some(a =>
|
|
117
|
+
['native_flow'].includes(a?.content?.[0]?.content?.[0]?.tag) ||
|
|
118
|
+
['interactive', 'buttons', 'list'].includes(a?.content?.[0]?.tag) ||
|
|
119
|
+
['hsm', 'biz'].includes(a?.tag)
|
|
120
|
+
);
|
|
121
|
+
};
|
|
122
|
+
export const getBinaryFilteredBizBot = (nodeContent) => {
|
|
123
|
+
if (!Array.isArray(nodeContent)) return false;
|
|
124
|
+
return nodeContent.some(b =>
|
|
125
|
+
['bot'].includes(b?.tag) && b?.attrs?.biz_bot === '1'
|
|
126
|
+
);
|
|
127
|
+
};
|
|
113
128
|
//# sourceMappingURL=generic-utils.js.map
|
package/lib/WABinary/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './encode.js';
|
|
2
2
|
export * from './decode.js';
|
|
3
3
|
export * from './generic-utils.js';
|
|
4
|
+
export { getBinaryFilteredButtons, getBinaryFilteredBizBot } from './generic-utils.js';
|
|
4
5
|
export * from './jid-utils.js';
|
|
5
6
|
export * from './types.js';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|