Skip to content

itsliaaa/baileys

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🌱 @itsliaaa/baileys

Logo

Enhanced Baileys v7 with fixed newsletter media upload, plus support for interactive messages, albums, and more message types.

β˜• For donation: Saweria

✨ Highlights

This fork designed for production use with a focus on clarity and safety:

  • 🚫 No obfuscation. Easy to read and audit.
  • 🚫 No auto-follow channel (newsletter) behavior.

βš™οΈ Changes

πŸ› οΈ Internal Adjustments

  • πŸ–ΌοΈ Fixed an issue where media could not be sent to newsletters due to an upstream issue.
  • πŸ“ Reintroduced makeInMemoryStore with a minimal ESM adaptation and small adjustments for Baileys v7.
  • πŸ“¦ Switched FFmpeg execution from exec to spawn for safer process handling.
  • πŸ—ƒοΈ Added @napi-rs/image as a supported image processing backend in getImageProcessingLibrary(), offering a balance between performance and compatibility.

πŸ“¨ Message Handling & Compatibility

🧩 Additional Message Options

Note

πŸ“„ This project is maintained with limited scope and is not intended to replace upstream Baileys.

😞 And, really sorry for my bad english.

πŸ“₯ Installation

  • πŸ“„ Via package.json
# NPM
"dependencies": {
   "@itsliaaa/baileys": "latest"
}

# GitHub
"dependencies": {
   "@itsliaaa/baileys": "github:itsliaaa/baileys"
}
  • ⌨️ Via terminal
# NPM
npm i @itsliaaa/baileys@latest

# GitHub
npm i github:itsliaaa/baileys

🧩 Import (ESM & CJS)

// --- ESM
import { makeWASocket } from '@itsliaaa/baileys'

// --- CJS (tested and working on Node.js 24 βœ…)
const { makeWASocket } = require('@itsliaaa/baileys')

πŸ”§ Usage

🌐 Connect to WhatsApp (Quick Step)

import { makeWASocket, delay, DisconnectReason, useMultiFileAuthState } from '@itsliaaa/baileys'
import { Boom } from '@hapi/boom'
import pino from 'pino'

// --- Connect with pairing code
const myPhoneNumber = '6288888888888'

const logger = pino({ level: 'silent' })

const connectToWhatsApp = async () => {
   const { state, saveCreds } = await useMultiFileAuthState('session')
    
   const sock = makeWASocket({
      logger,
      auth: state
   })

   sock.ev.on('creds.update', saveCreds)

   sock.ev.on('connection.update', (update) => {
      const { connection, lastDisconnect } = update
      if (connection === 'connecting' && !sock.authState.creds.registered) {
         await delay(1500)
         const code = await sock.requestPairingCode(myPhoneNumber)
         console.log('πŸ”— Pairing code', ':', code)
      }
      else if (connection === 'close') {
         const shouldReconnect = new Boom(connection?.lastDisconnect?.error)?.output?.statusCode !== DisconnectReason.loggedOut
         console.log('⚠️ Connection closed because', lastDisconnect.error, ', reconnecting ', shouldReconnect)
         if (shouldReconnect) {
            connectToWhatsApp()
         }
      }
      else if (connection === 'open') {
         console.log('βœ… Successfully connected to WhatsApp')
      }
   })

   sock.ev.on('messages.upsert', async ({ messages }) => {
      for (const message of messages) {
         if (!message.message) continue

         console.log('πŸ”” Got new message', ':', message)
         await sock.sendMessage(message.key.remoteJid, {
            text: 'πŸ‘‹πŸ» Hello world'
         })
      }
   })
}

connectToWhatsApp()

πŸ—„οΈ Implementing a Data Store

Caution

I highly recommend building your own data store, as keeping an entire chat history in memory can lead to excessive RAM usage.

import { makeWASocket, makeInMemoryStore, delay, DisconnectReason, useMultiFileAuthState } from '@itsliaaa/baileys'
import { Boom } from '@hapi/boom'
import pino from 'pino'

const myPhoneNumber = '6288888888888'

// --- Create your store path
const storePath = './store.json'

const logger = pino({ level: 'silent' })

