@hdriel/whatsapp-socket 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +343 -0
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -12
package/README.md
CHANGED
|
@@ -418,6 +418,349 @@ app.post('/api/upload-image', uploadImage.single('image'), async (req, res) => {
|
|
|
418
418
|
});
|
|
419
419
|
```
|
|
420
420
|
|
|
421
|
+
# Group Management
|
|
422
|
+
|
|
423
|
+
The library provides comprehensive group management capabilities through the `WhatsappSocketGroup` class.
|
|
424
|
+
|
|
425
|
+
## Quick Start with Groups
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
import { WhatsappSocketGroup } from '@hdriel/whatsapp-socket';
|
|
429
|
+
|
|
430
|
+
const client = new WhatsappSocketGroup({
|
|
431
|
+
fileAuthStateDirectoryPath: './authState/my-profile',
|
|
432
|
+
printQRInTerminal: true,
|
|
433
|
+
debug: true
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
await client.startConnection();
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## Group Operations
|
|
440
|
+
|
|
441
|
+
### Creating Groups
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
// Create a new group
|
|
445
|
+
const group = await client.createGroup({
|
|
446
|
+
name: 'My Test Group',
|
|
447
|
+
description: 'This is a test group', // optional
|
|
448
|
+
participants: ['972501234567', '972507654321'] // optional, can be empty
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
console.log('Group ID:', group.id);
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Group Information
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
// Update group name
|
|
458
|
+
await client.updateGroupName(groupId, 'New Group Name');
|
|
459
|
+
|
|
460
|
+
// Update group description
|
|
461
|
+
await client.updateGroupDescription(groupId, 'New description text');
|
|
462
|
+
|
|
463
|
+
// Get group metadata
|
|
464
|
+
const metadata = await client.getGroupMetadata(groupId);
|
|
465
|
+
console.log('Group Name:', metadata.subject);
|
|
466
|
+
console.log('Participants:', metadata.participants.length);
|
|
467
|
+
|
|
468
|
+
// Get all groups
|
|
469
|
+
const allGroups = await client.getAllGroups();
|
|
470
|
+
console.log('Total groups:', allGroups.length);
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Group Settings
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
// Lock group (only admins can send messages)
|
|
477
|
+
await client.updateGroupSettings(groupId, 'announcement');
|
|
478
|
+
|
|
479
|
+
// Unlock group (everyone can send messages)
|
|
480
|
+
await client.updateGroupSettings(groupId, 'not_announcement');
|
|
481
|
+
|
|
482
|
+
// Lock group info (only admins can edit)
|
|
483
|
+
await client.updateGroupSettings(groupId, 'locked');
|
|
484
|
+
|
|
485
|
+
// Unlock group info (everyone can edit)
|
|
486
|
+
await client.updateGroupSettings(groupId, 'unlocked');
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### Participant Management
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
// Add participants
|
|
493
|
+
await client.addParticipants(groupId, '972501234567');
|
|
494
|
+
// Or add multiple
|
|
495
|
+
await client.addParticipants(groupId, ['972501234567', '972507654321']);
|
|
496
|
+
|
|
497
|
+
// Remove participants
|
|
498
|
+
await client.removeParticipants(groupId, '972501234567');
|
|
499
|
+
|
|
500
|
+
// Promote to admin
|
|
501
|
+
await client.promoteToAdmin(groupId, '972501234567');
|
|
502
|
+
|
|
503
|
+
// Demote from admin
|
|
504
|
+
await client.demoteFromAdmin(groupId, '972501234567');
|
|
505
|
+
|
|
506
|
+
// Leave group
|
|
507
|
+
await client.leaveGroup(groupId);
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### Invite Management
|
|
511
|
+
|
|
512
|
+
```typescript
|
|
513
|
+
// Get group invite code
|
|
514
|
+
const inviteCode = await client.getGroupInviteCode(groupId);
|
|
515
|
+
const inviteLink = await client.getGroupInviteCode(groupId, true);
|
|
516
|
+
console.log('Invite link:', inviteLink); // `https://chat.whatsapp.com/${inviteCode}`;
|
|
517
|
+
|
|
518
|
+
// Get group info from invite code
|
|
519
|
+
const groupInfo = await client.getGroupInfoFromInvite(inviteCode);
|
|
520
|
+
console.log('Group name:', groupInfo.subject);
|
|
521
|
+
|
|
522
|
+
// Revoke invite code (generates new one)
|
|
523
|
+
const newInviteCode = await client.revokeGroupInviteCode(groupId);
|
|
524
|
+
console.log('New invite code:', newInviteCode);
|
|
525
|
+
|
|
526
|
+
// Join group via invite code
|
|
527
|
+
const joinedGroupId = await client.joinGroupViaInvite(inviteCode);
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Profile Picture Management
|
|
531
|
+
|
|
532
|
+
**Note:** Requires `sharp` library to be installed:
|
|
533
|
+
```bash
|
|
534
|
+
npm install sharp
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
import fs from 'fs';
|
|
539
|
+
|
|
540
|
+
// Update group profile picture
|
|
541
|
+
const imageBuffer = fs.readFileSync('./group-photo.jpg');
|
|
542
|
+
await client.updateGroupProfilePicture(groupId, imageBuffer);
|
|
543
|
+
|
|
544
|
+
// Get profile picture URL (preview/low-res)
|
|
545
|
+
const previewUrl = await client.getGroupProfilePicture(groupId, false);
|
|
546
|
+
|
|
547
|
+
// Get profile picture URL (high-res)
|
|
548
|
+
const highResUrl = await client.getGroupProfilePicture(groupId, true);
|
|
549
|
+
|
|
550
|
+
// Remove profile picture
|
|
551
|
+
await client.removeGroupProfilePicture(groupId);
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Sending Messages to Groups
|
|
555
|
+
|
|
556
|
+
All messaging methods work the same for groups and individual chats:
|
|
557
|
+
|
|
558
|
+
```typescript
|
|
559
|
+
// Send text message to group
|
|
560
|
+
await client.sendTextMessage(groupId, 'Hello everyone!');
|
|
561
|
+
|
|
562
|
+
// Send message with mention all
|
|
563
|
+
await client.sendMentionAll(groupId, '📢 Important announcement!');
|
|
564
|
+
|
|
565
|
+
// Send buttons message
|
|
566
|
+
await client.sendButtonsMessage(groupId, {
|
|
567
|
+
title: 'Group Poll',
|
|
568
|
+
subtitle: 'Vote for next event',
|
|
569
|
+
buttons: [
|
|
570
|
+
{ label: 'Visit Website', url: 'https://example.com' },
|
|
571
|
+
{ label: 'Copy Code', copy: 'EVENT2024' }
|
|
572
|
+
]
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
// Send reply buttons
|
|
576
|
+
await client.sendReplyButtonsMessage(groupId, {
|
|
577
|
+
title: 'Quick poll',
|
|
578
|
+
subtitle: 'Choose your answer',
|
|
579
|
+
buttons: ['Option 1', 'Option 2', 'Option 3']
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
// Send media
|
|
583
|
+
const imageBuffer = fs.readFileSync('./photo.jpg');
|
|
584
|
+
await client.sendImageMessage(groupId, imageBuffer, {
|
|
585
|
+
caption: 'Group photo!'
|
|
586
|
+
});
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
## Complete Group Example
|
|
590
|
+
|
|
591
|
+
```typescript
|
|
592
|
+
import { WhatsappSocketGroup } from '@hdriel/whatsapp-socket';
|
|
593
|
+
import fs from 'fs';
|
|
594
|
+
|
|
595
|
+
async function groupExample() {
|
|
596
|
+
const client = new WhatsappSocketGroup({
|
|
597
|
+
fileAuthStateDirectoryPath: './authState',
|
|
598
|
+
printQRInTerminal: true,
|
|
599
|
+
debug: true
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
await client.startConnection();
|
|
603
|
+
|
|
604
|
+
// Create group
|
|
605
|
+
const group = await client.createGroup({
|
|
606
|
+
name: '🎉 My Awesome Group',
|
|
607
|
+
description: 'Welcome to our group!',
|
|
608
|
+
participants: ['0501234567']
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
const groupId = group.id;
|
|
612
|
+
|
|
613
|
+
// Get invite link
|
|
614
|
+
const inviteCode = await client.getGroupInviteCode(groupId);
|
|
615
|
+
const inviteLink = await client.getGroupInviteCode(groupId, true);
|
|
616
|
+
// https://chat.whatsapp.com/${inviteCode}
|
|
617
|
+
|
|
618
|
+
// Send welcome message with invite link
|
|
619
|
+
await client.sendTextMessage(
|
|
620
|
+
groupId,
|
|
621
|
+
`Welcome! 🎉\n\nInvite link: ${inviteLink}`
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
// Set group profile picture
|
|
625
|
+
const imageBuffer = fs.readFileSync('./group-icon.jpg');
|
|
626
|
+
await client.updateGroupProfilePicture(groupId, imageBuffer);
|
|
627
|
+
|
|
628
|
+
// Lock group (only admins can send)
|
|
629
|
+
await client.updateGroupSettings(groupId, 'announcement');
|
|
630
|
+
|
|
631
|
+
// Add more participants
|
|
632
|
+
await client.addParticipants(groupId, ['0507654321', '972509876543']);
|
|
633
|
+
|
|
634
|
+
// Promote someone to admin
|
|
635
|
+
await client.promoteToAdmin(groupId, '0507654321');
|
|
636
|
+
|
|
637
|
+
// Send announcement
|
|
638
|
+
await client.sendMentionAll(
|
|
639
|
+
groupId,
|
|
640
|
+
'📢 Group is now set up! Only admins can send messages.'
|
|
641
|
+
);
|
|
642
|
+
|
|
643
|
+
// And all the function of the private message also here, sendButtons and so on..
|
|
644
|
+
|
|
645
|
+
// Get group info
|
|
646
|
+
const metadata = await client.getGroupMetadata(groupId);
|
|
647
|
+
console.log(`Group "${metadata.subject}" has ${metadata.participants.length} members`);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
groupExample().catch(console.error);
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
## Group ID Format
|
|
654
|
+
|
|
655
|
+
- Individual chats: `{phone}@s.whatsapp.net`
|
|
656
|
+
- **Group chats: `{group_id}@g.us`**
|
|
657
|
+
|
|
658
|
+
The library automatically formats group IDs, so you can use either:
|
|
659
|
+
```typescript
|
|
660
|
+
await client.updateGroupName('123456789@g.us', 'New Name');
|
|
661
|
+
// or
|
|
662
|
+
await client.updateGroupName('123456789', 'New Name'); // automatically adds @g.us
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
## Helper Methods
|
|
666
|
+
|
|
667
|
+
```typescript
|
|
668
|
+
// Check if a JID is a group
|
|
669
|
+
const isGroup = WhatsappSocketGroup.isGroupId(jid);
|
|
670
|
+
|
|
671
|
+
// Format phone number to WhatsApp pattern
|
|
672
|
+
const formattedPhone = WhatsappSocketGroup.formatPhoneNumberToWhatsappPattern('050-123-4567');
|
|
673
|
+
// Returns: '972501234567@s.whatsapp.net'
|
|
674
|
+
|
|
675
|
+
// Format group ID
|
|
676
|
+
const formattedGroupId = WhatsappSocketGroup.formatGroupId('123456789');
|
|
677
|
+
// Returns: '123456789@g.us'
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
## Error Handling
|
|
681
|
+
|
|
682
|
+
Always wrap group operations in try-catch blocks:
|
|
683
|
+
|
|
684
|
+
```typescript
|
|
685
|
+
try {
|
|
686
|
+
await client.addParticipants(groupId, phoneNumber);
|
|
687
|
+
} catch (error) {
|
|
688
|
+
console.error('Failed to add participant:', error);
|
|
689
|
+
|
|
690
|
+
if (error.message.includes('item-not-found')) {
|
|
691
|
+
console.log('Group or participant not found');
|
|
692
|
+
} else if (error.message.includes('not-authorized')) {
|
|
693
|
+
console.log('Bot is not an admin');
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
## Common Use Cases
|
|
699
|
+
|
|
700
|
+
### Auto-Welcome New Members
|
|
701
|
+
|
|
702
|
+
```typescript
|
|
703
|
+
client.onReceiveMessages = async (messages) => {
|
|
704
|
+
for (const msg of messages) {
|
|
705
|
+
if (msg.messageType === 'groupParticipantsUpdate') {
|
|
706
|
+
const groupId = msg.key.remoteJid;
|
|
707
|
+
await client.sendTextMessage(
|
|
708
|
+
groupId,
|
|
709
|
+
'Welcome to the group! 👋'
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
### Daily Announcements
|
|
717
|
+
|
|
718
|
+
```typescript
|
|
719
|
+
import cron from 'node-cron';
|
|
720
|
+
|
|
721
|
+
// Send daily message at 9 AM
|
|
722
|
+
cron.schedule('0 9 * * *', async () => {
|
|
723
|
+
await client.sendMentionAll(
|
|
724
|
+
groupId,
|
|
725
|
+
'☀️ Good morning everyone! Have a great day!'
|
|
726
|
+
);
|
|
727
|
+
});
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
### Group Polling System
|
|
731
|
+
|
|
732
|
+
```typescript
|
|
733
|
+
await client.sendReplyButtonsMessage(groupId, {
|
|
734
|
+
title: '📊 Daily Poll',
|
|
735
|
+
subtitle: 'What should we have for lunch?',
|
|
736
|
+
buttons: ['🍕 Pizza', '🍔 Burgers', '🍜 Ramen', '🥗 Salad']
|
|
737
|
+
});
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
## Best Practices
|
|
741
|
+
|
|
742
|
+
1. **Admin Rights**: Many operations require admin rights. Ensure your bot is an admin before performing administrative tasks.
|
|
743
|
+
|
|
744
|
+
2. **Rate Limiting**: Don't add/remove participants too quickly. Add delays between operations:
|
|
745
|
+
```typescript
|
|
746
|
+
await client.addParticipants(groupId, participant1);
|
|
747
|
+
await new Promise(resolve => setTimeout(resolve, 2000)); // 2 second delay
|
|
748
|
+
await client.addParticipants(groupId, participant2);
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
3. **Profile Pictures**: Install `sharp` for better performance:
|
|
752
|
+
```bash
|
|
753
|
+
npm install sharp
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
4. **Group Size**: WhatsApp has limits on group sizes (typically 1024 members). Check before adding participants.
|
|
757
|
+
|
|
758
|
+
5. **Permissions**: Always check if the bot has necessary permissions before performing admin actions.
|
|
759
|
+
|
|
760
|
+
---
|
|
761
|
+
|
|
762
|
+
**See also**: [Complete Demo Script](https://github.com/hdriel/whatsapp-socket/blob/main/demo-script/src/group.script.ts)
|
|
763
|
+
|
|
421
764
|
## Session Storage
|
|
422
765
|
|
|
423
766
|
### File-Based Storage (Recommended for Development)
|
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
'use strict';var ie=require('fs'),se=require('@fadzzzslebew/baileys'),F=require('ms'),J=require('qrcode'),mongodb=require('mongodb'),ce=require('pino'),path=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ie__default=/*#__PURE__*/_interopDefault(ie);var se__default=/*#__PURE__*/_interopDefault(se);var F__default=/*#__PURE__*/_interopDefault(F);var J__default=/*#__PURE__*/_interopDefault(J);var ce__default=/*#__PURE__*/_interopDefault(ce);var N={replacer:(n,e)=>Buffer.isBuffer(e)||e instanceof Uint8Array||e?.type==="Buffer"?{type:"Buffer",data:Buffer.from(e?.data||e).toString("base64")}:e,reviver:(n,e)=>{if(typeof e=="object"&&e&&(e.buffer===true||e.type==="Buffer")){let t=e.data||e.value;return typeof t=="string"?Buffer.from(t,"base64"):Buffer.from(t||[])}return e}},Z=async n=>{let e=(o,a)=>{let u={$set:{...JSON.parse(JSON.stringify(o,N.replacer))}};return n.updateOne({_id:a},u,{upsert:true})},t=async o=>{try{let a=JSON.stringify(await n.findOne({_id:o}));return JSON.parse(a,N.reviver)}catch{return null}},r=async o=>{try{await n.deleteOne({_id:o});}catch{}},s=await t("creds")||se.initAuthCreds();return {state:{creds:s,keys:{get:async(o,a)=>{let i={};return await Promise.all(a.map(async u=>{let c=await t(`${o}-${u}`);o==="app-state-sync-key"&&c&&(c=se.WAProto.Message.AppStateSyncKeyData.fromObject(c)),i[u]=c;})),i},set:async o=>{let a=[];for(let i of Object.keys(o))for(let u of Object.keys(o[i])){let c=o[i][u],g=`${i}-${u}`;a.push(c?e(c,g):r(g));}await Promise.all(a);}}},saveCreds:()=>e(s,"creds")}},O=Z;var H=n=>F__default.default(n)/1e3;async function l(n){let t=await(await fetch(n)).arrayBuffer();return Buffer.from(t)}async function te(n,e){try{let{parseStream:t}=await import('music-metadata'),r=await t(n,{mimeType:e||"audio/mpeg"});return Math.floor(r.format.duration||0)}catch(t){throw console.error("Error parsing stream:",t),t}finally{n.destroyed||n.destroy();}}async function re(n,e){try{let{parseBuffer:t}=await import('music-metadata'),r=await t(n,e||"audio/mpeg").catch(()=>null);return r?Math.floor(r.format.duration||0):0}catch(t){throw console.error("Error parsing buffer:",t),t}}async function U(n,e){return n instanceof ie.ReadStream?te(n,e):re(n,e)}async function L(n){let e=[];for await(let t of n)e.push(t);return Buffer.concat(e)}function q(n){if(n.path){let e=n.path.toString();return path.basename(e)}}var w=n=>new Promise(e=>setTimeout(e,typeof n=="number"?n:F__default.default(n))),j={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",svg:"image/svg+xml",mp4:"video/mp4",avi:"video/x-msvideo",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",opus:"audio/opus",aac:"audio/aac",m4a:"audio/mp4",pdf:"application/pdf",doc:"application/msword",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xls:"application/vnd.ms-excel",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ppt:"application/vnd.ms-powerpoint",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",txt:"text/plain",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed"};var V=ce__default.default({level:"silent"}),h=class n{fileAuthStateDirectoryPath;mongoURL;mongoCollection="whatsapp-auth";logger;debug;printQRInTerminal;pairingPhone;customPairingCode;appName;onPreConnectionSendMessageFailed;onOpen;onClose;onQR;onConnectionStatusChange;onReceiveMessages;static DEFAULT_COUNTRY_CODE="972";static CONNECTION_TIMEOUT="2s";static formatPhoneNumber(e,t=n.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let r=e.replace(/[^0-9]/g,"");return r.startsWith("05")&&(r=r.substring(1)),r.startsWith(t)||(r=t+r),r}static formatPhoneNumberToWhatsappPattern(e,t=n.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e.replace(/:\d+@/,"@");let r=n.formatPhoneNumber(e,t);return r=`${r}@s.whatsapp.net`,r=r.replace(/:\d+@/,"@"),r}static getWhatsappPhoneLink({phone:e,message:t,countryCode:r=n.DEFAULT_COUNTRY_CODE}){let s=this.formatPhoneNumber(e,r),o=t?`?text=${encodeURI(t)}`:"";return `https://wa.me/${s}${o}`}static async qrToImage(e,t={}){return J__default.default.toDataURL(e,{errorCorrectionLevel:"H",width:400,margin:2,...t})}static async qrToTerminalString(e,t={}){return J__default.default.toString(e,{type:"terminal",small:true,...t})}static randomPairingCode(e,t=8){if(!e.includes("[")&&e.length===t)return e;let r="",s=[],o=i=>{let u=[];for(let c=0;c<i.length;c++)if(i[c+1]==="-"&&i[c+2]){let g=i.charCodeAt(c),p=i.charCodeAt(c+2);for(let d=g;d<=p;d++)u.push(String.fromCharCode(d));c+=2;}else u.push(i[c]);return u};for(let i=0;i<e.length&&r.length<t;i++){let u=e[i];if(u==="["){let c=e.indexOf("]",i),g=e.slice(i+1,c);s=o(g),i=c;}else r+=u;}for(;r.length<t&&s.length;)r+=s[Math.floor(Math.random()*s.length)];let a=r.toUpperCase();return a.padEnd(t,a)}static instances=new Map;static getInstance(e){let t=n.buildSocketKey(e);return n.instances.has(t)||new n(e),n.instances.get(t)}static clearInstance(e){e?n.instances.delete(e):n.instances.clear();}constructor(e){let{fileAuthStateDirectoryPath:t,mongoURL:r,mongoCollection:s="whatsapp-auth",logger:o,onOpen:a,onClose:i,onQR:u,onReceiveMessages:c,onConnectionStatusChange:g,debug:p,printQRInTerminal:d,pairingPhone:R,customPairingCode:S,onPreConnectionSendMessageFailed:D,appName:y}=e;this.appName=y,this.mongoURL=r,this.fileAuthStateDirectoryPath=t,this.mongoCollection=s,this.logger=o,this.debug=p,this.printQRInTerminal=d,this.pairingPhone=R,this.customPairingCode=S,this.onPreConnectionSendMessageFailed=D,this.onConnectionStatusChange=g,this.onReceiveMessages=c,this.onOpen=a,this.onClose=i,this.onQR=u,n.instances.has(this.socketKey)&&(this.socket=n.instances.get(this.socketKey));}async getLatestWhatsAppVersion(){try{let e=["https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json","https://raw.githubusercontent.com/whiskeysockets/baileys/master/src/Defaults/baileys-version.json"];for(let t of e)try{let r=await fetch(t);if(r.ok)return (await r.json()).version}catch{continue}return console.log("Could not fetch version, using fallback"),[2,3e3,1015901307]}catch(e){return console.error("Error fetching version:",e),[2,3e3,1015901307]}}async getAuthCollection(){if(!this.mongoURL)return [];let e=new mongodb.MongoClient(this.mongoURL);return await e.connect(),[e.db().collection(this.mongoCollection),e]}async authenticate(){if(!this.mongoURL&&!this.fileAuthStateDirectoryPath)throw new Error("fileAuthStateDirectoryPath/MongoURL is missing");if(!this.mongoURL){let{saveCreds:o,state:a}=await se.useMultiFileAuthState(this.fileAuthStateDirectoryPath);return {auth:a,saveCreds:o}}let[e]=await this.getAuthCollection(),{state:t,saveCreds:r}=await O(e);return {auth:{creds:t.creds,keys:se.makeCacheableSignalKeyStore(t.keys,V)},saveCreds:r}}static buildSocketKey(e){return e.appName||e.pairingPhone||e.mongoCollection||e.fileAuthStateDirectoryPath||"default"}get socketKey(){return this.appName||this.pairingPhone||this.mongoCollection||this.fileAuthStateDirectoryPath||"default"}get socket(){return n.instances.get(this.socketKey)??null}set socket(e){n.instances.set(this.socketKey,e);}async startConnection({options:e,connectionAttempts:t=3,onOpen:r=this.onOpen,onClose:s=this.onClose,onQR:o=this.onQR,onConnectionStatusChange:a=this.onConnectionStatusChange,pairingPhone:i,debug:u}={}){let c=i??this.pairingPhone,{saveCreds:g,auth:p}=await this.authenticate(),d=u===void 0?this.debug:u,R=await this.getLatestWhatsAppVersion(),S=async()=>new Promise(y=>{let P=se__default.default({version:R,logger:V,browser:[this.appName||"baileys","1.0.0",""],syncFullHistory:true,shouldIgnoreJid:f=>f.includes("@newsletter"),...e,printQRInTerminal:false,auth:p});P.ev.on("connection.update",async f=>{let{connection:k,lastDisconnect:x,qr:A}=f;if(A){if(d&&this.logger?.info("WHATSAPP","QR Code received",{qr:A}),this.printQRInTerminal){let z=await n.qrToTerminalString(A,{small:true}).catch(()=>null);console.log(z);}this.customPairingCode?n.randomPairingCode(this.customPairingCode):void 0;let b=c?n.formatPhoneNumber(c):null,M=b?await P.requestPairingCode(b):null;d&&this.printQRInTerminal&&this.logger?.info("WHATSAPP","QR Pairing Code",{code:M,pairingPhone:b}),await o?.(A,M);}switch(k){case "connecting":{d&&this.logger?.debug("WHATSAPP","Connecting..."),a?.("connecting");break}case "open":{d&&this.logger?.info("WHATSAPP","Connection opened successfully!"),this.socket=P,await r?.(),a?.("open"),y(this.socket);break}case "close":{let E=t-- >0&&x?.error?.output?.statusCode!==se.DisconnectReason.loggedOut,b=x?.error?.output?.statusCode,M=x?.error?.message;d&&this.logger?.info("WHATSAPP","Connection closed",{statusCode:b,errorMessage:M,shouldReconnect:E}),E&&t?(d&&this.logger?.info("WHATSAPP","Reconnecting..."),await w(n.CONNECTION_TIMEOUT),y(S())):(d&&this.logger?.warn("WHATSAPP","Logged out, clearing auth state"),await s?.(),this.socket=null,y(this.socket)),a?.("close");break}}}),P.ev.on("creds.update",g),this.onReceiveMessages&&typeof this.onReceiveMessages=="function"&&P.ev.on("messages.upsert",async({messages:f,type:k})=>{this.logger?.info("WHATSAPP","Received messages",{type:k,totalMessages:f.length}),this.onReceiveMessages?.(f,k);});}),D=await S();return await w(n.CONNECTION_TIMEOUT),D}async ensureSocketConnected(){return this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection().catch(e=>(this.onPreConnectionSendMessageFailed?.(e),null))),this.socket}async closeConnection(){this.socket&&(this.debug&&this.logger?.info("WHATSAPP","Closing connection"),this.socket.end(void 0),this.socket=null);}async clearAuthState(){if(await this.closeConnection(),this.mongoURL){let[e,t]=await this.getAuthCollection();this.debug&&this.logger?.info("WHATSAPP","Deleting auth state, required to scanning QR again"),await e?.deleteMany({}),await t?.close();}else this.fileAuthStateDirectoryPath&&ie__default.default.rmSync(this.fileAuthStateDirectoryPath,{recursive:true,force:true});}async resetConnection({pairingPhone:e,autoConnect:t=true}={}){await this.clearAuthState(),t&&(await w(n.CONNECTION_TIMEOUT),await this.startConnection({pairingPhone:e}));}isConnected(){return !!this.socket?.user}async deleteMessage(e,t,r=true){if(await this.ensureSocketConnected(),!this.socket)throw new Error("Socket not connected");let s=n.formatPhoneNumberToWhatsappPattern(t);try{if(r){let o=await this.socket.sendMessage(s,{delete:{remoteJid:s,fromMe:!0,id:e,participant:void 0}});return this.debug&&this.logger?.info("WHATSAPP","Message deleted for everyone",{messageId:e,chatJid:s}),o}else throw this.debug&&this.logger?.warn("WHATSAPP","Delete for me is not supported via API",{messageId:e,chatJid:s,reason:["Delete for me only (clear message locally)",`Note: This doesn't work via API - WhatsApp doesn't support "delete for me" via Baileys`,"We can only revoke messages (delete for everyone)"].join(`
|
|
2
|
-
`)}),new Error("Delete for me is not supported via WhatsApp API. Use deleteForEveryone=true to revoke the message.")}catch(o){throw this.debug&&this.logger?.error("WHATSAPP","Failed to delete message",{messageId:e,chatJid:s,error:o.message}),o}}async deleteMessages(e,t=true){await this.ensureSocketConnected();let r=[];for(let{messageId:s,chatJid:o}of e)try{let a=await this.deleteMessage(s,o,t);r.push({success:!0,messageId:s,result:a}),await w("500ms");}catch(a){r.push({success:false,messageId:s,error:a.message});}return r}async loadRecentMessages(e,t){await this.ensureSocketConnected();let r=n.formatPhoneNumberToWhatsappPattern(e);try{return await this.socket?.waitForMessage(t,3e3)||null}catch(s){return this.debug&&this.logger?.error("WHATSAPP","Failed to load message history",{chatJid:r,error:s.message}),null}}};var C=class n extends h{constructor(e){super(e);}async deleteMessageById(e,t){return this.deleteMessage(e,t,true)}async sendTextMessage(e,t){await this.ensureSocketConnected();let r=n.formatPhoneNumberToWhatsappPattern(e);return this.socket?.sendMessage(r,{text:t})}async sendButtonsMessage(e,{subtitle:t,title:r,buttons:s}){if(!r||!s.length)throw new Error("sendButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let o=n.formatPhoneNumberToWhatsappPattern(e),a=s?.map(u=>{let c={display_text:u.label},g;switch(true){case !!u.url:g="cta_url",c.url=u.url;break;case !!u.copy:g="cta_copy",c.copy_code=u.copy;break;case !!u.tel:g="cta_call",c.phone_number=u.tel;break;case !!u.email:g="cta_email",c.email=u.email;break;case !!(u.reminderOn||u.reminderDate):g="cta_reminder";let{reminderOn:p,reminderDate:d}=u;c.reminder_name=u.reminderName,c.reminder_timestamp=d?Math.floor(+new Date(d)/1e3):Math.floor(Date.now()/1e3)+H(p??"0s");break;default:g="";break}return {name:g,buttonParamsJson:JSON.stringify(c)}}).filter(u=>u.name),i=se.generateWAMessageFromContent(o,{viewOnceMessage:{message:{interactiveMessage:se.WAProto.Message.InteractiveMessage.create({...r&&{body:se.WAProto.Message.InteractiveMessage.Body.create({text:r})},...t&&{footer:se.WAProto.Message.InteractiveMessage.Footer.create({text:t})},...!!a?.length&&{nativeFlowMessage:se.WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})}})}}},{userJid:o});return this.debug&&this.logger?.debug("WHATSAPP","send buttons message",{jid:o,footer:t,body:r,buttons:a}),this.socket?.relayMessage(o,i.message,{messageId:i.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:r,buttons:s}){if(!t||!s.length)throw new Error("sendReplyButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let o=n.formatPhoneNumberToWhatsappPattern(e),a=s.filter(i=>i).map((i,u)=>typeof i=="string"?{buttonId:`id-${u}`,buttonText:{displayText:i},type:1}:{buttonId:`${i.id}`,buttonText:{displayText:i.label},type:1});return this.debug&&this.logger?.debug("WHATSAPP","send reply buttons message",{jid:o,text:t,footer:r,buttons:a}),this.socket?.sendMessage(o,{text:t,...r&&{footer:r},buttons:a})}async sendLocation(e,{latitude:t,longitude:r,name:s,address:o}){if(t===void 0||r===void 0)throw new Error("sendLocation: latitude and longitude are required fields.");if(t<-90||t>90)throw new Error("sendLocation: latitude must be between -90 and 90.");if(r<-180||r>180)throw new Error("sendLocation: longitude must be between -180 and 180.");await this.ensureSocketConnected();let a=n.formatPhoneNumberToWhatsappPattern(e);return this.debug&&this.logger?.debug("WHATSAPP","send location message",{jid:a,latitude:t,longitude:r,name:s,address:o}),this.socket?.sendMessage(a,{location:{degreesLatitude:t,degreesLongitude:r,...s&&{name:s},...o&&{address:o}}})}};var I=class n extends C{constructor(e){super(e);}async sendFileFromStream(e,t,r){await this.ensureSocketConnected();let s=n.formatPhoneNumberToWhatsappPattern(e),o=t instanceof Buffer?t:await this.streamToBuffer(t),a=r.mimetype||this.getMimetypeFromFilename(r.filename),i=await this.createFileMessage(o,a,r),u={...r.replyToMessageId&&{quoted:{key:{id:r.replyToMessageId}}}};return this.socket?.sendMessage(s,i,u)}async streamToBuffer(e){return new Promise((t,r)=>{let s=[];e.on("data",o=>s.push(Buffer.from(o))),e.on("error",o=>r(o)),e.on("end",()=>t(Buffer.concat(s)));})}getMimetypeFromFilename(e){let t=e.split(".").pop()?.toLowerCase();return j[t||""]||"application/octet-stream"}async createFileMessage(e,t,r){let[s]=t.split("/");switch(s){case "image":return {image:e,caption:r.caption,mimetype:t,fileName:r.filename};case "video":return {video:e,caption:r.caption,mimetype:t,fileName:r.filename,gifPlayback:r.gifPlayback||false,jpegThumbnail:r.jpegThumbnail,...r.seconds&&{seconds:r.seconds}};case "audio":return r.ptt?{audio:e,mimetype:"audio/ogg; codecs=opus",ptt:true,...r.seconds&&{seconds:r.seconds}}:{audio:e,mimetype:t,fileName:r.filename,...r.seconds&&{seconds:r.seconds}};default:return {document:e,mimetype:t,fileName:r.filename,caption:r.caption,jpegThumbnail:r.jpegThumbnail}}}async sendImage(e,t,r={}){return this.sendFileFromStream(e,t,{filename:r.filename||"image.jpg",caption:r.caption,replyToMessageId:r.replyToMessageId})}async sendVideo(e,t,r={}){return this.sendFileFromStream(e,t,{filename:r.filename||"video.mp4",caption:r.caption,gifPlayback:r.gifPlayback,replyToMessageId:r.replyToMessageId,jpegThumbnail:r.jpegThumbnail})}async sendAudio(e,t,r={}){return this.sendFileFromStream(e,t,{filename:r.filename||"audio.mp3",mimetype:r.ptt?"audio/ogg; codecs=opus":"",ptt:r.ptt,seconds:r.seconds,replyToMessageId:r.replyToMessageId})}async sendDocument(e,t,r){return this.sendFileFromStream(e,t,{filename:r.filename,mimetype:r.mimetype,caption:r.caption,replyToMessageId:r.replyToMessageId,jpegThumbnail:r.jpegThumbnail})}async sendVoiceNote(e,t,r={}){return this.sendAudio(e,t,{ptt:true,seconds:r.seconds,replyToMessageId:r.replyToMessageId})}async sendSticker(e,t,r={}){await this.ensureSocketConnected();let s=n.formatPhoneNumberToWhatsappPattern(e),o=t instanceof Buffer?t:await this.streamToBuffer(t),a={...r.replyToMessageId&&{quoted:{key:{id:r.replyToMessageId}}}};return this.socket?.sendMessage(s,{sticker:o},a)}};var v=class n extends I{constructor(e){super(e);}async sendImageMessage(e,t,{caption:r="",filename:s}={}){await this.ensureSocketConnected();let o=n.formatPhoneNumberToWhatsappPattern(e),a=typeof t=="string"?await l(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send image message",{jid:o,caption:r,filename:s}),await this.sendImage(o,a,{caption:r,...s&&{filename:s}})}async sendVideoMessage(e,t,{caption:r="",filename:s,sendAsGifPlayback:o=false}={}){await this.ensureSocketConnected();let a=n.formatPhoneNumberToWhatsappPattern(e),i=typeof t=="string"?await l(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send video message",{jid:a,caption:r,filename:s,gifPlayback:o}),await this.sendVideo(a,i,{caption:r,gifPlayback:o,...s&&{filename:s}})}async sendFileMessage(e,t,{caption:r="",mimetype:s="application/vnd.openxmlformats-officedocument.wordprocessingml.document",replyToMessageId:o,jpegThumbnailSrc:a,filename:i}={}){await this.ensureSocketConnected();let u=n.formatPhoneNumberToWhatsappPattern(e),c=typeof t=="string"?await l(t):t,g;typeof a=="string"?g=await l(a):a instanceof ie.ReadStream?g=await L(a):g=a;let p="mu-document";if(t instanceof ie.ReadStream){let d=q(t);d&&(p=d);}else typeof t=="string"&&(p=path.basename(t));return this.debug&&this.logger?.debug("WHATSAPP","send file message",{jid:u,caption:r,mimetype:s,filename:p,replyToMessageId:o,includeJpegThumbnail:!!g}),await this.sendDocument(u,c,{caption:r,mimetype:s,filename:p,replyToMessageId:o,jpegThumbnail:g})}async sendAudioMessage(e,t,{filename:r,replyToMessageId:s,mimetype:o,seconds:a}={}){await this.ensureSocketConnected();let i=n.formatPhoneNumberToWhatsappPattern(e),u=typeof t=="string"?await l(t):t,c=a||await U(u,o).catch(()=>0);return this.debug&&this.logger?.debug("WHATSAPP","send audio message",{jid:i,mimetype:o,filename:r,seconds:c,replyToMessageId:s}),await this.sendAudio(i,u,{...r&&{filename:r},...o&&{mimetype:o},...c&&{seconds:c},...s&&{replyToMessageId:s}})}async sendStickerMessage(e,t,{replyToMessageId:r}={}){await this.ensureSocketConnected();let s=n.formatPhoneNumberToWhatsappPattern(e),o=typeof t=="string"?await l(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send sticker message",{jid:s,replyToMessageId:r}),await this.sendSticker(s,o,{replyToMessageId:r})}};var $=class extends v{constructor(e){super(e);}};var G=class n extends h{static formatGroupId(e){return e.endsWith("@g.us")?e:`${e.replace(/@s\.whatsapp\.net|@g\.us/g,"")}@g.us`}static isGroupId(e){return e.endsWith("@g.us")}constructor(e){super(e);}async createGroup({name:e,participants:t,description:r}){if(!e)throw new Error("createGroup: Group name is required.");await this.ensureSocketConnected();let s=(t??[]).map(a=>n.formatPhoneNumberToWhatsappPattern(a));if(s.length===0){let a=this.socket?.user?.id;if(!a)throw new Error("createGroup: Could not get bot user ID. Make sure socket is connected.");let i=n.formatPhoneNumberToWhatsappPattern(a);s.push(i),this.debug&&this.logger?.debug("WHATSAPP","No participants provided, creating group with self only",{selfJid:a});}this.debug&&this.logger?.debug("WHATSAPP","Creating group",{name:e,description:r,participants:s});let o=await this.socket?.groupCreate(e,s);if(r&&o?.id){let a=n.formatGroupId(o.id);await this.updateGroupDescription(a,r);}return o}async updateGroupName(e,t){if(!e||!t)throw new Error("updateGroupName: Group ID and new name are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group name",{groupId:r,newName:t}),this.socket?.groupUpdateSubject(r,t)}async updateGroupDescription(e,t){if(!e)throw new Error("updateGroupDescription: Group ID is required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group description",{groupId:r}),this.socket?.groupUpdateDescription(r,t||"")}async updateGroupSettings(e,t){if(!e||!t)throw new Error("updateGroupSettings: Group ID and setting are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group settings",{groupId:r,setting:t}),this.socket?.groupSettingUpdate(r,t)}async updateGroupParticipants(e,t,r){if(!e)throw new Error("addParticipants: Group ID is required.");let s=[].concat(t).filter(i=>i);if(s?.length)return;await this.ensureSocketConnected();let o=n.formatGroupId(e),a=s.map(i=>n.formatPhoneNumberToWhatsappPattern(i));return this.debug&&this.logger?.debug("WHATSAPP",`${r} participants to group`,{groupId:o,participantsCount:a.length}),this.socket?.groupParticipantsUpdate(o,a,r)}async addParticipants(e,t){return this.updateGroupParticipants(e,t,"add")}async removeParticipants(e,t){return this.updateGroupParticipants(e,t,"remove")}async promoteToAdmin(e,t){return this.updateGroupParticipants(e,t,"promote")}async demoteFromAdmin(e,t){return this.updateGroupParticipants(e,t,"demote")}async leaveGroup(e){if(!e)throw new Error("leaveGroup: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Leaving group",{groupId:t}),this.socket?.groupLeave(t)}async getGroupMetadata(e){if(!e)throw new Error("getGroupMetadata: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Fetching group metadata",{groupId:t}),this.socket?.groupMetadata(t)}async getAllGroups(){await this.ensureSocketConnected(),this.debug&&this.logger?.debug("WHATSAPP","Fetching all groups");let e=await this.socket?.groupFetchAllParticipating();return e?Object.values(e):[]}async getGroupInviteCode(e){if(!e)throw new Error("getGroupInviteCode: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Fetching group invite code",{groupId:t}),this.socket?.groupInviteCode(t)}async revokeGroupInviteCode(e){if(!e)throw new Error("revokeGroupInviteCode: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Revoking group invite code",{groupId:t}),this.socket?.groupRevokeInvite(t)}async joinGroupViaInvite(e){if(!e)throw new Error("joinGroupViaInvite: Invite code is required.");return await this.ensureSocketConnected(),this.debug&&this.logger?.debug("WHATSAPP","Joining group via invite",{inviteCode:e}),this.socket?.groupAcceptInvite(e)}async getGroupInfoFromInvite(e){if(!e)throw new Error("getGroupInfoFromInvite: Invite code is required.");return await this.ensureSocketConnected(),this.debug&&this.logger?.debug("WHATSAPP","Fetching group info from invite",{inviteCode:e}),this.socket?.groupGetInviteInfo(e)}async updateGroupProfilePicture(e,t){if(!e||!t)throw new Error("updateGroupProfilePicture: Group ID and image buffer are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group profile picture",{groupId:r}),this.socket?.updateProfilePicture(r,t)}async removeGroupProfilePicture(e){if(!e)throw new Error("removeGroupProfilePicture: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Removing group profile picture",{groupId:t}),this.socket?.removeProfilePicture(t)}async getGroupProfilePicture(e,t=false){if(!e)throw new Error("getGroupProfilePicture: Group ID is required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Fetching group profile picture",{groupId:r,highRes:t}),this.socket?.profilePictureUrl(r,t?"image":"preview")}};var B=class n extends G{constructor(e){super(e);}async sendTextMessage(e,t,r){if(!e||!t)throw new Error("sendTextMessage: Group ID and text are required.");await this.ensureSocketConnected();let s=n.formatGroupId(e),o={};return r?.replyToMessageId&&(o.quoted={key:{id:r.replyToMessageId}}),this.debug&&this.logger?.debug("WHATSAPP","Sending text message to group",{groupId:s,textLength:t.length,hasMentions:!!r?.mentions?.length}),this.socket?.sendMessage(s,{text:t},o)}async sendButtonsMessage(e,{title:t,subtitle:r,buttons:s}){if(!e||!t||!s?.length)throw new Error("sendButtonsMessage: Group ID, title, and buttons are required.");await this.ensureSocketConnected();let o=n.formatGroupId(e),a=s?.map(u=>{let c={display_text:u.label},g;switch(true){case !!u.url:g="cta_url",c.url=u.url;break;case !!u.copy:g="cta_copy",c.copy_code=u.copy;break;case !!u.tel:g="cta_call",c.phone_number=u.tel;break;default:g="";break}return {name:g,buttonParamsJson:JSON.stringify(c)}}).filter(u=>u.name),i=se.generateWAMessageFromContent(o,{viewOnceMessage:{message:{interactiveMessage:se.WAProto.Message.InteractiveMessage.create({body:se.WAProto.Message.InteractiveMessage.Body.create({text:t}),...r&&{footer:se.WAProto.Message.InteractiveMessage.Footer.create({text:r})},nativeFlowMessage:se.WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})})}}},{userJid:o});return this.debug&&this.logger?.debug("WHATSAPP","Sending buttons message to group",{groupId:o,title:t,buttonsCount:a.length}),this.socket?.relayMessage(o,i.message,{messageId:i.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:r,buttons:s,mentions:o}){if(!e||!t||!s?.length)throw new Error("sendReplyButtonsMessage: Group ID, title, and buttons are required.");await this.ensureSocketConnected();let a=n.formatGroupId(e),i=s.filter(c=>c).map((c,g)=>typeof c=="string"?{buttonId:`id-${g}`,buttonText:{displayText:c},type:1}:{buttonId:`${c.id}`,buttonText:{displayText:c.label},type:1}),u={text:t,buttons:i,...r&&{footer:r}};return o?.length&&(u.mentions=o.map(c=>n.formatPhoneNumberToWhatsappPattern(c))),this.debug&&this.logger?.debug("WHATSAPP","Sending reply buttons message to group",{groupId:a,title:t,buttonsCount:i.length}),this.socket?.sendMessage(a,u)}async sendImageMessage(e,t,{caption:r,mentions:s}={}){if(!e||!t)throw new Error("sendImage: Group ID and image buffer are required.");await this.ensureSocketConnected();let o=n.formatGroupId(e),a={image:t,...r&&{caption:r}};return s?.length&&(a.mentions=s.map(i=>n.formatPhoneNumberToWhatsappPattern(i))),this.debug&&this.logger?.debug("WHATSAPP","Sending image to group",{groupId:o,hasCaption:!!r}),this.socket?.sendMessage(o,a)}async sendVideoMessage(e,t,r,s){if(!e||!t)throw new Error("sendVideo: Group ID and video buffer are required.");await this.ensureSocketConnected();let o=n.formatGroupId(e),a={video:t,...r&&{caption:r}};return s?.mentions?.length&&(a.mentions=s.mentions.map(i=>n.formatPhoneNumberToWhatsappPattern(i))),this.debug&&this.logger?.debug("WHATSAPP","Sending video to group",{groupId:o,hasCaption:!!r}),this.socket?.sendMessage(o,a)}async sendAudioMessage(e,t,r){if(!e||!t)throw new Error("sendAudio: Group ID and audio buffer are required.");await this.ensureSocketConnected();let s=n.formatGroupId(e),o={audio:t,ptt:r?.ptt??false};return r?.mentions?.length&&(o.mentions=r.mentions.map(a=>n.formatPhoneNumberToWhatsappPattern(a))),this.debug&&this.logger?.debug("WHATSAPP","Sending audio to group",{groupId:s,isPTT:o.ptt}),this.socket?.sendMessage(s,o)}async sendDocumentMessage(e,t,r,s,o){if(!e||!t||!r)throw new Error("sendDocument: Group ID, document buffer, and fileName are required.");await this.ensureSocketConnected();let a=n.formatGroupId(e),i={document:t,fileName:r,...s&&{mimetype:s}};return o?.mentions?.length&&(i.mentions=o.mentions.map(u=>n.formatPhoneNumberToWhatsappPattern(u))),this.debug&&this.logger?.debug("WHATSAPP","Sending document to group",{groupId:a,fileName:r}),this.socket?.sendMessage(a,i)}async sendLocationMessage(e,t,r,s,o){if(!e||t===void 0||r===void 0)throw new Error("sendLocation: Group ID, latitude, and longitude are required.");await this.ensureSocketConnected();let a=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Sending location to group",{groupId:a,latitude:t,longitude:r}),this.socket?.sendMessage(a,{location:{degreesLatitude:t,degreesLongitude:r,...s&&{name:s},...o&&{address:o}}})}async sendMentionAll(e,t){if(!e||!t)throw new Error("sendMentionAll: Group ID and text are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e),s=await this.getGroupMetadata(r);if(!s)throw new Error("Could not fetch group metadata");let o=s.participants.map(a=>a.id);return this.debug&&this.logger?.debug("WHATSAPP","Sending mention all message to group",{groupId:r,participantsCount:o.length}),this.socket?.sendMessage(r,{text:t,mentions:o})}async sendReactionMessage(e,t,r){if(!e||!t||!r)throw new Error("sendReaction: Group ID, message ID, and emoji are required.");await this.ensureSocketConnected();let s=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Sending reaction to group message",{groupId:s,messageId:t,emoji:r}),this.socket?.sendMessage(s,{react:{text:r,key:{id:t,remoteJid:s}}})}async deleteGroupMessage(e,t){if(!e||!t)throw new Error("deleteGroupMessage: Group ID and message ID are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Deleting message in group",{groupId:r,messageId:t}),this.socket?.sendMessage(r,{delete:{id:t,remoteJid:r,fromMe:true}})}};var K=class extends B{constructor(e){super(e);}};exports.WhatsappSocket=$;exports.WhatsappSocketGroup=K;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var ie=require('fs'),se=require('@fadzzzslebew/baileys'),F=require('ms'),J=require('qrcode'),mongodb=require('mongodb'),ce=require('pino'),path=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ie__default=/*#__PURE__*/_interopDefault(ie);var se__default=/*#__PURE__*/_interopDefault(se);var F__default=/*#__PURE__*/_interopDefault(F);var J__default=/*#__PURE__*/_interopDefault(J);var ce__default=/*#__PURE__*/_interopDefault(ce);var N={replacer:(n,e)=>Buffer.isBuffer(e)||e instanceof Uint8Array||e?.type==="Buffer"?{type:"Buffer",data:Buffer.from(e?.data||e).toString("base64")}:e,reviver:(n,e)=>{if(typeof e=="object"&&e&&(e.buffer===true||e.type==="Buffer")){let t=e.data||e.value;return typeof t=="string"?Buffer.from(t,"base64"):Buffer.from(t||[])}return e}},Z=async n=>{let e=(o,a)=>{let u={$set:{...JSON.parse(JSON.stringify(o,N.replacer))}};return n.updateOne({_id:a},u,{upsert:true})},t=async o=>{try{let a=JSON.stringify(await n.findOne({_id:o}));return JSON.parse(a,N.reviver)}catch{return null}},r=async o=>{try{await n.deleteOne({_id:o});}catch{}},s=await t("creds")||se.initAuthCreds();return {state:{creds:s,keys:{get:async(o,a)=>{let i={};return await Promise.all(a.map(async u=>{let c=await t(`${o}-${u}`);o==="app-state-sync-key"&&c&&(c=se.WAProto.Message.AppStateSyncKeyData.fromObject(c)),i[u]=c;})),i},set:async o=>{let a=[];for(let i of Object.keys(o))for(let u of Object.keys(o[i])){let c=o[i][u],g=`${i}-${u}`;a.push(c?e(c,g):r(g));}await Promise.all(a);}}},saveCreds:()=>e(s,"creds")}},O=Z;var H=n=>F__default.default(n)/1e3;async function l(n){let t=await(await fetch(n)).arrayBuffer();return Buffer.from(t)}async function te(n,e){try{let{parseStream:t}=await import('music-metadata'),r=await t(n,{mimeType:e||"audio/mpeg"});return Math.floor(r.format.duration||0)}catch(t){throw console.error("Error parsing stream:",t),t}finally{n.destroyed||n.destroy();}}async function re(n,e){try{let{parseBuffer:t}=await import('music-metadata'),r=await t(n,e||"audio/mpeg").catch(()=>null);return r?Math.floor(r.format.duration||0):0}catch(t){throw console.error("Error parsing buffer:",t),t}}async function U(n,e){return n instanceof ie.ReadStream?te(n,e):re(n,e)}async function L(n){let e=[];for await(let t of n)e.push(t);return Buffer.concat(e)}function q(n){if(n.path){let e=n.path.toString();return path.basename(e)}}var w=n=>new Promise(e=>setTimeout(e,typeof n=="number"?n:F__default.default(n))),j={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",svg:"image/svg+xml",mp4:"video/mp4",avi:"video/x-msvideo",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",opus:"audio/opus",aac:"audio/aac",m4a:"audio/mp4",pdf:"application/pdf",doc:"application/msword",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",xls:"application/vnd.ms-excel",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ppt:"application/vnd.ms-powerpoint",pptx:"application/vnd.openxmlformats-officedocument.presentationml.presentation",txt:"text/plain",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed"};var V=ce__default.default({level:"silent"}),f=class n{fileAuthStateDirectoryPath;mongoURL;mongoCollection="whatsapp-auth";logger;debug;printQRInTerminal;pairingPhone;customPairingCode;appName;onPreConnectionSendMessageFailed;onOpen;onClose;onQR;onConnectionStatusChange;onReceiveMessages;static DEFAULT_COUNTRY_CODE="972";static CONNECTION_TIMEOUT="2s";static formatPhoneNumber(e,t=n.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e;let r=e.replace(/[^0-9]/g,"");return r.startsWith("05")&&(r=r.substring(1)),r.startsWith(t)||(r=t+r),r}static formatPhoneNumberToWhatsappPattern(e,t=n.DEFAULT_COUNTRY_CODE){if(e.endsWith("@s.whatsapp.net"))return e.replace(/:\d+@/,"@");let r=n.formatPhoneNumber(e,t);return r=`${r}@s.whatsapp.net`,r=r.replace(/:\d+@/,"@"),r}static getWhatsappPhoneLink({phone:e,message:t,countryCode:r=n.DEFAULT_COUNTRY_CODE}){let s=this.formatPhoneNumber(e,r),o=t?`?text=${encodeURI(t)}`:"";return `https://wa.me/${s}${o}`}static async qrToImage(e,t={}){return J__default.default.toDataURL(e,{errorCorrectionLevel:"H",width:400,margin:2,...t})}static async qrToTerminalString(e,t={}){return J__default.default.toString(e,{type:"terminal",small:true,...t})}static randomPairingCode(e,t=8){if(!e.includes("[")&&e.length===t)return e;let r="",s=[],o=i=>{let u=[];for(let c=0;c<i.length;c++)if(i[c+1]==="-"&&i[c+2]){let g=i.charCodeAt(c),p=i.charCodeAt(c+2);for(let d=g;d<=p;d++)u.push(String.fromCharCode(d));c+=2;}else u.push(i[c]);return u};for(let i=0;i<e.length&&r.length<t;i++){let u=e[i];if(u==="["){let c=e.indexOf("]",i),g=e.slice(i+1,c);s=o(g),i=c;}else r+=u;}for(;r.length<t&&s.length;)r+=s[Math.floor(Math.random()*s.length)];let a=r.toUpperCase();return a.padEnd(t,a)}static instances=new Map;static getInstance(e){let t=n.buildSocketKey(e);return n.instances.has(t)||new n(e),n.instances.get(t)}static clearInstance(e){e?n.instances.delete(e):n.instances.clear();}constructor(e){let{fileAuthStateDirectoryPath:t,mongoURL:r,mongoCollection:s="whatsapp-auth",logger:o,onOpen:a,onClose:i,onQR:u,onReceiveMessages:c,onConnectionStatusChange:g,debug:p,printQRInTerminal:d,pairingPhone:R,customPairingCode:S,onPreConnectionSendMessageFailed:D,appName:y}=e;this.appName=y,this.mongoURL=r,this.fileAuthStateDirectoryPath=t,this.mongoCollection=s,this.logger=o,this.debug=p,this.printQRInTerminal=d,this.pairingPhone=R,this.customPairingCode=S,this.onPreConnectionSendMessageFailed=D,this.onConnectionStatusChange=g,this.onReceiveMessages=c,this.onOpen=a,this.onClose=i,this.onQR=u,n.instances.has(this.socketKey)&&(this.socket=n.instances.get(this.socketKey));}async getLatestWhatsAppVersion(){try{let e=["https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json","https://raw.githubusercontent.com/whiskeysockets/baileys/master/src/Defaults/baileys-version.json"];for(let t of e)try{let r=await fetch(t);if(r.ok)return (await r.json()).version}catch{continue}return console.log("Could not fetch version, using fallback"),[2,3e3,1015901307]}catch(e){return console.error("Error fetching version:",e),[2,3e3,1015901307]}}async getAuthCollection(){if(!this.mongoURL)return [];let e=new mongodb.MongoClient(this.mongoURL);return await e.connect(),[e.db().collection(this.mongoCollection),e]}async authenticate(){if(!this.mongoURL&&!this.fileAuthStateDirectoryPath)throw new Error("fileAuthStateDirectoryPath/MongoURL is missing");if(!this.mongoURL){let{saveCreds:o,state:a}=await se.useMultiFileAuthState(this.fileAuthStateDirectoryPath);return {auth:a,saveCreds:o}}let[e]=await this.getAuthCollection(),{state:t,saveCreds:r}=await O(e);return {auth:{creds:t.creds,keys:se.makeCacheableSignalKeyStore(t.keys,V)},saveCreds:r}}static buildSocketKey(e){return e.appName||e.pairingPhone||e.mongoCollection||e.fileAuthStateDirectoryPath||"default"}get socketKey(){return this.appName||this.pairingPhone||this.mongoCollection||this.fileAuthStateDirectoryPath||"default"}get socket(){return n.instances.get(this.socketKey)??null}set socket(e){n.instances.set(this.socketKey,e);}async startConnection({options:e,connectionAttempts:t=3,onOpen:r=this.onOpen,onClose:s=this.onClose,onQR:o=this.onQR,onConnectionStatusChange:a=this.onConnectionStatusChange,pairingPhone:i,debug:u}={}){let c=i??this.pairingPhone,{saveCreds:g,auth:p}=await this.authenticate(),d=u===void 0?this.debug:u,R=await this.getLatestWhatsAppVersion(),S=async()=>new Promise(y=>{let P=se__default.default({version:R,logger:V,browser:[this.appName||"baileys","1.0.0",""],syncFullHistory:true,shouldIgnoreJid:h=>h.includes("@newsletter"),...e,printQRInTerminal:false,auth:p});P.ev.on("connection.update",async h=>{let{connection:k,lastDisconnect:x,qr:A}=h;if(A){if(d&&this.logger?.info("WHATSAPP","QR Code received",{qr:A}),this.printQRInTerminal){let z=await n.qrToTerminalString(A,{small:true}).catch(()=>null);console.log(z);}this.customPairingCode?n.randomPairingCode(this.customPairingCode):void 0;let b=c?n.formatPhoneNumber(c):null,M=b?await P.requestPairingCode(b):null;d&&this.printQRInTerminal&&this.logger?.info("WHATSAPP","QR Pairing Code",{code:M,pairingPhone:b}),await o?.(A,M);}switch(k){case "connecting":{d&&this.logger?.debug("WHATSAPP","Connecting..."),a?.("connecting");break}case "open":{d&&this.logger?.info("WHATSAPP","Connection opened successfully!"),this.socket=P,await r?.(),a?.("open"),y(this.socket);break}case "close":{let E=t-- >0&&x?.error?.output?.statusCode!==se.DisconnectReason.loggedOut,b=x?.error?.output?.statusCode,M=x?.error?.message;d&&this.logger?.info("WHATSAPP","Connection closed",{statusCode:b,errorMessage:M,shouldReconnect:E}),E&&t?(d&&this.logger?.info("WHATSAPP","Reconnecting..."),await w(n.CONNECTION_TIMEOUT),y(S())):(d&&this.logger?.warn("WHATSAPP","Logged out, clearing auth state"),await s?.(),this.socket=null,y(this.socket)),a?.("close");break}}}),P.ev.on("creds.update",g),this.onReceiveMessages&&typeof this.onReceiveMessages=="function"&&P.ev.on("messages.upsert",async({messages:h,type:k})=>{this.logger?.info("WHATSAPP","Received messages",{type:k,totalMessages:h.length}),this.onReceiveMessages?.(h,k);});}),D=await S();return await w(n.CONNECTION_TIMEOUT),D}async ensureSocketConnected(){return this.socket||(this.debug&&this.logger?.warn("WHATSAPP","Client not connected, attempting to connect..."),this.socket=await this.startConnection().catch(e=>(this.onPreConnectionSendMessageFailed?.(e),null))),this.socket}async closeConnection(){this.socket&&(this.debug&&this.logger?.info("WHATSAPP","Closing connection"),this.socket.end(void 0),this.socket=null);}async clearAuthState(){if(await this.closeConnection(),this.mongoURL){let[e,t]=await this.getAuthCollection();this.debug&&this.logger?.info("WHATSAPP","Deleting auth state, required to scanning QR again"),await e?.deleteMany({}),await t?.close();}else this.fileAuthStateDirectoryPath&&ie__default.default.rmSync(this.fileAuthStateDirectoryPath,{recursive:true,force:true});}async resetConnection({pairingPhone:e,autoConnect:t=true}={}){await this.clearAuthState(),t&&(await w(n.CONNECTION_TIMEOUT),await this.startConnection({pairingPhone:e}));}isConnected(){return !!this.socket?.user}async deleteMessage(e,t,r=true){if(await this.ensureSocketConnected(),!this.socket)throw new Error("Socket not connected");let s=n.formatPhoneNumberToWhatsappPattern(t);try{if(r){let o=await this.socket.sendMessage(s,{delete:{remoteJid:s,fromMe:!0,id:e,participant:void 0}});return this.debug&&this.logger?.info("WHATSAPP","Message deleted for everyone",{messageId:e,chatJid:s}),o}else throw this.debug&&this.logger?.warn("WHATSAPP","Delete for me is not supported via API",{messageId:e,chatJid:s,reason:["Delete for me only (clear message locally)",`Note: This doesn't work via API - WhatsApp doesn't support "delete for me" via Baileys`,"We can only revoke messages (delete for everyone)"].join(`
|
|
2
|
+
`)}),new Error("Delete for me is not supported via WhatsApp API. Use deleteForEveryone=true to revoke the message.")}catch(o){throw this.debug&&this.logger?.error("WHATSAPP","Failed to delete message",{messageId:e,chatJid:s,error:o.message}),o}}async deleteMessages(e,t=true){await this.ensureSocketConnected();let r=[];for(let{messageId:s,chatJid:o}of e)try{let a=await this.deleteMessage(s,o,t);r.push({success:!0,messageId:s,result:a}),await w("500ms");}catch(a){r.push({success:false,messageId:s,error:a.message});}return r}async loadRecentMessages(e,t){await this.ensureSocketConnected();let r=n.formatPhoneNumberToWhatsappPattern(e);try{return await this.socket?.waitForMessage(t,3e3)||null}catch(s){return this.debug&&this.logger?.error("WHATSAPP","Failed to load message history",{chatJid:r,error:s.message}),null}}};var C=class n extends f{constructor(e){super(e);}async deleteMessageById(e,t){return this.deleteMessage(e,t,true)}async sendTextMessage(e,t){await this.ensureSocketConnected();let r=n.formatPhoneNumberToWhatsappPattern(e);return this.socket?.sendMessage(r,{text:t})}async sendButtonsMessage(e,{subtitle:t,title:r,buttons:s}){if(!r||!s.length)throw new Error("sendButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let o=n.formatPhoneNumberToWhatsappPattern(e),a=s?.map(u=>{let c={display_text:u.label},g;switch(true){case !!u.url:g="cta_url",c.url=u.url;break;case !!u.copy:g="cta_copy",c.copy_code=u.copy;break;case !!u.tel:g="cta_call",c.phone_number=u.tel;break;case !!u.email:g="cta_email",c.email=u.email;break;case !!(u.reminderOn||u.reminderDate):g="cta_reminder";let{reminderOn:p,reminderDate:d}=u;c.reminder_name=u.reminderName,c.reminder_timestamp=d?Math.floor(+new Date(d)/1e3):Math.floor(Date.now()/1e3)+H(p??"0s");break;default:g="";break}return {name:g,buttonParamsJson:JSON.stringify(c)}}).filter(u=>u.name),i=se.generateWAMessageFromContent(o,{viewOnceMessage:{message:{interactiveMessage:se.WAProto.Message.InteractiveMessage.create({...r&&{body:se.WAProto.Message.InteractiveMessage.Body.create({text:r})},...t&&{footer:se.WAProto.Message.InteractiveMessage.Footer.create({text:t})},...!!a?.length&&{nativeFlowMessage:se.WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})}})}}},{userJid:o});return this.debug&&this.logger?.debug("WHATSAPP","send buttons message",{jid:o,footer:t,body:r,buttons:a}),this.socket?.relayMessage(o,i.message,{messageId:i.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:r,buttons:s}){if(!t||!s.length)throw new Error("sendReplyButtonsMessage: No title or buttons required field found.");await this.ensureSocketConnected();let o=n.formatPhoneNumberToWhatsappPattern(e),a=s.filter(i=>i).map((i,u)=>typeof i=="string"?{buttonId:`id-${u}`,buttonText:{displayText:i},type:1}:{buttonId:`${i.id}`,buttonText:{displayText:i.label},type:1});return this.debug&&this.logger?.debug("WHATSAPP","send reply buttons message",{jid:o,text:t,footer:r,buttons:a}),this.socket?.sendMessage(o,{text:t,...r&&{footer:r},buttons:a})}async sendLocation(e,{latitude:t,longitude:r,name:s,address:o}){if(t===void 0||r===void 0)throw new Error("sendLocation: latitude and longitude are required fields.");if(t<-90||t>90)throw new Error("sendLocation: latitude must be between -90 and 90.");if(r<-180||r>180)throw new Error("sendLocation: longitude must be between -180 and 180.");await this.ensureSocketConnected();let a=n.formatPhoneNumberToWhatsappPattern(e);return this.debug&&this.logger?.debug("WHATSAPP","send location message",{jid:a,latitude:t,longitude:r,name:s,address:o}),this.socket?.sendMessage(a,{location:{degreesLatitude:t,degreesLongitude:r,...s&&{name:s},...o&&{address:o}}})}};var v=class n extends C{constructor(e){super(e);}async sendFileFromStream(e,t,r){await this.ensureSocketConnected();let s=n.formatPhoneNumberToWhatsappPattern(e),o=t instanceof Buffer?t:await this.streamToBuffer(t),a=r.mimetype||this.getMimetypeFromFilename(r.filename),i=await this.createFileMessage(o,a,r),u={...r.replyToMessageId&&{quoted:{key:{id:r.replyToMessageId}}}};return this.socket?.sendMessage(s,i,u)}async streamToBuffer(e){return new Promise((t,r)=>{let s=[];e.on("data",o=>s.push(Buffer.from(o))),e.on("error",o=>r(o)),e.on("end",()=>t(Buffer.concat(s)));})}getMimetypeFromFilename(e){let t=e.split(".").pop()?.toLowerCase();return j[t||""]||"application/octet-stream"}async createFileMessage(e,t,r){let[s]=t.split("/");switch(s){case "image":return {image:e,caption:r.caption,mimetype:t,fileName:r.filename};case "video":return {video:e,caption:r.caption,mimetype:t,fileName:r.filename,gifPlayback:r.gifPlayback||false,jpegThumbnail:r.jpegThumbnail,...r.seconds&&{seconds:r.seconds}};case "audio":return r.ptt?{audio:e,mimetype:"audio/ogg; codecs=opus",ptt:true,...r.seconds&&{seconds:r.seconds}}:{audio:e,mimetype:t,fileName:r.filename,...r.seconds&&{seconds:r.seconds}};default:return {document:e,mimetype:t,fileName:r.filename,caption:r.caption,jpegThumbnail:r.jpegThumbnail}}}async sendImage(e,t,r={}){return this.sendFileFromStream(e,t,{filename:r.filename||"image.jpg",caption:r.caption,replyToMessageId:r.replyToMessageId})}async sendVideo(e,t,r={}){return this.sendFileFromStream(e,t,{filename:r.filename||"video.mp4",caption:r.caption,gifPlayback:r.gifPlayback,replyToMessageId:r.replyToMessageId,jpegThumbnail:r.jpegThumbnail})}async sendAudio(e,t,r={}){return this.sendFileFromStream(e,t,{filename:r.filename||"audio.mp3",mimetype:r.ptt?"audio/ogg; codecs=opus":"",ptt:r.ptt,seconds:r.seconds,replyToMessageId:r.replyToMessageId})}async sendDocument(e,t,r){return this.sendFileFromStream(e,t,{filename:r.filename,mimetype:r.mimetype,caption:r.caption,replyToMessageId:r.replyToMessageId,jpegThumbnail:r.jpegThumbnail})}async sendVoiceNote(e,t,r={}){return this.sendAudio(e,t,{ptt:true,seconds:r.seconds,replyToMessageId:r.replyToMessageId})}async sendSticker(e,t,r={}){await this.ensureSocketConnected();let s=n.formatPhoneNumberToWhatsappPattern(e),o=t instanceof Buffer?t:await this.streamToBuffer(t),a={...r.replyToMessageId&&{quoted:{key:{id:r.replyToMessageId}}}};return this.socket?.sendMessage(s,{sticker:o},a)}};var I=class n extends v{constructor(e){super(e);}async sendImageMessage(e,t,{caption:r="",filename:s}={}){await this.ensureSocketConnected();let o=n.formatPhoneNumberToWhatsappPattern(e),a=typeof t=="string"?await l(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send image message",{jid:o,caption:r,filename:s}),await this.sendImage(o,a,{caption:r,...s&&{filename:s}})}async sendVideoMessage(e,t,{caption:r="",filename:s,sendAsGifPlayback:o=false}={}){await this.ensureSocketConnected();let a=n.formatPhoneNumberToWhatsappPattern(e),i=typeof t=="string"?await l(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send video message",{jid:a,caption:r,filename:s,gifPlayback:o}),await this.sendVideo(a,i,{caption:r,gifPlayback:o,...s&&{filename:s}})}async sendFileMessage(e,t,{caption:r="",mimetype:s="application/vnd.openxmlformats-officedocument.wordprocessingml.document",replyToMessageId:o,jpegThumbnailSrc:a,filename:i}={}){await this.ensureSocketConnected();let u=n.formatPhoneNumberToWhatsappPattern(e),c=typeof t=="string"?await l(t):t,g;typeof a=="string"?g=await l(a):a instanceof ie.ReadStream?g=await L(a):g=a;let p="mu-document";if(t instanceof ie.ReadStream){let d=q(t);d&&(p=d);}else typeof t=="string"&&(p=path.basename(t));return this.debug&&this.logger?.debug("WHATSAPP","send file message",{jid:u,caption:r,mimetype:s,filename:p,replyToMessageId:o,includeJpegThumbnail:!!g}),await this.sendDocument(u,c,{caption:r,mimetype:s,filename:p,replyToMessageId:o,jpegThumbnail:g})}async sendAudioMessage(e,t,{filename:r,replyToMessageId:s,mimetype:o,seconds:a}={}){await this.ensureSocketConnected();let i=n.formatPhoneNumberToWhatsappPattern(e),u=typeof t=="string"?await l(t):t,c=a||await U(u,o).catch(()=>0);return this.debug&&this.logger?.debug("WHATSAPP","send audio message",{jid:i,mimetype:o,filename:r,seconds:c,replyToMessageId:s}),await this.sendAudio(i,u,{...r&&{filename:r},...o&&{mimetype:o},...c&&{seconds:c},...s&&{replyToMessageId:s}})}async sendStickerMessage(e,t,{replyToMessageId:r}={}){await this.ensureSocketConnected();let s=n.formatPhoneNumberToWhatsappPattern(e),o=typeof t=="string"?await l(t):t;return this.debug&&this.logger?.debug("WHATSAPP","send sticker message",{jid:s,replyToMessageId:r}),await this.sendSticker(s,o,{replyToMessageId:r})}};var $=class extends I{constructor(e){super(e);}};var G=class n extends f{static formatGroupId(e){return e.endsWith("@g.us")?e:`${e.replace(/@s\.whatsapp\.net|@g\.us/g,"")}@g.us`}static isGroupId(e){return e.endsWith("@g.us")}constructor(e){super(e);}async createGroup({name:e,participants:t,description:r}){if(!e)throw new Error("createGroup: Group name is required.");await this.ensureSocketConnected();let s=(t??[]).map(a=>n.formatPhoneNumberToWhatsappPattern(a));if(s.length===0){let a=this.socket?.user?.id;if(!a)throw new Error("createGroup: Could not get bot user ID. Make sure socket is connected.");let i=n.formatPhoneNumberToWhatsappPattern(a);s.push(i),this.debug&&this.logger?.debug("WHATSAPP","No participants provided, creating group with self only",{selfJid:a});}this.debug&&this.logger?.debug("WHATSAPP","Creating group",{name:e,description:r,participants:s});let o=await this.socket?.groupCreate(e,s);if(r&&o?.id){let a=n.formatGroupId(o.id);await this.updateGroupDescription(a,r);}return o}async updateGroupName(e,t){if(!e||!t)throw new Error("updateGroupName: Group ID and new name are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group name",{groupId:r,newName:t}),this.socket?.groupUpdateSubject(r,t)}async updateGroupDescription(e,t,r=false){if(!e)throw new Error("updateGroupDescription: Group ID is required.");await this.ensureSocketConnected();let s=n.formatGroupId(e);return r&&await this.socket?.groupMetadata(s).then(o=>{this.debug&&this.logger?.debug("WHATSAPP","Fetch group description metadata",o);}).catch(o=>{this.debug&&this.logger?.warn("WHATSAPP","Failed to update group description metadata",{error:o});}),this.debug&&this.logger?.debug("WHATSAPP","Updating group description",{groupId:s}),this.socket?.groupUpdateDescription(s,t||"")}async updateGroupSettings(e,t){if(!e||!t)throw new Error("updateGroupSettings: Group ID and setting are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group settings",{groupId:r,setting:t}),this.socket?.groupSettingUpdate(r,t)}async updateGroupParticipants(e,t,r){if(!e)throw new Error("addParticipants: Group ID is required.");let s=[].concat(t).filter(i=>i);if(!s?.length)return;await this.ensureSocketConnected();let o=n.formatGroupId(e),a=s.map(i=>n.formatPhoneNumberToWhatsappPattern(i));return this.debug&&this.logger?.debug("WHATSAPP",`${r} participants to group`,{groupId:o,participantsCount:a.length}),this.socket?.groupParticipantsUpdate(o,a,r)}async addParticipants(e,t){return this.updateGroupParticipants(e,t,"add")}async removeParticipants(e,t){return this.updateGroupParticipants(e,t,"remove")}async promoteToAdmin(e,t){return this.updateGroupParticipants(e,t,"promote")}async demoteFromAdmin(e,t){return this.updateGroupParticipants(e,t,"demote")}async leaveGroup(e){if(!e)throw new Error("leaveGroup: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Leaving group",{groupId:t}),this.socket?.groupLeave(t)}async getGroupMetadata(e){if(!e)throw new Error("getGroupMetadata: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Fetching group metadata",{groupId:t}),this.socket?.groupMetadata(t)}async getAllGroups(){await this.ensureSocketConnected(),this.debug&&this.logger?.debug("WHATSAPP","Fetching all groups");let e=await this.socket?.groupFetchAllParticipating();return e?Object.values(e):[]}async getGroupInviteCode(e,t){if(!e)throw new Error("getGroupInviteCode: Group ID is required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);this.debug&&this.logger?.debug("WHATSAPP","Fetching group invite code",{groupId:r});let s=await this.socket?.groupInviteCode(r);return t&&s?`https://chat.whatsapp.com/${s}`:s}async revokeGroupInviteCode(e){if(!e)throw new Error("revokeGroupInviteCode: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Revoking group invite code",{groupId:t}),this.socket?.groupRevokeInvite(t)}async joinGroupViaInvite(e){if(!e)throw new Error("joinGroupViaInvite: Invite code is required.");return await this.ensureSocketConnected(),this.debug&&this.logger?.debug("WHATSAPP","Joining group via invite",{inviteCode:e}),this.socket?.groupAcceptInvite(e)}async getGroupInfoFromInvite(e){if(!e)throw new Error("getGroupInfoFromInvite: Invite code is required.");return await this.ensureSocketConnected(),this.debug&&this.logger?.debug("WHATSAPP","Fetching group info from invite",{inviteCode:e}),this.socket?.groupGetInviteInfo(e)}async updateGroupProfilePicture(e,t){if(!e||!t)throw new Error("updateGroupProfilePicture: Group ID and image buffer are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Updating group profile picture",{groupId:r}),this.socket?.updateProfilePicture(r,t)}async removeGroupProfilePicture(e){if(!e)throw new Error("removeGroupProfilePicture: Group ID is required.");await this.ensureSocketConnected();let t=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Removing group profile picture",{groupId:t}),this.socket?.removeProfilePicture(t)}async getGroupProfilePicture(e,t=false){if(!e)throw new Error("getGroupProfilePicture: Group ID is required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Fetching group profile picture",{groupId:r,highRes:t}),this.socket?.profilePictureUrl(r,t?"image":"preview").catch(s=>{if(s.message==="item-not-found")return null;throw s})}};var B=class n extends G{constructor(e){super(e);}async sendTextMessage(e,t,r){if(!e||!t)throw new Error("sendTextMessage: Group ID and text are required.");await this.ensureSocketConnected();let s=n.formatGroupId(e),o={};return r?.replyToMessageId&&(o.quoted={key:{id:r.replyToMessageId}}),this.debug&&this.logger?.debug("WHATSAPP","Sending text message to group",{groupId:s,textLength:t.length,hasMentions:!!r?.mentions?.length}),this.socket?.sendMessage(s,{text:t},o)}async sendButtonsMessage(e,{title:t,subtitle:r,buttons:s}){if(!e||!t||!s?.length)throw new Error("sendButtonsMessage: Group ID, title, and buttons are required.");await this.ensureSocketConnected();let o=n.formatGroupId(e),a=s?.map(u=>{let c={display_text:u.label},g;switch(true){case !!u.url:g="cta_url",c.url=u.url;break;case !!u.copy:g="cta_copy",c.copy_code=u.copy;break;case !!u.tel:g="cta_call",c.phone_number=u.tel;break;default:g="";break}return {name:g,buttonParamsJson:JSON.stringify(c)}}).filter(u=>u.name),i=se.generateWAMessageFromContent(o,{viewOnceMessage:{message:{interactiveMessage:se.WAProto.Message.InteractiveMessage.create({body:se.WAProto.Message.InteractiveMessage.Body.create({text:t}),...r&&{footer:se.WAProto.Message.InteractiveMessage.Footer.create({text:r})},nativeFlowMessage:se.WAProto.Message.InteractiveMessage.NativeFlowMessage.create({buttons:a})})}}},{userJid:o});return this.debug&&this.logger?.debug("WHATSAPP","Sending buttons message to group",{groupId:o,title:t,buttonsCount:a.length}),this.socket?.relayMessage(o,i.message,{messageId:i.key.id})}async sendReplyButtonsMessage(e,{title:t,subtitle:r,buttons:s,mentions:o}){if(!e||!t||!s?.length)throw new Error("sendReplyButtonsMessage: Group ID, title, and buttons are required.");await this.ensureSocketConnected();let a=n.formatGroupId(e),i=s.filter(c=>c).map((c,g)=>typeof c=="string"?{buttonId:`id-${g}`,buttonText:{displayText:c},type:1}:{buttonId:`${c.id}`,buttonText:{displayText:c.label},type:1}),u={text:t,buttons:i,...r&&{footer:r}};return o?.length&&(u.mentions=o.map(c=>n.formatPhoneNumberToWhatsappPattern(c))),this.debug&&this.logger?.debug("WHATSAPP","Sending reply buttons message to group",{groupId:a,title:t,buttonsCount:i.length}),this.socket?.sendMessage(a,u)}async sendImageMessage(e,t,{caption:r,mentions:s}={}){if(!e||!t)throw new Error("sendImage: Group ID and image buffer are required.");await this.ensureSocketConnected();let o=n.formatGroupId(e),a={image:t,...r&&{caption:r}};return s?.length&&(a.mentions=s.map(i=>n.formatPhoneNumberToWhatsappPattern(i))),this.debug&&this.logger?.debug("WHATSAPP","Sending image to group",{groupId:o,hasCaption:!!r}),this.socket?.sendMessage(o,a)}async sendVideoMessage(e,t,r,s){if(!e||!t)throw new Error("sendVideo: Group ID and video buffer are required.");await this.ensureSocketConnected();let o=n.formatGroupId(e),a={video:t,...r&&{caption:r}};return s?.mentions?.length&&(a.mentions=s.mentions.map(i=>n.formatPhoneNumberToWhatsappPattern(i))),this.debug&&this.logger?.debug("WHATSAPP","Sending video to group",{groupId:o,hasCaption:!!r}),this.socket?.sendMessage(o,a)}async sendAudioMessage(e,t,r){if(!e||!t)throw new Error("sendAudio: Group ID and audio buffer are required.");await this.ensureSocketConnected();let s=n.formatGroupId(e),o={audio:t,ptt:r?.ptt??false};return r?.mentions?.length&&(o.mentions=r.mentions.map(a=>n.formatPhoneNumberToWhatsappPattern(a))),this.debug&&this.logger?.debug("WHATSAPP","Sending audio to group",{groupId:s,isPTT:o.ptt}),this.socket?.sendMessage(s,o)}async sendDocumentMessage(e,t,r,s,o){if(!e||!t||!r)throw new Error("sendDocument: Group ID, document buffer, and fileName are required.");await this.ensureSocketConnected();let a=n.formatGroupId(e),i={document:t,fileName:r,...s&&{mimetype:s}};return o?.mentions?.length&&(i.mentions=o.mentions.map(u=>n.formatPhoneNumberToWhatsappPattern(u))),this.debug&&this.logger?.debug("WHATSAPP","Sending document to group",{groupId:a,fileName:r}),this.socket?.sendMessage(a,i)}async sendLocationMessage(e,t,r,s,o){if(!e||t===void 0||r===void 0)throw new Error("sendLocation: Group ID, latitude, and longitude are required.");await this.ensureSocketConnected();let a=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Sending location to group",{groupId:a,latitude:t,longitude:r}),this.socket?.sendMessage(a,{location:{degreesLatitude:t,degreesLongitude:r,...s&&{name:s},...o&&{address:o}}})}async sendMentionAll(e,t){if(!e||!t)throw new Error("sendMentionAll: Group ID and text are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e),s=await this.getGroupMetadata(r);if(!s)throw new Error("Could not fetch group metadata");let o=s.participants.map(a=>a.id);return this.debug&&this.logger?.debug("WHATSAPP","Sending mention all message to group",{groupId:r,participantsCount:o.length}),this.socket?.sendMessage(r,{text:t,mentions:o})}async sendReactionMessage(e,t,r){if(!e||!t||!r)throw new Error("sendReaction: Group ID, message ID, and emoji are required.");await this.ensureSocketConnected();let s=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Sending reaction to group message",{groupId:s,messageId:t,emoji:r}),this.socket?.sendMessage(s,{react:{text:r,key:{id:t,remoteJid:s}}})}async deleteGroupMessage(e,t){if(!e||!t)throw new Error("deleteGroupMessage: Group ID and message ID are required.");await this.ensureSocketConnected();let r=n.formatGroupId(e);return this.debug&&this.logger?.debug("WHATSAPP","Deleting message in group",{groupId:r,messageId:t}),this.socket?.sendMessage(r,{delete:{id:t,remoteJid:r,fromMe:true}})}};var K=class extends B{constructor(e){super(e);}};
|
|
3
|
+
exports.WhatsappSocket=$;exports.WhatsappSocketGroup=K;//# sourceMappingURL=index.cjs.map
|
|
3
4
|
//# sourceMappingURL=index.cjs.map
|