Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/hacxk/easy-baileys

Tired of writing complex code for simple WhatsApp bots? This Node.js module simplifies bot creation, making it accessible to all levels of developers. Harness the power of @whiskeysockets/baileys without the hassle.
https://github.com/hacxk/easy-baileys

0001 baileys code code-whatsapp-bot easy-baileys free hacxk multi-auth multi-device open-source trending-repositories whatsapp whatsapp-api whatsapp-bot whatsapp-web whiskeysockets

Last synced: about 15 hours ago
JSON representation

Tired of writing complex code for simple WhatsApp bots? This Node.js module simplifies bot creation, making it accessible to all levels of developers. Harness the power of @whiskeysockets/baileys without the hassle.

Awesome Lists containing this project

README

        

# easy-baileys πŸ€–

[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![npm version](https://img.shields.io/npm/v/easy-baileys.svg)](https://www.npmjs.com/package/easy-baileys)
[![baileys](https://img.shields.io/npm/v/baileys?logo=data:image/png;base64,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&label=baileys&color=rgb(0,165,135))](https://github.com/WhiskeySockets/Baileys)
[![GitHub Issues or Pull Requests](https://img.shields.io/github/issues-raw/hacxk/easy-baileys?logo=circle&logoColor=white)](https://github.com/hacxk/easy-baileys/issues)
[![Discord](https://img.shields.io/discord/484464227067887645.svg)](https://discord.gg/9NGwqaV5)

**easy-baileys** is a Node.js package designed to streamline WhatsApp connectivity and automate message handling, offering robust flexibility. It leverages the powerful capabilities of [@whiskeysockets/baileys](https://github.com/WhiskeySockets/Baileys).

## ✨ GIVE A STAR ON GITHUB ⭐

[easy-baileys](https://github.com/hacxk/easy-baileys)

# IF YOU FOUND ANY ISSUE OR NEED A NEW FEATURES FEEL FREE TO OPEN A ISSUE ON GITHUB

[easy-baileys](https://github.com/hacxk/easy-baileys)

## Installation πŸ“¦

```bash
npm install easy-baileys
```

## Usage πŸ› οΈ

### 1. Importing the Module

```javascript
const { WhatsAppClient } = require('easy-baileys');
```

### 2. Creating a Client Instance with MongoDB Authentication (+ Multiple Session βœ…)

```javascript
const { WhatsAppClient } = require('easy-baileys');

const customOptions = {
browser: ["Ubuntu", "Chrome", "20.0.04"],
printQRInTerminal: true, // Set to true for QR code in terminal
mobile: false,
};

async function main() {
try {
// Initialize WhatsAppClient with MongoDB authentication
const clientMongo = await WhatsAppClient.create("mongo", 'YOUR MONGO DB URI', customOptions);
const sockMongo = await clientMongo.getSocket();

// Example event listener for incoming messages
sockMongo.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
console.log(m)
if (m.message?.conversation.toLowerCase() === 'hi') {
await sockMongo.reply(m, 'Hello! πŸ‘‹');
sockMongo.sendImage()
}
}
});

} catch (error) {
console.error('Error initializing WhatsApp client with MongoDB authentication:', error.message);
}
}

main()
```

### 3. Creating a Client Instance with MySQL Authentication (+ Multiple Session βœ…)

```javascript
const { WhatsAppClient } = require('easy-baileys');

// Example MySQL configuration
const mysqlConfig = {
session: 'session1', // Required
host: 'localhost', // Required
port: 3306, // Optional
user: 'your_mysql_user', // Optional
password: 'your_mysql_password', // Optional
database: 'your_database_name', // Optional
tableName: 'auth' // Optional
};

const customOptions = {
browser: ["Ubuntu", "Chrome", "20.0.04"],
printQRInTerminal: false, // Set to true for QR code in terminal
mobile: false,
};

(async () => {
try {
// Initialize WhatsAppClient with MySQL authentication
const client = await WhatsAppClient.create("mysql", mysqlConfig, customOptions);
const sockMySQL = await client.getSocket();

// Example event listener for incoming messages
sockMySQL.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
if (m.message?.conversation.toLowerCase() === 'hi') {
await sockMySQL.reply(m, 'Hello! πŸ‘‹');
}
}
});

} catch (error) {
console.error('Error initializing WhatsApp client with MySQL authentication:', error.message);
}
})();
```

### 4. Creating a Client Instance with MultiFile Authentication

```javascript
const { WhatsAppClient } = require('easy-baileys');

const customOptions = {
browser: ["Ubuntu", "Chrome", "20.0.04"],
printQRInTerminal: false, // Set to true for QR code in terminal
mobile: false,
};

(async () => {
try {
// Initialize WhatsAppClient with MultiFile authentication
const clientMulti = await WhatsAppClient.create("multi", './authFiles', customOptions);
const sockMulti = await clientMulti.getSocket();

// Example event listener for incoming messages
sockMulti.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
if (m.message?.conversation.toLowerCase() === 'hi') {
await sockMulti.reply(m, 'Hello! πŸ‘‹');
}
}
});

} catch (error) {
console.error('Error initializing WhatsApp client with MultiFile authentication:', error.message);
}
})();
```

### Explanation

- **MongoDB Authentication Example**: Initializes the `WhatsAppClient` instance using MongoDB credentials and sets up event listeners to respond to messages.
- **MultiFile Authentication Example**: Initializes the `WhatsAppClient` instance using authentication files stored locally and handles incoming messages similarly.

### 5. Obtain a pairing code (Optional)

```javascript
const sock = client.getSocket();
const code = await client.getPairingCode(123456789); // Your WhatsApp number (Without +)
console.log(code);
```

## Example: Pairing Code with Validated Phone Number πŸ“ž

```javascript
const { WhatsAppClient } = require('easy-baileys');

(async () => {
try {
const customOptions = {
browser: ["Ubuntu", "Chrome", "20.0.04"],
printQRInTerminal: false, // Set to true for QR code in terminal
mobile: false,
};

const client = await WhatsAppClient.createMultiAuth('./auth', customOptions);
const sock = await client.getSocket();
const code = await client.getPairingCode(123456789); // Your WhatsApp number (Without +)
console.log(code); // Outputs code with validated phone number
} catch (error) {
console.error('Error initializing WhatsApp client:', error.message);
}
})();
```

## Example: Display QR Code in Terminal πŸ“±

```javascript
(async () => {
try {
const customOptions = {
// ... other options
printQRInTerminal: true,
};
const client = await WhatsAppClient.createMultiAuth('./auth', customOptions);
const sock = await client.getSocket();
} catch (error) {
console.error('Error initializing WhatsApp client:', error.message);
}
})();
```

The QR code will be printed directly in your terminal.

---

## Simple Example Code

```javascript

const { WhatsAppClient } = require('easy-baileys');

(async () => {
try {
const customOptions = {
browser: ["Ubuntu", "Chrome", "20.0.04"],
printQRInTerminal: true,
mobile: false,
};

const client = await WhatsAppClient.createMultiAuth('./hacxk', customOptions);
const conn = await client.getSocket();

conn.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
if (m.message?.conversation.toLowerCase() === 'hi') {
await conn.reply(m, 'Hello! πŸ‘‹');
}
}
});

} catch (error) {
console.error('Error initializing WhatsApp client:', error.message);
}
})();```
```

---

### Handling Message Upserts

One of the key features of `@whiskeysockets/baileys` is the ability to handle incoming messages. The library provides an event called `messages.upsert` that you can listen to for new messages. Here’s how you can set up a listener for this event:

```javascript
sock.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
console.log(m);
}
});
```

### Real-World Use Case

In a real-world scenario, you might want to do more than just log the messages. Here's an extended example that checks if the message contains text and replies to the sender:

```javascript
sock.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
console.log(m);

if (m.message && m.message.conversation) {
const sender = m.key.remoteJid;
const messageText = m.message.conversation;
console.log(`Message from ${sender}: ${messageText}`);
}
}
});
```

---

### Overview: πŸ“±πŸ’¬

The `connMessage` class provides methods to interact with WhatsApp messages, including sending various media types, replying, reacting, editing, and deleting messages.

| Function | Parameters | Description |
|----------|------------|-------------|
| `sendSticker` | `m`, `bufferOrUrl` | Sends a sticker message. |
| `sendStickerReply` | `m`, `bufferOrUrl` | Sends a sticker as a reply to a message. |
| `sendImage` | `m`, `bufferOrUrl`, `caption` | Sends an image message with an optional caption. |
| `sendImageReply` | `m`, `bufferOrUrl`, `caption` | Sends an image as a reply to a message. |
| `sendVideo` | `m`, `bufferOrUrl`, `caption` | Sends a video message with an optional caption. |
| `sendVideoReply` | `m`, `bufferOrUrl`, `caption` | Sends a video as a reply to a message. |
| `sendDocument` | `m`, `bufferOrUrl`, `mimetype`, `fileName`, `caption` | Sends a document message. |
| `sendDocumentReply` | `m`, `bufferOrUrl`, `mimetype`, `fileName`, `caption` | Sends a document as a reply to a message. |
| `sendAudio` | `m`, `bufferOrUrl`, `ptt` | Sends an audio message, optionally as push-to-talk. |
| `sendAudioReply` | `m`, `bufferOrUrl`, `ptt` | Sends an audio message as a reply, optionally as push-to-talk.
| `sendGif` | `m`, `bufferOrUrl`, `playback` | Sends a GIF message. |
| `sendGifReply` | `m`, `bufferOrUrl`, `playback` | Sends a GIF as a reply to a message. |
| `reply` | `m`, `text` | Replies to a message with text. |
| `send` | `m`, `text` | Sends a text message. |
| `react` | `m`, `emoji` | Reacts to a message with an emoji. |
| `editMsg` | `m`, `sentMessage`, `newMessage` | Edits a sent message. |
| `deleteMsgGroup` | `m` | Deletes a message in a group chat. |
| `deleteMsg` | `m` | Deletes a message. |
| `findValue` | `obj`, `targetValue`, `currentPath` | Recursively finds a path to a value in an object. |
| `findObject` | `obj`, `targetValue` | Recursively finds an object containing a specific value. |
| `add` | `groupJid`, `participantJid` | Adds a participant to a group. |
| `remove` | `groupJid`, `participantJid` | Removes a participant from a group. |
| `isAdmin` | `groupJid` | Checks if the bot is an admin in a group. |
| `updateParticipantStatus` | `groupJid`, `participantJid`, `action` | Promotes or demotes a participant in a group. |
| `updateGroupSettings` | `groupJid`, `settings` | Updates group settings. |
| `banUser` | `groupJid`, `userJid` | Bans a user from joining a group. |
| `unbanUser` | `groupJid`, `userJid` | Unbans a user from a group. |
| `generateInviteLink` | `groupJid` | Generates a new invite link for a group. |
| `revokeInviteLink` | `groupJid` | Revokes the current invite link for a group. |
| `updateGroupSubject` | `groupJid`, `newSubject` | Updates the group subject (name). |
| `updateGroupDescription` | `groupJid`, `newDescription` | Updates the group description. |
| `updateGroupMessagesSettings` | `groupJid`, `setting` | Updates who can send messages in the group. |
| `scheduleMessage` | `jid`, `content`, `sendTime` | Schedules a message to be sent at a specific time. |
| `cancelScheduledMessage` | `index` | Cancels a scheduled message. |
| `sendBulkMessage` | `jids`, `content` | Sends a message to multiple recipients. |
| `downloadMedia` | `m` | Downloads media from a message. |
| `createPoll` | `groupJid`, `question`, `options` | Creates a poll in a group chat. |
| `updateStatus` | `status` | Updates the bot's status. |

### Methods

See [API Documentation](#configuration-options-%E2%9A%99%EF%B8%8F) for detailed method explanations.

# JAVASCRIPT

1. **`sendSticker(m, bufferOrUrl)`** 🎨
- **Description**: Sends a sticker message to the given chat.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `bufferOrUrl` (`string`, `Buffer`, or `filepath`): URL, buffer, or filepath containing the sticker data.
- **Usage Example**:
```javascript
await conn.sendSticker(m, 'https://example.com/sticker.webp');
```

2. **`sendStickerReply(m, bufferOrUrl)`** πŸŽ‰
- **Description**: Sends a sticker as a reply to a specific message.
- **Parameters**: Same as `sendSticker`.
- **Usage Example**:
```javascript
await conn.sendStickerReply(m, 'https://example.com/sticker.webp');
```

3. **`sendImage(m, bufferOrUrl, caption)`** πŸ–ΌοΈ
- **Description**: Sends an image message with an optional caption.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `bufferOrUrl` (`string`, `Buffer`, or `filepath`): URL, buffer, or filepath containing the image data.
- `caption` (`string`): Optional caption for the image.
- **Usage Example**:
```javascript
await conn.sendImage(m, 'https://example.com/image.jpg', 'Beautiful scenery!');
```

4. **`sendImageReply(m, bufferOrUrl, caption)`** πŸŒ„
- **Description**: Sends an image as a reply to a specific message.
- **Parameters**: Same as `sendImage`.
- **Usage Example**:
```javascript
await conn.sendImageReply(m, 'https://example.com/image.jpg', 'Replying with an image.');
```

5. **`sendVideo(m, bufferOrUrl, caption)`** πŸ“Ή
- **Description**: Sends a video message with an optional caption.
- **Parameters**: Same as `sendImage`.
- **Usage Example**:
```javascript
await conn.sendVideo(m, 'https://example.com/video.mp4', 'Check out this video!');
```

6. **`sendVideoReply(m, bufferOrUrl, caption)`** πŸŽ₯
- **Description**: Sends a video as a reply to a specific message.
- **Parameters**: Same as `sendVideo`.
- **Usage Example**:
```javascript
await conn.sendVideoReply(m, 'https://example.com/video.mp4', 'Replying with a video.');
```

7. **`sendDocument(m, bufferOrUrl, mimetype, fileName, caption)`** πŸ“„
- **Description**: Sends a document (file) message with an optional caption.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `bufferOrUrl` (`string`, `Buffer`, or `filepath`): URL, buffer, or filepath containing the document data.
- `mimetype` (`string`): MIME type of the document.
- `fileName` (`string`): Name of the file.
- `caption` (`string`): Optional caption for the document.
- **Usage Example**:
```javascript
await conn.sendDocument(m, 'https://example.com/document.pdf', 'application/pdf', 'document.pdf', 'Check out this document!');
```

8. **`sendDocumentReply(m, bufferOrUrl, mimetype, fileName, caption)`** πŸ“
- **Description**: Sends a document as a reply to a specific message.
- **Parameters**: Same as `sendDocument`.
- **Usage Example**:
```javascript
await conn.sendDocumentReply(m, 'https://example.com/document.pdf', 'application/pdf', 'document.pdf', 'Replying with a document.');
```

9. **`sendAudio(m, bufferOrUrl, ptt)`** 🎡
- **Description**: Sends an audio message or voice note.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `bufferOrUrl` (`string`, `Buffer`, or `filepath`): URL, buffer, or filepath containing the audio data.
- `ptt` (`boolean`): Whether the audio is a voice note (push-to-talk).
- **Usage Example**:
```javascript
await conn.sendAudio(m, 'https://example.com/audio.mp3', true);
```

10. **`sendAudioReply(m, bufferOrUrl, ptt)`** 🎀
- **Description**: Sends an audio message as a reply to a specific message.
- **Parameters**: Same as `sendAudio`.
- **Usage Example**:
```javascript
await conn.sendAudioReply(m, 'https://example.com/audio.mp3', true);
```

11. **`sendGif(m, bufferOrUrl, playback)`** 🎬
- **Description**: Sends a GIF message.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `bufferOrUrl` (`string`, `Buffer`, or `filepath`): URL, buffer, or filepath containing the GIF data.
- `playback` (`boolean`): Whether to enable GIF playback.
- **Usage Example**:
```javascript
await conn.sendGif(m, 'https://example.com/animated.gif', true);
```

12. **`sendGifReply(m, bufferOrUrl, playback)`** 🎞️
- **Description**: Sends a GIF as a reply to a specific message.
- **Parameters**: Same as `sendGif`.
- **Usage Example**:
```javascript
await conn.sendGifReply(m, 'https://example.com/animated.gif', true);
```

13. **`reply(m, text)`** πŸ’¬
- **Description**: Replies to a message with text.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `text` (`string`): Text message to reply with.
- **Usage Example**:
```javascript
await conn.reply(m, 'Your reply message.');
```

14. **`send(m, text)`** βœ‰οΈ
- **Description**: Sends a text message to a chat.
- **Parameters**: Same as `reply`.
- **Usage Example**:
```javascript
await conn.send(m, 'Your message.');
```

15. **`react(m, emoji)`** 🎭
- **Description**: Reacts to a message with an emoji.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `emoji` (`string`): Emoji reaction.
- **Usage Example**:
```javascript
await conn.react(m, 'πŸ˜„');
```

16. **`editMsg(m, sentMessage, newMessage)`** πŸ“
- **Description**: Edits a previously sent message with a new message.
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- `sentMessage` (`object`): Previously sent message object.
- `newMessage` (`string`): New message content.
- **Usage Example**:
```javascript
await conn.editMsg(m, sentMessage, 'Updated message.');
```

17. **`deleteMsgGroup(m)`** πŸ—‘οΈ
- **Description**: Deletes a message in a group chat (requires admin privileges).
- **Parameters**:
- `m` (`object`): Message object containing chat information.
- **Usage Example**:
```javascript
await conn.deleteMsgGroup(m);
```

18. **`deleteMsg(m)`** 🚫
- **Description**: finds a path in an object where a specified value is located.
- **Parameters**: Same as `deleteMsgGroup`.
- **Usage Example**:
```javascript
await conn.deleteMsg(m);
```

19. **`findValue(m, theValue)`** 🚫
- **Description**: Deletes a message (self-message or sent to you).
- **Usage Example**:
```javascript
await conn.findValue(m, 'image/jpeg'); // This will find current object path that value is image/jpeg
```

### `add(groupJid, participantJid)` βž•

**Description:** Invites a specified participant to join a WhatsApp group. Requires admin privileges.

**Parameters:**

* `groupJid` (string): The group's JID (e.g., `[email protected]`).
* `participantJid` (string): The participant's JID (e.g., `[email protected]`).

# TYPESCRIPT

# ConnMessage Class Documentation Typescript

The `ConnMessage` class extends the functionality of the `WASocket` class from the `@whiskeysockets/baileys` library, providing a variety of methods for sending different types of messages in a WhatsApp chat application.

## Table of Contents
1. [sendTextMessage](#sendTextMessage)
2. [reply](#reply)
3. [react](#react)
4. [send](#send)
5. [sendImage](#sendImage)
6. [sendImageReply](#sendImageReply)
7. [sendVideo](#sendVideo)
8. [sendVideoReply](#sendVideoReply)
9. [sendDocument](#sendDocument)
10. [sendDocumentReply](#sendDocumentReply)
11. [sendSticker](#sendSticker)
12. [sendStickerReply](#sendStickerReply)
13. [sendGIF](#sendGIF)
14. [sendGIFReply](#sendGIFReply)
15. [sendAudio](#sendAudio)
16. [sendAudioReply](#sendAudioReply)
17. [sendContact](#sendContact)
18. [sendContactReply](#sendContactReply)
19. [sendPoll](#sendPoll)
20. [sendPollReply](#sendPollReply)
21. [editMessage](#editMessage)
22. [deleteMessage](#deleteMessage)
23. [sendLocation](#sendLocation)
24. [sendLocationReply](#sendLocationReply)
25. [sendLiveLocation](#sendLiveLocation)
26. [sendButton](#sendButton)
27. [sendListMessage](#sendListMessage)
28. [sendTemplateMessage](#sendTemplateMessage)

## Method Descriptions

### sendTextMessage

Sends a simple text message to a specified JID (WhatsApp ID).

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `text: string` - The message text to send

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendTextMessage("[email protected]", "Hello, World!");
```

### reply

Replies to a received message with a text message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `text: string` - The reply text

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.reply(receivedMessage, "Thanks for your message!");
```

### react

Sends a reaction to a message using an emoji.

**Arguments:**
- `m: proto.IWebMessageInfo` - The message to react to
- `emoji: string` - The emoji to use as a reaction

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.react(receivedMessage, "πŸ‘");
```

### send

A generic method to send any type of content to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `content: AnyMessageContent` - The content to send
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.send("[email protected]", { text: "Hello" }, { ephemeralExpiration: 86400 });
```

### sendImage

Sends an image to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `image: WAMediaUpload` - The image to send
- `caption?: string` - Optional caption for the image
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendImage("[email protected]", "./image.jpg", "Check out this picture!");
```

### sendImageReply

Sends an image as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `image: WAMediaUpload` - The image to send
- `caption?: string` - Optional caption for the image
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendImageReply(receivedMessage, "./image.jpg", "Here's the image you requested.");
```

### sendVideo

Sends a video to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `video: WAMediaUpload` - The video to send
- `caption?: string` - Optional caption for the video
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendVideo("[email protected]", "./video.mp4", "Check out this video!");
```

### sendVideoReply

Sends a video as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `video: WAMediaUpload` - The video to send
- `caption?: string` - Optional caption for the video
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendVideoReply(receivedMessage, "./video.mp4", "Here's the video you asked for.");
```

### sendDocument

Sends a document to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `document: WAMediaUpload` - The document to send
- `filename: string` - The filename for the document
- `mimeType: string` - The MIME type of the document
- `caption?: string` - Optional caption for the document
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendDocument("[email protected]", "./document.pdf", "report.pdf", "application/pdf", "Monthly Report");
```

### sendDocumentReply

Sends a document as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `document: WAMediaUpload` - The document to send
- `filename: string` - The filename for the document
- `mimeType: string` - The MIME type of the document
- `caption?: string` - Optional caption for the document
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendDocumentReply(receivedMessage, "./document.pdf", "report.pdf", "application/pdf", "Here's the report you requested.");
```

### sendSticker

Sends a sticker to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `sticker: WAMediaUpload` - The sticker to send
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendSticker("[email protected]", "./sticker.webp");
```

### sendStickerReply

Sends a sticker as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `sticker: WAMediaUpload` - The sticker to send
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendStickerReply(receivedMessage, "./sticker.webp");
```

### sendGIF

Sends a GIF to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `gif: WAMediaUpload` - The GIF to send
- `caption?: string` - Optional caption for the GIF
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendGIF("[email protected]", "./animation.gif", "Check out this cool GIF!");
```

### sendGIFReply

Sends a GIF as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `gif: WAMediaUpload` - The GIF to send
- `caption?: string` - Optional caption for the GIF
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendGIFReply(receivedMessage, "./animation.gif", "Here's a funny GIF for you!");
```

### sendAudio

Sends an audio file to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `audio: WAMediaUpload` - The audio file to send
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendAudio("[email protected]", "./audio.mp3");
```

### sendAudioReply

Sends an audio file as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `audio: WAMediaUpload` - The audio file to send
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendAudioReply(receivedMessage, "./audio.mp3");
```

### sendContact

Sends a contact card to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `contact: { name: string, number: string }` - The contact information
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendContact("[email protected]", { name: "John Doe", number: "+1234567890" });
```

### sendContactReply

Sends a contact card as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `contact: { name: string, number: string }` - The contact information
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendContactReply(receivedMessage, { name: "Jane Doe", number: "+9876543210" });
```

### sendPoll

Sends a poll to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `name: string` - The question or title of the poll
- `values: string[]` - An array of poll options
- `selectableCount?: number` - Optional number of selectable options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendPoll("[email protected]", "What's your favorite color?", ["Red", "Blue", "Green"], 1);
```

### sendPollReply

Sends a poll as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `name: string` - The question or title of the poll
- `values: string[]` - An array of poll options
- `selectableCount?: number` - Optional number of selectable options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendPollReply(receivedMessage, "What's your favorite fruit?", ["Apple", "Banana", "Orange"], 2);
```

### editMessage

Edits a previously sent message.

**Arguments:**
- `jid: string` - The chat's WhatsApp ID
- `m: proto.IWebMessageInfo` - The message to edit
- `newContent: string | { text?: string, caption?: string }` - The new content for the message

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.editMessage("[email protected]", sentMessage, "Updated message content");
```

### deleteMessage

Deletes a message.

**Arguments:**
- `jid: string` - The chat's WhatsApp ID
- `m: proto.IWebMessageInfo` - The message to delete

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.deleteMessage("[email protected]", messageToDelete);
```

### sendLocation

Sends a location to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `latitude: number` - The latitude of the location
- `longitude: number` - The longitude of the location
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendLocation("[email protected]", 40.7128, -74.0060);
```

### sendLocationReply

Sends a location as a reply to a received message.

**Arguments:**
- `m: proto.IWebMessageInfo` - The received message to reply to
- `latitude: number` - The latitude of the location
- `longitude: number` - The longitude of the location
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendLocationReply(receivedMessage, 51.5074, -0.1278);
```

### sendLiveLocation

Sends a live location to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `latitude: number` - The latitude of the location
- `longitude: number` - The longitude of the location
- `durationMs: number` - The duration of the live location in milliseconds
- `options?: MiscMessageGenerationOptions & { comment?: string }` - Optional message generation options and comment

**Returns:** `Promise`

**Example:**
```typescript
const result = await sock.sendLiveLocation("[email protected]", 40.7128, -74.0060, 3600000, { comment: "I'm here!" });
```

### sendButton

Sends a message with buttons to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `contentText: string` - The main text content of the message
- `buttons: proto.Message.ButtonsMessage.IButton[]` - An array of button objects
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const buttons = [
{ buttonId: '1', buttonText: { displayText: 'Button 1' }, type: 1 },
{ buttonId: '2', buttonText: { displayText: 'Button 2' }, type: 1 },
];
const result = await sock.sendButton("[email protected]", "Please choose an option:", buttons);
```

### sendListMessage

Sends a list message to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `message: proto.Message.ListMessage` - The list message object
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const listMessage: proto.Message.ListMessage = {
title: "Menu",
description: "Please select an item",
buttonText: "View Menu",
listType: 1,
sections: [
{
title: "Section 1",
rows: [
{ title: "Option 1", description: "Description for Option 1" },
{ title: "Option 2", description: "Description for Option 2" },
],
},
],
};
const result = await sock.sendListMessage("[email protected]", listMessage);
```

### sendTemplateMessage

Sends a template message with buttons to a specified JID.

**Arguments:**
- `jid: string` - The recipient's WhatsApp ID
- `content: Templatable` - The content object containing text, footer, and template buttons
- `options?: MiscMessageGenerationOptions` - Optional message generation options

**Returns:** `Promise`

**Example:**
```typescript
const templateContent: Templatable = {
text: "Hello! Please choose an option:",
footer: "Footer text",
templateButtons: [
{ index: 1, urlButton: { displayText: "Visit Website", url: "https://example.com" } },
{ index: 2, callButton: { displayText: "Call us", phoneNumber: "+1234567890" } },
{ index: 3, quickReplyButton: { displayText: "Quick Reply", id: "quick-reply-id" } },
],
};
const result = await sock.sendTemplateMessage("[email protected]", templateContent);
```

**Example:**

```javascript
try {
await conn.add('[email protected]', '[email protected]');
console.log('Participant added successfully!');
} catch (err) {
console.error(`Failed to add participant: ${err.message}`);
}
```

### `remove(groupJid, participantJid)` βž–

**Description:** Removes a specified participant from a WhatsApp group. Requires admin privileges.

**Parameters:**

* `groupJid` (string): The group's JID (e.g., `[email protected]`).
* `participantJid` (string): The participant's JID (e.g., `[email protected]`).

**Example:**

```javascript
try {
await conn.remove('[email protected]', '[email protected]');
console.log('Participant removed successfully!');
} catch (err) {
console.error(`Failed to remove participant: ${err.message}`);
}
```

--------------------------------------------------------------

# Setting Up Commands with easy-baileys

To create and manage commands for your WhatsApp bot using `easy-baileys`, follow these steps:

1. **Import `loadCommands` and `getCommand`** from `easy-baileys` to manage your bot commands:

```javascript
const { loadCommands, getCommand } = require('easy-baileys');
```

2. **Loading Commands:**

Use `loadCommands` to load commands from a specified directory. Example:

```javascript
// Load commands from the specified directory
await loadCommands('./commands');
```

3. **Handling Commands:**

Use `getCommand` to retrieve and execute commands based on incoming messages. Example:

```javascript
// Listen for new messages
sock.ev.on("messages.upsert", async ({ messages }) => {
for (const m of messages) {
const { message } = m;
const messageTypes = ['extendedTextMessage', 'conversation', 'imageMessage', 'videoMessage'];

// Extract text from the message if it matches any of the specified types
let text = messageTypes.reduce((acc, type) =>
acc || (message[type] && (message[type].text || message[type].caption || message[type])) || '', '');

// Convert the extracted text to lowercase for processing
const response = text.toLowerCase();
const prefix = ['!']; // Prefixes to identify commands

// Check if the message starts with the prefix
if (!prefix.some(p => response.startsWith(p))) {
continue;
}

// Parse command name and arguments
const [commandName, ...args] = response.slice(prefix.length).trim().split(/\s+/);

// Get the corresponding command handler
const command = await getCommand(commandName);

// If the command is not found, log and continue
if (!command) {
console.log(`Command not found: ${commandName}`);
continue;
}

// Execute the command
try {
await command.execute(sock, m, args);
} catch (cmdError) {
console.error(`Error executing command '${commandName}':`, cmdError.message);
}
}
});
```

### Example Command File Structure

Here's an example structure for a `Ping` command (`command/Ping.js`):

```javascript
module.exports = {
usage: ["ping"],
desc: "Checks the bot's response time.",
commandType: "Bot",
isGroupOnly: false,
isAdminOnly: false,
isPrivateOnly: false,
emoji: 'πŸ“', // Ping pong emoji for fun

async execute(sock, m) {
try {
// Get the timestamp before sending the message
const startTime = Date.now();
const latency = Date.now() - startTime;
await sock.reply(m, `πŸš€ Pong! ${latency}ms`);
} catch (error) {
await sock.reply(m, "❌ An error occurred while checking the ping: " + error);
}
}
};
```

### Command Metadata Explanation:

- **`usage`:** Array of strings defining how users can invoke the command.
- **`desc`:** Brief description of what the command does.
- **`commandType`:** Type of command (e.g., Bot, Admin).
- **`isGroupOnly`:** Whether the command works only in group chats.
- **`isAdminOnly`:** Whether the command is restricted to admins.
- **`isPrivateOnly`:** Whether the command can only be used in private chats.
- **`emoji`:** Emoji associated with the command for visual appeal.

Now you're all set to create and manage commands for your WhatsApp bot using `easy-baileys`! πŸš€βœ¨

### Configuration Options βš™οΈ

- `browser`: An array specifying the browser information (e.g., `["Ubuntu", "Chrome", "20.0.04"]`).
- `printQRInTerminal`: (Boolean) Display the QR code in the terminal (default: `false`).
- `mobile`: (Boolean) Set to `true` if connecting from a mobile device.
- **Refer to the `@whiskeysockets/baileys` documentation for additional options.**

## Contributing 🀝

Contributions are welcome! Please feel free to submit issues and pull requests.

## Thanks to

[![WhiskeySockets](https://github.com/WhiskeySockets.png?size=100)](https://github.com/WhiskeySockets/Baileys)
[![bobslavtriev](https://github.com/bobslavtriev.png?size=100)](https://github.com/bobslavtriev/mysql-baileys)

## License πŸ“„

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.