const connectToWhatsApp = async () => {
   const { state, saveCreds } = await useMultiFileAuthState('session')
    
   const sock = makeWASocket({
      logger,
      auth: state
   })

   const store = makeInMemoryStore({
      logger,
      socket: sock
   })

   store.bind(sock.ev)

   sock.ev.on('creds.update', saveCreds)

   sock.ev.on('connection.update', (update) => {
      const { connection, lastDisconnect } = update
      if (connection === 'connecting' && !sock.authState.creds.registered) {
         await delay(1500)
         const code = await sock.requestPairingCode(myPhoneNumber)
         console.log('πŸ”— Pairing code', ':', code)
      }
      else if (connection === 'close') {
         const shouldReconnect = new Boom(connection?.lastDisconnect?.error)?.output?.statusCode !== DisconnectReason.loggedOut
         console.log('⚠️ Connection closed because', lastDisconnect.error, ', reconnecting ', shouldReconnect)
         if (shouldReconnect) {
            connectToWhatsApp()
         }
      }
      else if (connection === 'open') {
         console.log('βœ… Successfully connected to WhatsApp')
      }
   })

   sock.ev.on('chats.upsert', () => {
      console.log('βœ‰οΈ Got chats', store.chats.all())
   })

   sock.ev.on('contacts.upsert', () => {
      console.log('πŸ‘₯ Got contacts', Object.values(store.contacts))
   })

   // --- Read store from file
   store.readFromFile(storePath)

   // --- Save store every 3 minutes
   setInterval(() => {
      store.writeToFile(storePath)
   }, 180000)
}

connectToWhatsApp()

πŸͺͺ WhatsApp IDs Explain

id is the WhatsApp ID, called jid and lid too, of the person or group you're sending the message to.

  • It must be in the format [country code][phone number]@s.whatsapp.net
    • Example for people: 19999999999@s.whatsapp.net and 12699999999@lid.
    • For groups, it must be in the format 123456789-123345@g.us.
  • For Meta AI, it's 11111111111@bot.
  • For broadcast lists, it's [timestamp of creation]@broadcast.
  • For stories, the ID is status@broadcast.

βœ‰οΈ Sending Messages

Note

You can get the jid from message.key.remoteJid in the first example.

πŸ”  Text
sock.sendMessage(jid, {
   text: 'πŸ‘‹πŸ» Hello'
}, {
   quoted: message
})
πŸ”” Mention
// --- Regular mention
sock.sendMessage(jid, {
   text: 'πŸ‘‹πŸ» Hello @628123456789',
   mentions: ['628123456789@s.whatsapp.net']
}, {
   quoted: message
})

// --- Mention all
sock.sendMessage(jid, {
   text: 'πŸ‘‹πŸ» Hello @all',
   mentionAll: true
}, {
   quoted: message
})
😁 Reaction
sock.sendMessage(jid, {
   react: {
      key: message.key,
      text: '✨'
   }
}, {
   quoted: message
})
πŸ“Œ Pin Message
sock.sendMessage(jid, {
   pin: message.key,
   time: 86400, // --- Set the value in seconds: 86400 (1d), 604800 (7d), or 2592000 (30d)
   type: 1 // --- Or 0 to remove
}, {
   quoted: message
})
πŸ‘€ Contact
const vcard = 'BEGIN:VCARD\n'
            + 'VERSION:3.0\n'
            + 'FN:Lia Wynn\n'
            + 'ORG:Waitress;\n'
            + 'TEL;type=CELL;type=VOICE;waid=628123456789:+62 8123 4567 89\n'
            + 'END:VCARD'

sock.sendMessage(jid, {
   contacts: {
      displayName: 'Lia Wynn',
      contacts: [
         { vcard }
      ]
   }
}, {
   quoted: message
})
πŸ“ Location
sock.sendMessage(jid, {
   location: {
      degreesLatitude: 24.121231,
      degreesLongitude: 55.1121221,
      name: 'πŸ‘‹πŸ» I am here'
   }
}, {
   quoted: message
})
πŸ“Š Poll
// --- Regular poll message
sock.sendMessage(jid, {
   poll: {
      name: 'πŸ”₯ Voting time',
      values: ['Yes', 'No'],
      selectableCount: 1,
      toAnnouncementGroup: false
   }
}, {
   quoted: message
})

