Build modifikasi dari WhiskeySockets/Baileys
dengan dukungan native untuk pesan interaktif, album, AI rich response, newsletter, status mention, dan berbagai utilitas tambahan.
Package ini adalah distribusi/build repo untuk @gara31/void-baileys.
Berisi file runtime yang sudah dikompilasi di lib/ dan protobuf di WAProto/, dirancang untuk digunakan langsung dari npm.
- Fitur
- Persyaratan
- Isi Package
- Instalasi
- Quick Start
- Referensi API Socket
- Referensi Event
- Utilitas
- Penghargaan
- Lisensi
| Fitur | Deskripsi | Status |
|---|---|---|
| Pesan Interaktif | Flow button native, list/select menu, carousel | ✅ |
| Album Messages | Multi-image/video album dengan metadata | ✅ |
| AI Rich Response |
sendTable, sendList, sendCodeBlock, sendRichMessage
|
✅ |
| Unified Response V2 |
sendTableV2, sendCodeBlockV2, sendLinkV2
|
✅ |
| Link Messages | Link inline dengan kutipan dan verifikasi | ✅ |
| Payment Messages | Pesan pembayaran dengan catatan/stiker | ✅ |
| Produk & Katalog | Pesan produk bisnis, katalog lengkap | ✅ |
| Event & Poll | Builder pesan event dan hasil polling | ✅ |
| Newsletter Extras | Follow massal, metadata, admin utilities | ✅ |
| Komunitas & Grup | CRUD komunitas, undangan, persetujuan | ✅ |
| Status Mention |
sendStatusMention() untuk mention di status |
✅ |
| LID & Session | Pemetaan LID↔PN, migrasi sesi | ✅ |
| TypeScript | File .d.ts tersedia untuk semua API |
✅ |
-
Node.js
>= 20.0.0 -
Proyek ESM (
"type": "module"dipackage.json) - Auth store persisten untuk penggunaan produksi
- Opsional:
pino,qrcode-terminal,sharp,jimp
Penting:
@gara31/void-baileyshanya mendukung ESM. Proyek CommonJS perlu migrasi atau dynamic import wrapper.
| Path | Kegunaan |
|---|---|
lib/ |
Runtime utama, tipe, socket layer, utilitas |
WAProto/ |
Protobuf runtime yang sudah digenerate |
package.json |
Metadata package |
npm install @gara31/void-baileysPackage pendamping yang disarankan:
npm install pino qrcode-terminalJika proyekmu menggunakan fork dari @whiskeysockets/baileys atau @adiwajshing/baileys, tambahkan alias berikut ke package.json:
Fork @whiskeysockets/baileys
{
"dependencies": {
"@whiskeysockets/baileys": "npm:@gara31/void-baileys"
}
}Fork @adiwajshing/baileys
{
"dependencies": {
"@adiwajshing/baileys": "npm:@gara31/void-baileys"
}
}Lalu jalankan:
npm installnpm install void-bail@npm:@gara31/void-baileysTambahkan ke package.json:
{
"dependencies": {
"baileys": "npm:@gara31/void-baileys@latest"
}
}Lalu jalankan:
npm installmkdir bot-ku && cd bot-ku
npm init -yPastikan package.json memiliki "type": "module":
{
"name": "bot-ku",
"type": "module",
"dependencies": {
"baileys": "npm:@gara31/void-baileys@latest"
}
}npm install @gara31/void-baileys pino qrcode-terminalimport makeWASocket, {
useMultiFileAuthState,
DisconnectReason,
Browsers,
} from '@gara31/void-baileys'
import pino from 'pino'
import qrcode from 'qrcode-terminal'
const logger = pino({ level: 'silent' })
async function startBot() {
const { state, saveCreds } = await useMultiFileAuthState('./session')
const sock = makeWASocket({
auth: state,
logger,
browser: Browsers.ubuntu('Chrome'),
syncFullHistory: false,
})
sock.ev.on('creds.update', saveCreds)
sock.ev.on('connection.update', ({ connection, lastDisconnect, qr }) => {
if (qr) qrcode.generate(qr, { small: true })
if (connection === 'close') {
const shouldReconnect =
lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut
if (shouldReconnect) startBot()
}
if (connection === 'open') console.log('Terhubung!')
})
sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0]
if (!msg?.message || msg.key.fromMe) return
const text =
msg.message.conversation || msg.message.extendedTextMessage?.text || ''
if (text === '.ping') {
await sock.sendMessage(msg.key.remoteJid, { text: 'Pong!' })
}
})
}
startBot()node index.jsScan QR code, tunggu hingga socket mencapai connection: "open", lalu kirim .ping untuk tes.
const sock = makeWASocket({
auth: state,
logger,
browser: Browsers.windows('Chrome'),
})
sock.ev.on('connection.update', async ({ connection }) => {
if (connection === 'connecting') {
const code = await sock.requestPairingCode('628xxxxxxxxx')
console.log('Pairing code:', code)
}
})Saat menerima pesan via messages.upsert, gunakan getContentType dan normalizeMessageContent untuk mendeteksi tipe dan isi pesan.
import {
getContentType,
normalizeMessageContent,
downloadMediaMessage,
} from '@gara31/void-baileys'
sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0]
if (!msg?.message || msg.key.fromMe) return
const jid = msg.key.remoteJid
const content = normalizeMessageContent(msg.message) // handle viewOnce, ephemeral, dll
const type = getContentType(content)
// Ambil teks dari tipe apapun
const text =
content?.conversation ||
content?.extendedTextMessage?.text ||
content?.imageMessage?.caption ||
content?.videoMessage?.caption ||
content?.documentMessage?.caption ||
''
})if (type === 'conversation' || type === 'extendedTextMessage') {
const text = content?.conversation || content?.extendedTextMessage?.text || ''
console.log('Teks:', text)
}if (type === 'imageMessage') {
const caption = content.imageMessage.caption || ''
const mimetype = content.imageMessage.mimetype // 'image/jpeg'
console.log('Gambar diterima, caption:', caption)
}if (type === 'videoMessage') {
const caption = content.videoMessage.caption || ''
const seconds = content.videoMessage.seconds // durasi
console.log('Video diterima, caption:', caption)
}if (type === 'audioMessage') {
const isVoiceNote = content.audioMessage.ptt === true
const seconds = content.audioMessage.seconds
console.log(isVoiceNote ? 'Voice note' : 'Audio', 'durasi:', seconds, 'detik')
}if (type === 'documentMessage') {
const fileName = content.documentMessage.fileName || 'unknown'
const mimetype = content.documentMessage.mimetype
const caption = content.documentMessage.caption || ''
console.log('Dokumen:', fileName, '|', mimetype)
}if (type === 'stickerMessage') {
const isAnimated = content.stickerMessage.isAnimated
const isLottie = content.stickerMessage.isLottie
console.log('Stiker diterima, animasi:', isAnimated)
}if (type === 'locationMessage') {
const { degreesLatitude, degreesLongitude, name, address } = content.locationMessage
console.log(`Lokasi: ${name} — ${degreesLatitude}, ${degreesLongitude}`)
}if (type === 'contactMessage') {
const { displayName, vcard } = content.contactMessage
console.log('Kontak:', displayName)
console.log('vCard:', vcard)
}if (
type === 'pollCreationMessage' ||
type === 'pollCreationMessageV2' ||
type === 'pollCreationMessageV3'
) {
const poll = content[type]
const name = poll.name
const options = poll.options.map(o => o.optionName)
console.log('Poll:', name, '| Opsi:', options)
}// Saat user memilih dari Buttons Message
if (type === 'buttonsResponseMessage') {
const selectedId = content.buttonsResponseMessage.selectedButtonId
const selectedText = content.buttonsResponseMessage.selectedDisplayText
console.log(`Tombol dipilih: [${selectedId}] ${selectedText}`)
}// Saat user memilih dari List / Select Menu
if (type === 'listResponseMessage') {
const rowId = content.listResponseMessage.singleSelectReply.selectedRowId
const title = content.listResponseMessage.title
console.log(`List dipilih: [${rowId}] ${title}`)
}// Saat user memilih dari Template Buttons
if (type === 'templateButtonReplyMessage') {
const selectedId = content.templateButtonReplyMessage.selectedId
const selectedText = content.templateButtonReplyMessage.selectedDisplayText
console.log(`Template dipilih: [${selectedId}] ${selectedText}`)
}// Saat user memilih dari Interactive / Flow Buttons
if (type === 'interactiveResponseMessage') {
const raw = content.interactiveResponseMessage?.nativeFlowResponseMessage?.paramsJson
const parsed = raw ? JSON.parse(raw) : {}
const selectedId = parsed.id
console.log('Interaktif dipilih:', parsed)
}sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0]
if (!msg?.message) return
const content = normalizeMessageContent(msg.message)
// contextInfo ada di dalam tipe pesan terkait
const contextInfo =
content?.extendedTextMessage?.contextInfo ||
content?.imageMessage?.contextInfo ||
content?.videoMessage?.contextInfo ||
null
if (contextInfo?.quotedMessage) {
const quotedContent = normalizeMessageContent(contextInfo.quotedMessage)
const quotedType = getContentType(quotedContent)
const quotedText =
quotedContent?.conversation ||
quotedContent?.extendedTextMessage?.text ||
quotedContent?.imageMessage?.caption || ''
console.log(`Pesan ini reply ke [${quotedType}]: ${quotedText}`)
}
})Bisa digunakan untuk imageMessage, videoMessage, audioMessage, stickerMessage, documentMessage.
sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0]
if (!msg?.message) return
const buffer = await downloadMediaMessage(
msg,
'buffer', // atau 'stream'
{},
{
logger,
reuploadRequest: sock.updateMediaMessage,
}
)
console.log('Media didownload, ukuran:', buffer.length, 'bytes')
})const sock = makeWASocket({
auth: state,
logger,
browser: Browsers.ubuntu('Chrome'),
connectTimeoutMs: 20_000,
defaultQueryTimeoutMs: 60_000,
syncFullHistory: false,
})// Teks
await sock.sendMessage(jid, { text: 'Halo!' })
// Gambar
await sock.sendMessage(jid, {
image: { url: './foto.jpg' },
caption: 'Sebuah foto',
})
// Video
await sock.sendMessage(jid, {
video: { url: './video.mp4' },
caption: 'Sebuah video',
})
// Audio / Voice Note
await sock.sendMessage(jid, {
audio: { url: './audio.ogg' },
mimetype: 'audio/ogg; codecs=opus',
ptt: true,
})
// Stiker
await sock.sendMessage(jid, {
sticker: { url: './stiker.webp' },
})
// Dokumen
await sock.sendMessage(jid, {
document: { url: './file.pdf' },
fileName: 'dokumen.pdf',
mimetype: 'application/pdf',
})
// Reaksi
await sock.sendMessage(jid, {
react: { key: msg.key, text: '👍' },
})
// Polling
await sock.sendMessage(jid, {
poll: {
name: 'Vote!',
values: ['Opsi A', 'Opsi B', 'Opsi C'],
selectableCount: 1,
},
})
// Hapus pesan
await sock.sendMessage(jid, { delete: msg.key })
// Edit pesan
await sock.sendMessage(jid, {
text: 'Teks yang sudah diedit',
edit: msg.key,
})Kirim koleksi stiker dalam satu pack — bisa dari URL, buffer, atau file lokal.
// Dari URL
await sock.sendMessage(jid, {
stickerPackMessage: {
name: 'Pack Keren',
publisher: 'gara31',
stickers: [
{ url: 'https://example.com/stiker1.webp', emojis: ['😂'] },
{ url: 'https://example.com/stiker2.webp', emojis: ['🔥'] },
{ url: 'https://example.com/stiker3.gif', emojis: ['✨'], isAnimated: true },
],
},
})
// Dari Buffer
import { readFile } from 'fs/promises'
const buf1 = await readFile('./stiker1.webp')
const buf2 = await readFile('./stiker2.webp')
await sock.sendMessage(jid, {
stickerPackMessage: {
name: 'Pack Lokal',
publisher: 'Bot Ku',
trayIcon: './tray.png', // opsional, ikon kecil pack (96x96)
stickers: [
{ buffer: buf1, emojis: ['😎'] },
{ buffer: buf2, emojis: ['💯'], isAnimated: false },
],
},
})Kirim video berbentuk lingkaran seperti video note Telegram.
await sock.sendMessage(jid, {
video: { url: './video.mp4' },
ptv: true,
})// Bagikan nomor telepon kamu ke lawan chat
await sock.sendMessage(jid, { sharePhoneNumber: true })
// Minta nomor telepon lawan chat
await sock.sendMessage(jid, { requestPhoneNumber: true })await sock.sendMessage(jid, {
keep: {
key: msg.key, // key pesan yang ingin disimpan
type: 1, // 1 = simpan, 2 = hapus dari simpan
},
})// Pin pesan selama 24 jam (86400 detik)
await sock.sendMessage(jid, {
pin: msg.key,
type: 1, // 1 = pin, 2 = unpin
time: 86400, // durasi pin dalam detik (untuk pin)
})await sock.sendMessage(jid, {
limitSharing: true, // true = batasi, false = lepas batasan
})await sock.sendMessage(jid, {
call: {
name: 'Meeting Mingguan',
time: Date.now() + 3600_000, // 1 jam dari sekarang (ms)
type: 1, // 1 = audio, 2 = video
},
})await sock.sendMessage(jid, {
groupInvite: {
jid: '120363xxxxxx@g.us',
code: 'ABCDEFGH', // kode invite
name: 'Grup Saya',
caption: 'Gabung yuk!',
expiration: Math.floor(Date.now() / 1000) + 86400, // expired besok
},
})await sock.sendMessage(jid, {
adminInvite: {
jid: '120363xxxxxx@newsletter',
name: 'Saluran Saya',
caption: 'Jadi admin yuk!',
expiration: Math.floor(Date.now() / 1000) + 86400,
},
})await sock.sendMessage(jid, {
paymentInvite: {
type: 2, // tipe layanan pembayaran
expiry: 0,
},
})await sock.sendMessage(jid, {
orderStatus: {
title: 'Status Pesanan',
text: 'Pesanan kamu sedang diproses.',
footer: 'Terima kasih sudah belanja!',
image: './order-banner.jpg', // wajib ada
referenceId: 'ORD-20240001',
status: 'PROCESSING', // PROCESSING | COMPLETED | CANCELLED
subtotalValue: 50000,
subtotalOffset: 100,
taxValue: 5000,
taxOffset: 100,
currency: 'IDR',
},
})await sock.sendMessage(jid, {
event: {
name: 'Meetup Developer',
description: 'Kumpul bareng developer lokal!',
startDate: new Date('2025-08-01T10:00:00+07:00'),
endDate: new Date('2025-08-01T13:00:00+07:00'),
location: 'Jakarta, Indonesia',
extraGuestsAllowed: true,
isCancelled: false,
},
})await sock.sendMessage(jid, {
pollResult: {
name: 'Hasil Vote Bahasa Favorit',
values: [
['JavaScript', 42],
['Python', 38],
['Go', 20],
],
},
})Versi fleksibel dari interactiveMessage dengan berbagai tipe tombol.
// Tombol reply + URL + copy code
await sock.sendMessage(jid, {
nativeFlowMessage: {
title: 'Pilih Aksi',
body: 'Silakan pilih salah satu opsi di bawah ini.',
footer: 'Powered by Void',
buttons: [
{ type: 'reply', text: 'Menu Utama', id: 'menu' },
{ type: 'url', text: 'Website', url: 'https://example.com' },
{ type: 'copy', text: 'Salin Kode', code: 'PROMO2025' },
{ type: 'call', text: 'Hubungi', id: 'call_cs' },
],
},
})
// Dengan header gambar
await sock.sendMessage(jid, {
nativeFlowMessage: {
title: 'Flash Sale!',
body: 'Diskon 50% hari ini saja.',
footer: 'Berlaku hingga tengah malam',
image: 'https://example.com/banner.jpg',
buttons: [
{ type: 'reply', text: 'Beli Sekarang', id: 'buy' },
{ type: 'url', text: 'Lihat Katalog', url: 'https://example.com/katalog' },
],
},
})await sock.sendMessage(jid, {
carouselMessage: {
body: 'Pilih produk favoritmu!',
footer: 'Swipe untuk lihat lebih banyak',
cards: [
{
title: 'Produk A',
body: 'Deskripsi produk A yang keren.',
footer: 'Rp 99.000',
image: 'https://example.com/produk-a.jpg',
buttons: [
{ type: 'reply', text: 'Pilih Produk A', id: 'produk_a' },
{ type: 'url', text: 'Detail', url: 'https://example.com/a' },
],
},
{
title: 'Produk B',
body: 'Deskripsi produk B yang lebih keren.',
footer: 'Rp 149.000',
image: 'https://example.com/produk-b.jpg',
buttons: [
{ type: 'reply', text: 'Pilih Produk B', id: 'produk_b' },
{ type: 'url', text: 'Detail', url: 'https://example.com/b' },
],
},
],
},
})// Helper shorthand untuk carousel
await sock.sendMessage(jid, {
cards: [
{
title: 'Item 1',
body: 'Deskripsi item 1',
footer: 'Rp 50.000',
image: { url: 'https://example.com/img1.jpg' },
buttons: [{ name: 'quick_reply', buttonParamsJson: JSON.stringify({ display_text: 'Pilih', id: 'item1' }) }],
},
{
title: 'Item 2',
body: 'Deskripsi item 2',
footer: 'Rp 75.000',
video: { url: 'https://example.com/video2.mp4' },
buttons: [{ name: 'quick_reply', buttonParamsJson: JSON.stringify({ display_text: 'Pilih', id: 'item2' }) }],
},
],
text: 'Pilih item berikut:',
footer: 'Void Shop',
})// Balas list
await sock.sendMessage(jid, {
buttonReply: { title: 'Game', rowId: '.kuis' },
type: 'list',
})
// Balas template button
await sock.sendMessage(jid, {
buttonReply: { displayText: 'Konfirmasi', id: 'btn_confirm', index: 0 },
type: 'template',
})
// Balas plain button
await sock.sendMessage(jid, {
buttonReply: { id: 'btn_ok', displayText: 'OK' },
type: 'plain',
})
// Balas interactive/flow button
await sock.sendMessage(jid, {
buttonReply: {
displayText: 'Menu',
nativeFlows: {
name: 'quick_reply',
paramsJson: JSON.stringify({ id: 'menu' }),
version: '1',
},
},
type: 'interactive',
})// Tombol Flow
await sock.sendMessage(jid, {
interactiveMessage: {
title: 'Selamat Datang!',
footer: 'Powered by Void',
buttons: [
{
name: 'quick_reply',
buttonParamsJson: JSON.stringify({
display_text: 'Menu',
id: 'menu',
}),
},
{
name: 'cta_url',
buttonParamsJson: JSON.stringify({
display_text: 'Website',
url: 'https://example.com',
}),
},
],
header: 'Pilih opsi',
},
})
// List Menu
await sock.sendMessage(jid, {
interactiveMessage: {
title: 'Pilih Kategori',
footer: 'Powered by Void',
buttons: [
{
name: 'single_select',
buttonParamsJson: JSON.stringify({
title: 'Menu',
sections: [
{
title: 'Game',
rows: [
{ title: 'Kuis', id: '.kuis' },
{ title: 'Tebak Gambar', id: '.tebakgambar' },
],
},
],
}),
},
],
header: 'Menu Bot',
},
})// Tabel
await sock.sendTable(
jid,
'Java vs JavaScript',
['Fitur', 'Java', 'JavaScript'],
[
['Tipe', 'Compiled', 'Interpreted'],
['Typing', 'Static', 'Dynamic'],
['Kegunaan', 'Enterprise', 'Web, Full-stack'],
],
quoted,
{ headerText: 'Perbandingan:', footer: 'Semoga membantu!' }
)
// List
await sock.sendList(
jid,
'Info Bot',
[
['Nama', 'Void AI'],
['Versi', '7.0.0'],
['Developer', 'gara31'],
],
quoted,
{ footer: '© Void AI' }
)
// Code Block
await sock.sendCodeBlock(
jid,
`const salam = "Halo Dunia"
function kataSalam(nama) {
return salam + " " + nama
}
kataSalam("Void")`,
quoted,
{
language: 'javascript',
title: 'Contoh Kode',
footer: 'Powered by Void',
}
)// Teks & Markdown
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
text: `# Halo Dunia\n## GARA\n\n---\n\n=={ Yellow Text }==\n\n---\n\n[Google](https://google.com)\n\n[](https://openai.com)\n\n[Shiroko|1429|1897]<https://example.com/image.png>`,
}
}, { quoted: m })
// Tip / Metadata Text
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
tip: 'Ini adalah text tip (Metadata Text)',
}
}, { quoted: m })
// Produk
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
product: [
{
title: 'Nama Produk',
brand: 'GARA',
price: 'Rp 1000',
sale_price: 'Rp 0',
url: 'https://wa.me/628xxx',
icon: 'https://example.com/icon.png',
image: 'https://example.com/image.jpg',
}
],
}
}, { quoted: m })
// Code Block
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
code: {
language: 'javascript',
code: `class GARA {\n\tstatic hello() {\n\t\treturn 'Hello World';\n\t}\n}`,
},
}
}, { quoted: m })
// Tabel
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
table: [
['Nama', 'Role'],
['GARA', 'Developer'],
['Fiora Sylvie', 'Assistant'],
],
}
}, { quoted: m })
// Source / Sumber
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
source: [
['https://example.com/favicon.jpg', 'https://github.com/gara31/', 'GitHub'],
['https://example.com/favicon.jpg', 'https://example.com/', 'Website'],
],
}
}, { quoted: m })
// Gambar
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
image: 'https://example.com/image.jpg',
}
}, { quoted: m })
// Video
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
video: 'https://example.com/video.mp4|10', // url|durasi(detik)
}
}, { quoted: m })
// Reels
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
reels: [
{
username: 'GARA',
profile_url: 'https://example.com/avatar.jpg',
thumbnail: 'https://example.com/thumb.jpg',
url: 'https://example.com/',
title: 'Demo Reel',
like: 12000,
share: 500,
view: 999999,
source: 'IG',
verified: true,
}
],
}
}, { quoted: m })
// Post
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
post: [
{
profile_url: 'https://example.com/avatar.jpg',
username: 'GARA',
title: 'Demo Post',
subtitle: 'vøid',
caption: 'Caption post disini.',
verified: true,
url: 'https://example.com/',
thumbnail: 'https://example.com/thumb.jpg',
source: 'INSTAGRAM',
footer: 'vøid',
deeplink: 'https://example.com/',
icon: 'https://example.com/icon.jpg',
orientation: 'LANDSCAPE',
post_type: 'PHOTO',
comment: 1,
share: 1,
like: 1,
}
],
}
}, { quoted: m })
// Suggest / Pill
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
suggest: ['GARA', 'vøid', 'Fiora Sylvie'],
}
}, { quoted: m })
// Gabungan (video + tip + suggest + text)
await sock.sendMessage(jid, {
richMessage: {
title: 'vøid',
video: 'https://example.com/video.mp4|10',
tip: 'Ini adalah text tip',
suggest: ['gara', 'void', 'yuuki'],
text: `- [Beli Script](https://wa.me/628xxx)\n- [Sewa Bot](https://wa.me/628xxx)\n- [Support](https://wa.me/628xxx)`,
}
}, { quoted: m })await sock.newsletterFollow('id@newsletter')
await sock.newsletterUnfollow('id@newsletter')
await sock.newsletterMute('id@newsletter')
await sock.newsletterUnmute('id@newsletter')
await sock.newsletterCreate('Saluran Saya', 'Deskripsi')
await sock.newsletterUpdate('id@newsletter', { name: 'Nama Baru' })
const { subscribers } = await sock.newsletterSubscribers('id@newsletter')
await sock.newsletterMultipleFollow('id1@newsletter id2@newsletter')const meta = await sock.groupMetadata('id@g.us')
const grup = await sock.groupCreate('Grup Baru', ['628xxx@s.whatsapp.net'])
await sock.groupLeave('id@g.us')
await sock.groupUpdateSubject('id@g.us', 'Nama Baru')
await sock.groupUpdateDescription('id@g.us', 'Deskripsi Baru')
await sock.groupParticipantsUpdate('id@g.us', ['628xxx@s.whatsapp.net'], 'add')
const kode = await sock.groupInviteCode('id@g.us')
await sock.groupRevokeInvite('id@g.us')
await sock.groupSettingUpdate('id@g.us', 'announcement')const komunitas = await sock.communityCreate('Komunitas Kami', 'Deskripsi')
await sock.communityLinkGroup('groupid@g.us', 'communityid@g.us')
await sock.communityUnlinkGroup('groupid@g.us', 'communityid@g.us')
await sock.communityLeave('communityid@g.us')await sock.updateLastSeenPrivacy('all') // 'all' | 'contacts' | 'nobody'
await sock.updateOnlinePrivacy('all')
await sock.updateProfilePicturePrivacy('contacts')
await sock.updateStatusPrivacy('contacts')
await sock.updateReadReceiptsPrivacy('all') // 'all' | 'none'
await sock.updateGroupsAddPrivacy('all')
await sock.updateCallPrivacy('everyone')sock.ev.on('connection.update', ({ connection, lastDisconnect, qr }) => {})
sock.ev.on('creds.update', (update) => {})
sock.ev.on('messages.upsert', ({ messages, type }) => {})
sock.ev.on('messages.update', (updates) => {})
sock.ev.on('messages.delete', (keys) => {})
sock.ev.on('messages.reaction', (reactions) => {})
sock.ev.on('groups.update', (updates) => {})
sock.ev.on('group-participants.update', (update) => {})
sock.ev.on('contacts.upsert', (contacts) => {})
sock.ev.on('contacts.update', (updates) => {})
sock.ev.on('chats.upsert', (chats) => {})
sock.ev.on('chats.update', (updates) => {})
sock.ev.on('call', (calls) => {})
sock.ev.on('newsletter.update', (updates) => {})
sock.ev.on('settings.update', (settings) => {})import {
// Auth
useMultiFileAuthState,
makeCacheableSignalKeyStore,
initAuthCreds,
BufferJSON,
fetchLatestBaileysVersion,
// JID
jidEncode,
jidDecode,
jidNormalizedUser,
areJidsSameUser,
isJidGroup,
isJidNewsletter,
isJidBroadcast,
// Koneksi
DisconnectReason,
Browsers,
} from '@gara31/void-baileys'Fitur AI Rich Response yang tersedia di package ini — mulai dari richMessage, sendTable, sendCodeBlock, hingga seluruh ekosistem unified response — dibangun di atas fondasi luar biasa yang diciptakan oleh Nixel melalui proyeknya NIXCODE MessageBuilder.
Library NIXCODE adalah karya yang benar-benar melampaui batas kemampuan standar Baileys. Arsitektur fluent chaining-nya, sistem extractIE untuk parsing hyperlink/citation/latex secara inline, Toolkit class yang elegan, hingga dukungan multi-format media — semua itu adalah hasil kerja keras, riset mendalam, dan dedikasi tinggi yang patut diacungi. Tanpa fondasi ini, fitur-fitur rich response di @gara31/void-baileys tidak akan pernah ada.
Terima kasih banyak, Nixel — karyamu bukan sekadar library, tapi sebuah kontribusi nyata bagi komunitas developer WhatsApp bot Indonesia. 🙏
NIXCODE MessageBuilder dibuat oleh Nixel
Saluran resmi & update terbaru: wa.me/channel/0029VbCV1ck8fewpdNb2TY2k
Jika kamu menemukan library ini berguna, jangan lupa follow saluran NIXCODE di atas untuk mendapatkan update, fitur baru, dan rilis terbaru langsung dari pembuatnya.
MIT © gara31
Peringatan: Library ini untuk keperluan edukasi. Pastikan penggunaannya sesuai dengan Syarat Layanan WhatsApp.
Dibuat dengan 💚 oleh gara31