// --- Quiz (only for newsletter)
sock.sendMessage('1211111111111@newsletter', {
   poll: {
      name: 'πŸ”₯ Quiz',
      values: ['Yes', 'No'],
      correctAnswer: 'Yes',
      pollType: 1
   }
}, {
   quoted: message
})

// --- Poll result
sock.sendMessage(jid, {
   pollResult: {
      name: 'πŸ“ Poll Result',
      votes: [{
         name: 'Nice',
         voteCount: 10
      }, {
         name: 'Nah',
         voteCount: 2
      }],
      pollType: 0 // Or 1 for quiz
   }
}, {
   quoted: message
})

// --- Poll update
sock.sendMessage(jid, {
   pollUpdate: {
      metadata: {},
      key: message.key,
      vote: {
         enclv: /* <Buffer> */,
         encPayload: /* <Buffer> */
      }
   }
}, {
   quoted: message
})
🎞️ Status Mention
sock.sendMessage([jidA, jidB, jidC], {
   text: 'Hello! πŸ‘‹πŸ»'
})
✨ Rich Response

Note

richResponse[] is a representation of submessages[] inside richResponseMessage.

Tip

You can still use the original submessages[] field directly. The code example below is just an implementation using a helper, not a required structure.

sock.sendMessage(jid, {
   richResponse: [{
      text: 'Example Usage',
   }, {
      language: 'javascript',
      code: [{
         highlightType: 0,
         codeContent: 'console.log("Hello, World!")'
      }]
   }, {
      text: 'Pretty simple, right?\n'
   }, {
      text: 'Comparison between Node.js, Bun, and Deno',
   }, {
      title: 'Runtime Comparison',
      table: [{
         isHeading: true,
         items: ['', 'Node.js', 'Bun', 'Deno']
      }, {
         isHeading: false,
         items: ['Engine', 'V8 (C++)', 'JavaScriptCore (C++)', 'V8 (C++)']
      }, {
         isHeading: false,
         items: ['Performance', '4/5', '5/5', '4/5']
      }]
   }, {
      text: 'Does this help clarify the differences?'
   }]
})
🧾 Message with Code Block
sock.sendMessage(jid, {
   headerText: '## Example Usage',
   contentText: '---'
   code: 'console.log("Hello, World!")',
   language: 'javascript',
   footerText: 'Pretty simple, right?'
})
πŸ“‹ Message with Table
sock.sendMessage(jid, {
   headerText: '## Comparison between Node.js, Bun, and Deno',
   contentText: '---',
   title: 'Runtime Comparison',
   table: [
      ['', 'Node.js', 'Bun', 'Deno'],
      ['Engine', 'V8 (C++)', 'JavaScriptCore (C++)', 'V8 (C++)'],
      ['Performance', '4/5', '5/5', '4/5']
   ],
   footerText: 'Does this help clarify the differences?'
})

πŸ“ Sending Media Messages

Note

For media messages, you can pass a Buffer directly, or an object with either { stream: Readable } or { url: string } (local file path or HTTP/HTTPS URL).

πŸ–ΌοΈ Image
sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ”₯ Superb'
}, {
   quoted: message
})
πŸŽ₯ Video
sock.sendMessage(jid, {
   video: {
      url: './path/to/video.mp4'
   },
   gifPlayback: false, // --- Set true if you want to send video as GIF
   ptv: false,  // --- Set true if you want to send video as PTV
   caption: 'πŸ”₯ Superb'
}, {
   quoted: message
})
πŸ“ƒ Sticker
sock.sendMessage(jid, {
   sticker: {
      url: './path/to/sticker.webp'
   }
}, {
   quoted: message
})
πŸ’½ Audio
sock.sendMessage(jid, {
   audio: {
      url: './path/to/audio.mp3'
   },
   ptt: false, // --- Set true if you want to send audio as Voice Note
}, {
   quoted: message
})
πŸ–ΌοΈ Album (Image & Video)
sock.sendMessage(jid, {
   album: [{
      image: {
         url: './path/to/image.jpg'
      },
      caption: '1st image'
   }, {
      video: {
         url: './path/to/video.mp4'
      },
      caption: '1st video'
   }, {
      image: {
         url: './path/to/image.jpg'
      },
      caption: '2nd image'
   }, {
      video: {
         url: './path/to/video.mp4'
      },
      caption: '2nd video'
   }]
}, {
   quoted: message
})
πŸ“¦ Sticker Pack

Important

If sharp or @napi-rs/image is not installed, the cover and stickers must already be in WebP format.

sock.sendMessage(jid, {
   cover: {
      url: './path/to/image.webp'
   },
   stickers: [{
      data: {
         url: './path/to/image.webp'
      }
   }, {
      data: {
         url: './path/to/image.webp'
      }
   }, {
      data: {
         url: './path/to/image.webp'
      }
   }],
   name: 'πŸ“¦ My Sticker Pack',
   publisher: '🌟 Lia Wynn',
   description: '@itsliaaa/baileys'
}, {
   quoted: message
})

πŸ‘‰πŸ» Sending Interactive Messages

1️⃣ Buttons
// --- Regular buttons message
sock.sendMessage(jid, {
   text: 'πŸ‘†πŸ» Buttons!',
   footer: '@itsliaaa/baileys',
   buttons: [{
      text: 'πŸ‘‹πŸ» SignUp',
      id: '#SignUp'
   }]
}, {
   quoted: message
})

// --- Buttons with Media & Native Flow
sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ‘†πŸ» Buttons and Native Flow!',
   footer: '@itsliaaa/baileys',
   buttons: [{
      text: 'πŸ‘‹πŸ» Rating',
      id: '#Rating'
   }, {
      text: 'πŸ“‹ Select',
      sections: [{
         title: '✨ Section 1',
         rows: [{
            header: '',
            title: 'πŸ’­ Secret Ingredient',
            description: '',
            id: '#SecretIngredient'
         }]
      }, {
         title: '✨ Section 2',
         highlight_label: 'πŸ”₯ Popular',
         rows: [{
            header: '',
            title: '🏷️ Coupon',
            description: '',
            id: '#CouponCode'
         }]
      }]
   }]
}, {
   quoted: message
})
2️⃣ List

Note

It only works in private chat (@s.whatsapp.net).

sock.sendMessage(jid, {
   text: 'πŸ“‹ List!',
   footer: '@itsliaaa/baileys',
   buttonText: 'πŸ“‹ Select',
   title: 'πŸ‘‹πŸ» Hello',
   sections: [{
      title: 'πŸš€ Menu 1',
      rows: [{
         title: '✨ AI',
         description: '',
         rowId: '#AI'
      }]
   }, {
      title: '🌱 Menu 2',
      rows: [{
         title: 'πŸ” Search',
         description: '',
         rowId: '#Search'
      }]
   }]
}, {
   quoted: message
})
3️⃣ Interactive
// --- Native Flow
sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ—„οΈ Interactive!',
   footer: '@itsliaaa/baileys',
   optionText: 'πŸ‘‰πŸ» Select Options', // --- Optional, wrap all native flow into a single list
   optionTitle: 'πŸ“„ Select Options', // --- Optional
   offerText: '🏷️ Newest Coupon!', // --- Optional, add an offer into message
   offerCode: '@itsliaaa/baileys', // --- Optional
   offerUrl: 'https://www.npmjs.com/package/@itsliaaa/baileys', // --- Optional
   offerExpiration: Date.now() + 3_600_000, // --- Optional
   nativeFlow: [{
      text: 'πŸ‘‹πŸ» Greeting',
      id: '#Greeting'
   }, {
      text: 'πŸ“ž Call',
      call: '628123456789'
   }, {
      text: 'πŸ“‹ Copy',
      copy: '@itsliaaa/baileys'
   }, {
      text: '🌐 Source',
      url: 'https://www.npmjs.com/package/@itsliaaa/baileys'
   }, {
      text: 'πŸ“‹ Select',
      sections: [{
         title: '✨ Section 1',
         rows: [{
            header: '',
            title: '🏷️ Coupon',
            description: '',
            id: '#CouponCode'
         }]
      }, {
         title: '✨ Section 2',
         highlight_label: 'πŸ”₯ Popular',
         rows: [{
            header: '',
            title: 'πŸ’­ Secret Ingredient',
            description: '',
            id: '#SecretIngredient'
         }]
      }]
   }],
   interactiveAsTemplate: false, // --- Optional, wrap the interactive message into a template
}, {
   quoted: message
})

// --- Carousel & Native Flow
sock.sendMessage(jid, {
   text: 'πŸ—‚οΈ Interactive with Carousel!',
   footer: '@itsliaaa/baileys',
   cards: [{
      image: {
         url: './path/to/image.jpg'
      },
      caption: 'πŸ–ΌοΈ Image 1',
      footer: '🏷️️ Pinterest',
      nativeFlow: [{
         text: '🌐 Source',
         url: 'https://www.npmjs.com/package/@itsliaaa/baileys'
      }]
   }, {
      image: {
         url: './path/to/image.jpg'
      },
      caption: 'πŸ–ΌοΈ Image 2',
      footer: '🏷️ Pinterest',
      offerText: '🏷️ New Coupon!',
      offerCode: '@itsliaaa/baileys',
      offerUrl: 'https://www.npmjs.com/package/@itsliaaa/baileys',
      offerExpiration: Date.now() + 3_600_000,
      nativeFlow: [{
         text: '🌐 Source',
         url: 'https://www.npmjs.com/package/@itsliaaa/baileys'
      }]
   }, {
      image: {
         url: './path/to/image.jpg'
      },
      caption: 'πŸ–ΌοΈ Image 3',
      footer: '🏷️ Pinterest',
      optionText: 'πŸ‘‰πŸ» Select Options',
      optionTitle: 'πŸ‘‰πŸ» Select Options',
      offerText: '🏷️ New Coupon!',
      offerCode: '@itsliaaa/baileys',
      offerUrl: 'https://www.npmjs.com/package/@itsliaaa/baileys',
      offerExpiration: Date.now() + 3_600_000,
      nativeFlow: [{
         text: 'πŸ›’ Product',
         id: '#Product'
      }, {
         text: '🌐 Source',
         url: 'https://www.npmjs.com/package/@itsliaaa/baileys'
      }]
   }]
}, {
   quoted: message
})
4️⃣ Hydrated Template
sock.sendMessage(jid, {
   title: 'πŸ‘‹πŸ» Hello',
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ«™ Template!',
   footer: '@itsliaaa/baileys',
   templateButtons: [{
      text: 'πŸ‘‰πŸ» Tap Here',
      id: '#Order'
   }, {
      text: '🌐 Source',
      url: 'https://www.npmjs.com/package/@itsliaaa/baileys'
   }, {
      text: 'πŸ“ž Call',
      call: '628123456789'
   }]
}, {
   quoted: message
})

πŸ’³ Sending Payment Messages

1️⃣ Invite Payment
sock.sendMessage(jid, {
   paymentInviteServiceType: 3 // 1, 2, or 3
})
2️⃣ Invoice

Note

Invoice message are not supported yet.

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   invoiceNote: '🏷️ Invoice'
})
3️⃣ Order
sock.sendMessage(chat, {
   orderText: 'πŸ›οΈ Order',
   thumbnail: fs.readFileSync('./path/to/image.jpg') // --- Must in buffer format
}, {
   quoted: message
})
4️⃣ Product
sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   product: {
      title: 'πŸ›’ My Product'
   },
   businessOwnerJid: '0@s.whatsapp.net' // --- Must included
}, {
   quoted: message
})
5️⃣ Request Payment
sock.sendMessage(jid, {
   text: 'πŸ’³ Request Payment',
   requestPaymentFrom: '0@s.whatsapp.net'
})

πŸ‘οΈ Other Message Options

1️⃣ AI Icon

Note

It only works in private chat (@s.whatsapp.net).

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ€– With AI icon!',
   ai: true
}, {
   quoted: message
})
2️⃣ Ephemeral

Note

Wrap message into ephemeralMessage

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ‘οΈ Ephemeral',
   ephemeral: true
})
3️⃣ External Ad Reply

Note

Add an ad thumbnail to messages (may not be displayed on some WhatsApp versions).

sock.sendMessage(jid, {
   text: 'πŸ“° External Ad Reply',
   externalAdReply: {
      title: 'πŸ“ Did you know?',
      body: '❓ I dont know',
      thumbnail: fs.readFileSync('./path/to/image.jpg'), // --- Must in buffer format
      largeThumbnail: false, // --- Or true for bigger thumbnail
      url: 'https://www.npmjs.com/package/@itsliaaa/baileys' // --- Optional, used for WhatsApp internal thumbnail caching and direct URL
   }
}, {
   quoted: message
})
4️⃣ Group Status

Note

It only works in group chat (@g.us)

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ‘₯ Group Status!',
   groupStatus: true
})
5️⃣ Raw
sock.sendMessage(jid, {
   extendedTextMessage: {
      text: 'πŸ“ƒ Built manually from scratch using the raw WhatsApp proto structure',
      contextInfo: {
         externalAdReply: {
            title: '@itsliaaa/baileys',
            thumbnail: fs.readFileSync('./path/to/image.jpg'),
            sourceApp: 'whatsapp',
            showAdAttribution: true,
            mediaType: 1
         }
      }
   },
   raw: true
}, {
   quoted: message
})
6️⃣ Secure Meta Service Label
sock.sendMessage(jid, {
   text: '🏷️ Just a label!',
   secureMetaServiceLabel: true
})
7️⃣ View Once

Note

Wrap message into viewOnceMessage

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ‘οΈ View Once',
   viewOnce: true
})
8️⃣ View Once V2

Note

Wrap message into viewOnceMessageV2

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ‘οΈ View Once V2',
   viewOnceV2: true
})
9️⃣ View Once V2 Extension

Note

Wrap message into viewOnceMessageV2Extension

sock.sendMessage(jid, {
   image: {
      url: './path/to/image.jpg'
   },
   caption: 'πŸ‘οΈ View Once V2 Extension',
   viewOnceV2Extension: true
})

🧰 Additional Contents

🏷️ Find User ID (JID|PN/LID)

Note

The ID must contain numbers only (no +, (), or -) and must include the country code with WhatsApp ID format.

// --- PN (Phone Number)
const phoneNumber = '6281111111111@s.whatsapp.net'

const ids = await sock.findUserId(phoneNumber)

console.log('🏷️ Got user ID', ':', ids)

// --- LID (Local Identifier)
const lid = '43411111111111@lid'

const ids = await sock.findUserId(lid)

console.log('🏷️ Got user ID', ':', ids)

// --- Output
// {
//    phoneNumber: '6281111111111@s.whatsapp.net',
//    lid: '43411111111111@lid'
// }
// --- Output when failed
// {
//    phoneNumber: '6281111111111@s.whatsapp.net',
//    lid: 'id-not-found'
// }
// --- Same output shape regardless of input type
πŸ”‘ Request Custom Pairing Code

Note

The phone number must contain numbers only (no +, (), or -) and must include the country code.

const phoneNumber = '6281111111111'
const customPairingCode = 'STARFALL'

await sock.requestPairingCode(phoneNumber, customPairingCode)

console.log('πŸ”— Pairing code', ':', customPairingCode)
πŸ–ΌοΈ Image Processing

Note

Automatically use available image processing library: sharp, @napi-rs/image, or jimp

import { getImageProcessingLibrary } from '@itsliaaa/baileys'
import { readFile } from 'fs/promises'

const lib = await getImageProcessingLibrary()

const bufferOrFilePath = './path/to/image.jpg'
const width = 512

let output

// --- If sharp installed
if (lib.sharp?.default) {
   const img = lib.sharp.default(bufferOrFilePath)

   output = await img.resize(width)
      .jpeg({ quality: 80 })
      .toBuffer()
}

// --- If @napi-rs/image installed
else if (lib.image?.Transformer) {
   // --- Must in buffer format
   const inputBuffer = Buffer.isBuffer(bufferOrFilePath)
      ? bufferOrFilePath
      : await readFile(bufferOrFilePath)

   const img = new lib.image.Transformer(inputBuffer)

   output = await img.resize(width, undefined, 0)
      .jpeg(50)
}

// --- If jimp installed
else if (lib.jimp?.Jimp) {
   const img = await lib.jimp.Jimp.read(bufferOrFilePath)

   output = await img
      .resize({ w: width, mode: lib.jimp.ResizeStrategy.BILINEAR })
      .getBuffer('image/jpeg', { quality: 50 });
}

// --- Fallback
else {
   throw new Error('No image processing available')
}

console.log('βœ… Process completed!')
console.dir(output, { depth: null })
πŸ“£ Newsletter Management
// --- Create a new one
sock.newsletterCreate('@itsliaaa/baileys')

// --- Get info
sock.newsletterMetadata('1231111111111@newsletter')

// --- Demote admin
sock.newsletterDemote('1231111111111@newsletter', '6281111111111@s.whatsapp.net')

// --- Change owner
sock.newsletterChangeOwner('1231111111111@newsletter', '6281111111111@s.whatsapp.net')

// --- Change name
sock.newsletterUpdateName('1231111111111@newsletter', 'πŸ“¦ @itsliaaa/baileys')

// --- Change description
sock.newsletterUpdateDescription('1231111111111@newsletter', 'πŸ“£ Fresh updates weekly')

// --- Change photo
sock.newsletterUpdatePicture('1231111111111@newsletter', {
   url: 'path/to/image.jpg'
})

// --- Remove photo
sock.newsletterRemovePicture('1231111111111@newsletter')

// --- React to a message
sock.newsletterReactMessage('1231111111111@newsletter', '100', 'πŸ’›')

// --- Get all subscribed newsletters
const newsletters = await sock.newsletterSubscribed()

console.dir(newsletters, { depth: null })
πŸ‘₯ Group Management
// --- Create a new one and add participants using their JIDs
sock.groupCreate('@itsliaaa/baileys', ['628123456789@s.whatsapp.net'])

// --- Get info
sock.groupMetadata(jid)

// --- Get invite code
sock.groupInviteCode(jid)

// --- Revoke invite link
sock.groupRevokeInvite(jid)

// --- Leave group
sock.groupLeave(jid)

// --- Add participants
sock.groupParticipantsUpdate(jid, ['628123456789@s.whatsapp.net'], 'add')

// --- Remove participants
sock.groupParticipantsUpdate(jid, ['628123456789@s.whatsapp.net'], 'remove')

// --- Promote to admin
sock.groupParticipantsUpdate(jid, ['628123456789@s.whatsapp.net'], 'promote')

// --- Demote from admin
sock.groupParticipantsUpdate(jid, ['628123456789@s.whatsapp.net'], 'demote')

// --- Change name
sock.groupUpdateSubject(jid, 'πŸ“¦ @itsliaaa/baileys')

// --- Change description
sock.groupUpdateDescription(jid, 'Updated description')

// --- Change photo
sock.updateProfilePicture(jid, {
   url: 'path/to/image.jpg'
})

// --- Remove photo
sock.removeProfilePicture(jid)

// --- Set group as admin only for chatting
sock.groupSettingUpdate(jid, 'announcement')

// --- Set group as open to all for chatting
sock.groupSettingUpdate(jid, 'not_announcement')

// --- Set admin only can edit group info
sock.groupSettingUpdate(jid, 'locked')

// --- Set all participants can edit group info
sock.groupSettingUpdate(jid, 'unlocked')

// --- Set admin only can add participants
sock.groupMemberAddMode(jid, 'admin_add')

// --- Set all participants can add participants
sock.groupMemberAddMode(jid, 'all_member_add')

// --- Enable or disable temporary messages with seconds format
sock.groupToggleEphemeral(jid, 86400)

// --- Disable temporary messages
sock.groupToggleEphemeral(jid, 0)

// --- Enable or disable membership approval mode
sock.groupJoinApprovalMode(jid, 'on')
sock.groupJoinApprovalMode(jid, 'off')

// --- Get all groups metadata
const groups = await sock.groupFetchAllParticipating()

console.dir(groups, { depth: null })

// --- Get pending invites
const invites = await sock.groupGetInviteInfo(code)

console.dir(invites, { depth: null })

// --- Accept group invite
sock.groupAcceptInvite(code)

// --- Get group info from link
const group = await sock.groupGetInviteInfo('https://chat.whatsapp.com/ABC123')

console.log('πŸ‘₯ Got group info from link', ':', group)

πŸ“¦ Fork Base

Note

This fork is based on Baileys (GitHub)

πŸ“£ Credits

Important

This fork uses Protocol Buffer definitions maintained by WPP Connect via wa-proto

Full credit goes to the original Baileys maintainers and contributors:

This fork includes additional enhancements and modifications by Lia Wynn

Releases

No releases published

Packages