@ryuu-reinzz/luna-lib
v4.1.4
Published
Library extra for bot WhatsApp
Downloads
906
Maintainers
Readme
@ryuu-reinzz/luna-lib - Advanced WhatsApp Interactive Message Builder
@ryuu-reinzz/luna-lib adalah library mutakhir untuk mempermudah pembuatan pesan interaktif di WhatsApp menggunakan library Baileys. Dengan pendekatan fluent chaining API, Anda dapat membuat komponen kompleks seperti Buttons, Carousel Cards, Native Flows, hingga AI Rich Response Payloads dengan struktur kode yang bersih, elegan, dan sangat scalable.
📑 Watermark & Credits
⚠️ DO NOT REMOVE THIS WATERMARK
@ryuu-reinzz/luna-lib - Advanced WhatsApp Interactive Message Builder
Built for creating buttons, carousels, native flows, and AI rich response payloads using Baileys with fluent chaining, flexible payload customization, and scalable architecture for modern bot development.
- Runtime: Baileys:
baileys(Latest)- Created by: Nixel
- Contributors:
- ~ Ahmad tumbuh kembang
- ~ RyuuReinzz
Owner WhatsApp: wa.me/6288246552068 RyuuReinzz
(Added "messageBuilder" wrapper, "extendSocketsBotz", Owner of @ryuu-reinzz/baileys)WhatsApp Creator: wa.me/6282139672290
Channel: https://whatsapp.com/channel/0029VbCV1ck8fewpdNb2TY2kNote: This project is being sold because it has been modified and has been added to many other things that make it more valuable.
Copyright (c) 2026 Nixel
Copyright (c) 2026 RyuuReinzz
🚀 Fitur Utama
- Fluent Chaining (
messageBuilder): Menulis kode pembuatan pesan berantai yang rapi (.setType().setTitle().setBody().send()). - Native Flow Messages (Button V1): Dukungan penuh untuk quick replies, URL redirections, CTA Calls, Reminders, Address Input, dan Single Select Lists dengan opsi penyesuaian ikon.
- Buttons V2: Formulasi tombol interaktif klasik berbasis location data fallback dan rendering thumbnail instan.
- Carousel Cards: Mengirim deretan slider kartu interaktif berbasis media (Gambar/Video) sekaligus menggunakan integrasi instansiasi internal.
- AI Rich Response (WhatsApp AI Format): Rendering elemen super premium eksklusif Meta AI seperti Markdown Text, Code Highlighting Tokenizer, Data Tables, Reels/HScroll Layout, Product Showcase, Social Media Posts, hingga rendering ekspresi LaTeX ke Gambar.
- Socket Injection Extensions: Menambahkan prototype/method tambahan langsung ke objek
socketBaileys Anda (sendAlbum,sendStickerPack,sendOrder,getPNFromLid, dll).
🛠️ Instalasi & Persiapan
Prasyarat Dependensi
Pastikan project Anda telah menginstal beberapa modul inti berikut:
npm install baileys sharp node-fetch @ryuu-reinzz/luna-libInisialisasi Ekstensi addProperty
Untuk menyuntikkan seluruh fitur dari @ryuu-reinzz/luna-lib ke dalam instance bot Baileys Anda, panggil fungsi ekspor utama pada berkas koneksi bot Anda:
import makeWASocket, { useMultiFileAuthState } from 'baileys';
import {
addProperty,
Button,
ButtonV2,
Carousel,
AIRich
} from '@ryuu-reinzz/luna-lib';
const { state, saveCreds } = await useMultiFileAuthState('session');
const sock = makeWASocket({
auth: state,
printQRInTerminal: true
});
// Suntikkan properti @ryuu-reinzz/luna-lib ke dalam socket Baileys
addProperty(sock, await import('baileys'));📊 Detail Parameter & Opsi Method (API Reference)
1. Kelas Button (Native Flow / Button V1)
| Method | Parameter | Tipe Data | Deskripsi / Opsi Nilai | | :--- | :--- | :--- | :--- | | setTitle(text) | text | String | Judul di bagian paling atas (Header). | | setSubtitle(text) | text | String | Sub-judul / teks sekunder di bawah judul. | | setBody(text) | text | String | Konten teks utama di tengah bubble chat. | | setFooter(text) | text | String | Teks kecil abu-abu di bagian bawah pesan. | | setImage(url) | url | String | Mengatur media gambar pada header berupa URL / Buffer. | | addReply(txt, id, opt) | txt, id, opt | String, String, Object | Tombol Quick Reply. Opsi ikon: { icon: 'DEFAULT' }, { icon: 'REVIEW' }, dll. | | addUrl(txt, url, vw, opt) | txt, url, vw, opt | String, String, Boolean, Object | Tombol buka tautan. vw (webview) = true/false. Opsi ikon: { icon: 'PROMOTION' }. | | addCopy(txt, code, opt) | txt, code, opt | String, String, Object | Tombol salin kode cepat. Opsi ikon: { icon: 'DOCUMENT' }. | | addSelection(title) | title | String | Menginisialisasi komponen menu list baru. | | makeSection(title) | title | String | Membuat kategori/seksi baru di dalam list menu terakhir. | | makeRow(h, t, d, id) | h, t, d, id | String, String, String, String | Mengisi item baris. h (header), t (title), d (description), id (command). | ###
2. Kelas ButtonV2 (Classic Fallback Buttons)
| Method | Parameter | Tipe Data | Deskripsi | | :--- | :--- | :--- | :--- | | setTitle(text) | text | String | Judul pesan. | | setSubtitle(text) | text | String | Sub-judul pesan. | | setBody(text) | text | String | Isi konten utama teks pesan. | | setFooter(text) | text | String | Catatan kaki pesan. | | setThumbnail(url) | url | String | Mengatur thumbnail kecil di samping/dalam pesan. | | addButton(txt, id) | txt, id | String, String | Menambahkan tombol interaktif klasik. |
3. Skema Object Data AIRich Components
A. Properti Objek addProduct
{
title: String, // Nama produk resmi
brand: String, // Nama brand / pemilik produk
price: String, // Harga normal (Contoh: "Rp 1000")
sale_price: String, // Harga diskon (Contoh: "Rp 0")
product_url: String, // Tautan saat produk diklik (Gunakan key 'url' jika HScroll Array)
icon_url: String, // Logo brand mini di pojok (Gunakan key 'icon' jika HScroll Array)
image_url: String // Gambar visual produk utama (Gunakan key 'image' jika HScroll Array)
}B. Properti Objek addReels
{
username: String, // Nama pembuat konten video
profile_url: String, // Foto avatar profil pembuat
thumbnail: String, // Cover preview video Reels
url: String, // Link redirect eksternal video
title: String, // Judul pendek / caption video
like: Number, // Jumlah visualisasi Like (e.g. 12000)
share: Number, // Jumlah visualisasi Share (e.g. 500)
view: Number, // Jumlah total tayangan (e.g. 999999)
source: String, // Tag asal platform (Contoh: 'IG', 'FB')
verified: Boolean // Lencana centang biru profil (true / false)
}C. Properti Objek addPost
{
profile_url: String, // Foto avatar profil
username: String, // Nama akun
title: String, // Judul postingan
subtitle: String, // Sub-judul / detail lokasi
caption: String, // Deskripsi status postingan
verified: Boolean, // Status verifikasi centang biru
url: String, // Tautan utama postingan
thumbnail: String, // Gambar konten utama postingan
source: String, // Sumber platform: 'INSTAGRAM', 'FACEBOOK', 'THREADS', dsb.
footer: String, // Catatan kaki di dalam frame post
deeplink: String, // Tautan langsung aplikasi internal
icon: String, // Ikon kecil platform pendukung
orientation: String, // Orientasi layout gambar: 'LANDSCAPE' atau 'PORTRAIT'
post_type: String, // Tipe postingan: 'PHOTO' atau 'VIDEO'
comment: Number, // Statistik Jumlah Komentar
share: Number, // Statistik Jumlah Bagikan
like: Number // Statistik Jumlah Suka
}📖 Contoh Penggunaan & Implementasi Kode
@ryuu-reinzz/luna-lib menyediakan dua metode penggunaan: menggunakan sock.messageBuilder(jid) (Sangat Direkomendasikan karena mendukung penulisan rantai metode langsung) atau menginisialisasi kelasnya secara mandiri via operator new.
🔄 Sintaks Pembungkus (Wrapper Syntax) messageBuilder
Pembungkus pintar ini mengekspos semua metode kelas target secara dinamis setelah tipe ditentukan.
// Contoh pola pemanggilan umum via messageBuilder
await sock.messageBuilder(m.chat, { quoted: m })
.setType("Button") // Menerima: "Button" | "ButtonV2" | "Carousel" | "AIRich"
.setTitle("Judul")
.setBody("Isi Pesan")
.addReply("Tombol 1", "id_1")
.send();1. Kelas Button (Native Flow Message)
Pembuatan komponen tombol canggih WhatsApp (Native Flow Components) lengkap dengan penyesuaian ikon interaktif.
💻 Contoh Menggunakan Operator new:
await new Button(conn)
.setTitle('🚀 Ryuu')
.setSubtitle('Interactive Message')
.setBody('Pilih menu di bawah')
.setFooter('© Ryuu')
.setImage('[https://cdn.ornzora.eu.cc/b57c0d1e-d7a6-4277-8739-8f6b1d9894e6-FIORA.jpg](https://cdn.ornzora.eu.cc/b57c0d1e-d7a6-4277-8739-8f6b1d9894e6-FIORA.jpg)')
.addReply('📦 Menu', '.menu', { icon: 'DEFAULT' })
.addReply('👤 Profile', '.profile', { icon: 'REVIEW' })
.addUrl('🌐 Website', '[https://example.com](https://example.com)', true, { icon: 'PROMOTION' })
.addCopy('📋 Copy Code', 'NIX-2026', { icon: 'DOCUMENT' })
.addSelection('📚 Pilih Kategori')
.makeSection('Main Menu')
.makeRow('🔥 HOT', 'Downloader', 'Download social media', '.dl')
.makeRow('⚡ FAST', 'AI Chat', 'Chat dengan AI', '.ai')
.send(m.chat, { quoted: m });🔄 Menggunakan messageBuilder:
await sock.messageBuilder(m.chat, { quoted: m })
.setType('Button')
.setTitle('🚀 Ryuu')
.setSubtitle('Interactive Message')
.setBody('Pilih menu di bawah')
.addReply('📦 Menu', '.menu', { icon: 'DEFAULT' })
.addSelection('📚 Pilih Kategori')
.makeSection('Main Menu')
.makeRow('🔥 HOT', 'Downloader', 'Download social media', '.dl')
.send();2. Kelas ButtonV2 (Classic Buttons)
Formulasi alternatif tombol interaktif klasik berbasis location data fallback dan rendering thumbnail instan.
💻 Contoh Menggunakan Operator new:
await new ButtonV2(conn)
.setTitle('🚀 Ryuu')
.setSubtitle('Buttons Message')
.setBody('Halo dunia')
.setFooter('Footer Message')
.setThumbnail('[https://cdn.ornzora.eu.cc/4d2905ce-3707-4ec0-998a-68a3d851629f-FIORA.jpg](https://cdn.ornzora.eu.cc/4d2905ce-3707-4ec0-998a-68a3d851629f-FIORA.jpg)')
.addButton('📦 Menu', '.menu')
.addButton('👤 Profile', '.profile')
.send(m.chat);🔄 Menggunakan messageBuilder:
await sock.messageBuilder(m.chat)
.setTitle('🚀 Ryuu')
.setSubtitle('Buttons Message')
.setBody('Halo dunia')
.setFooter('Footer Message')
.setThumbnail(https://cdn.ornzora.eu.cc/4d2905ce-3707-4ec0-998a-68a3d851629f-FIORA.jpg')
.addButton('📦 Menu', '.menu')
.addButton('👤 Profile', '.profile')
.send();3. Kelas Carousel (Interactive Cards Slider)
Mengirimkan beberapa kartu media interaktif horizontal yang dapat digeser (swipe) oleh pengguna menggunakan fungsionalitas penarikan .toCard().
💻 Contoh Menggunakan Operator new:
await new Carousel(conn)
.setBody('🛍️ Product List')
.setFooter('Swipe untuk lihat')
.addCard(
await new Button(conn)
.setTitle('🍔 Burger')
.setBody('Burger terenak')
.setFooter('$5')
.setImage('https://cdn.ornzora.eu.cc/36df8c36-c74e-4dc2-bc03-87893f373cb4-FIORA.jpg')
.addReply('🛒 Buy', '.buy burger')
.toCard()
)
.addCard(
await new Button(conn)
.setTitle('🍕 Pizza')
.setBody('Pizza mozzarella')
.setFooter('$7')
.setImage('https://cdn.ornzora.eu.cc/36df8c36-c74e-4dc2-bc03-87893f373cb4-FIORA.jpg')
.addReply('🛒 Buy', '.buy pizza')
.toCard()
)
.send(m.chat, { quoted: m });🔄 Menggunakan messageBuilder:
await sock.messageBuilder(m.chat, { quoted: m })
.setBody('🛍️ Product List')
.setFooter('Swipe untuk lihat')
.addCard(
await new Button(conn)
.setTitle('🍔 Burger')
.setBody('Burger terenak')
.setFooter('$5')
.setImage('https://cdn.ornzora.eu.cc/36df8c36-c74e-4dc2-bc03-87893f373cb4-FIORA.jpg')
.addReply('🛒 Buy', '.buy burger')
.toCard()
)
.addCard(
await new Button(conn)
.setTitle('🍕 Pizza')
.setBody('Pizza mozzarella')
.setFooter('$7')
.setImage('https://cdn.ornzora.eu.cc/36df8c36-c74e-4dc2-bc03-87893f373cb4-FIORA.jpg')
.addReply('🛒 Buy', '.buy pizza')
.toCard()
)
.send();4. Kelas AIRich (Meta AI Response Styles)
Fitur premium berkelas tinggi untuk mereplikasi visualisasi platform Meta AI di WhatsApp resmi (Tabel data, Pewarnaan kode sintaks, Rendering rumus gambar LaTeX, Layout Reels, Galeri grid, Showcase produk komersial, & Social Post mockup).
Panduan Khusus Ekstraksi Sintaks Teks addText:
- Hyperlink: Teks Di Sini -> Contoh: Google
- Auto Citation: -> Contoh:
- LaTeX Render Engine: [Identifier|Width|Height|Font_Height|Padding]<url_gambar> -> Contoh: [Shiroko|1429|1897]https://cdn.link.png
💻 Contoh Menggunakan Operator new:
await new AIRich(sock)
.setType('AIRich')
.setTitle('🚀 Ryuu')
.setFooter('© Haruka')
.addSuggest(['Ryuu', 'Ryuu', 'Haruka'])
.addTip('Ini adalah text tip (Metadata Text)')
.addText(`# Halo Dunia
=={ Yellow Text }==
Ini hyperlink:
[Google](https://google.com)
Ini auto citation:
[](https://openai.com)
Ini LaTeX:
[Shiroko|1429|1897]<https://cdn.ornzora.eu.cc/a3a756f2-6bb8-4814-a024-c325524a2308-FIORA.png>`)
.addProduct({
title: 'Nama Produk',
brand: 'Ryuu',
price: 'Rp 1000',
sale_price: 'Rp 0',
product_url: 'https://wa.me/6288246552068',
icon_url: "https://static.nike.com/a/images/t_PDP_1280_v1/f_auto,q_auto:eco/additional_image_1.png",
image_url: 'https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-10.jpg'
})
.addCode('javascript', `class Ryuu {
static hello() {
return 'Hello World';
}
}`)
.addText('HScroll Product (Array of Object Input):')
.addProduct(Array(5).fill({
title: global.namabot,
brand: 'Ryuu',
price: 'Rp 1000',
sale_price: 'Rp 0',
url: 'https://wa.me/6288246552068',
icon: "https://static.nike.com/a/images/t_PDP_1280_v1/f_auto,q_auto:eco/additional_image_1.png",
image: "https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-10.jpg"
}))
.addTable([
['Nama', 'Role'],
['Ryuu', 'Developer'],
['Haruka', 'Assistant']
])
.addSource([
['https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-09.jpg', 'https://github.com/reinzz556/', 'GitHub'],
['https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-09.jpg', 'https://api.ryuu-dev.my.id/', 'Haruka Botz']
])
.addImage('https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-07.jpg')
.addVideo("https://api.ryuu-dev.my.id/2026-06-01-064748592.mp4|10")
.addReels(Array(5).fill({
username: 'Ryuu',
profile_url: 'https://api.ryuu-dev.my.id/logo.png',
thumbnail: 'https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-08.jpg',
url: 'https://api.ryuu-dev.my.id/',
title: 'Demo Reel',
like: 12000,
share: 500,
view: 999999,
source: 'IG',
verified: true
}))
.addPost(Array(5).fill({
profile_url: "https://api.ryuu-dev.my.id/logo.png",
username: 'Ryuu',
title: "Demo Post",
subtitle: 'Ryuu',
caption: 'hii~ im haruka, just quietly observing things around here.',
verified: true,
url: 'https://api.ryuu-dev.my.id/',
thumbnail: 'https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-07.jpg',
source: 'INSTAGRAM',
footer: 'Haruka',
deeplink: 'https://api.ryuu-dev.my.id/',
icon: "https://api.ryuu-dev.my.id/logo.png",
orientation: 'LANDSCAPE',
post_type: 'PHOTO',
comment: 1,
share: 1,
like: 1
}))
.send(m.chat, { quoted: m });🔄 Menggunakan messageBuilder:
await sock.messageBuilder(m.chat, { quoted: m })
.setType('AIRich')
.setTitle('🚀 Ryuu')
.setFooter('© Haruka')
.addSuggest(['Ryuu', 'Ryuu', 'Haruka'])
.addTip('Ini adalah text tip (Metadata Text)')
.addText(`# Halo Dunia
=={ Yellow Text }==
Ini hyperlink:
[Google](https://google.com)
Ini auto citation:
[](https://openai.com)
Ini LaTeX:
[Shiroko|1429|1897]<https://cdn.ornzora.eu.cc/a3a756f2-6bb8-4814-a024-c325524a2308-FIORA.png>`)
.addProduct({
title: 'Nama Produk',
brand: 'Ryuu',
price: 'Rp 1000',
sale_price: 'Rp 0',
product_url: 'https://wa.me/6288246552068',
icon_url: "https://static.nike.com/a/images/t_PDP_1280_v1/f_auto,q_auto:eco/additional_image_1.png",
image_url: 'https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-10.jpg'
})
.addCode('javascript', `class Ryuu {
static hello() {
return 'Hello World';
}
}`)
.addText('HScroll Product (Array of Object Input):')
.addProduct(Array(5).fill({
title: global.namabot,
brand: 'Ryuu',
price: 'Rp 1000',
sale_price: 'Rp 0',
url: 'https://wa.me/6288246552068',
icon: "https://static.nike.com/a/images/t_PDP_1280_v1/f_auto,q_auto:eco/additional_image_1.png",
image: "https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-10.jpg"
}))
.addTable([
['Nama', 'Role'],
['Ryuu', 'Developer'],
['Haruka', 'Assistant']
])
.addSource([
['https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-09.jpg', 'https://github.com/reinzz556/', 'GitHub'],
['https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-09.jpg', 'https://api.ryuu-dev.my.id/', 'Haruka Botz']
])
.addImage('https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-07.jpg')
.addVideo("https://api.ryuu-dev.my.id/2026-06-01-064748592.mp4|10")
.addReels(Array(5).fill({
username: 'Ryuu',
profile_url: 'https://api.ryuu-dev.my.id/logo.png',
thumbnail: 'https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-08.jpg',
url: 'https://api.ryuu-dev.my.id/',
title: 'Demo Reel',
like: 12000,
share: 500,
view: 999999,
source: 'IG',
verified: true
}))
.addPost(Array(5).fill({
profile_url: "https://api.ryuu-dev.my.id/logo.png",
username: 'Ryuu',
title: "Demo Post",
subtitle: 'Ryuu',
caption: 'hii~ im haruka, just quietly observing things around here.',
verified: true,
url: 'https://api.ryuu-dev.my.id/',
thumbnail: 'https://api.ryuu-dev.offc.my.id/src/assest/mahiru/Mahiru-07.jpg',
source: 'INSTAGRAM',
footer: 'Haruka',
deeplink: 'https://api.ryuu-dev.my.id/',
icon: "https://api.ryuu-dev.my.id/logo.png",
orientation: 'LANDSCAPE',
post_type: 'PHOTO',
comment: 1,
share: 1,
like: 1
}))
.send();🔌 Prototip Tambahan Socket (sock.*)
@ryuu-reinzz/luna-lib secara otomatis menyuntikkan fungsi pembantu tingkat tinggi ke dalam variabel socket Baileys Anda melalui method addProperty:
A. sock.sendAlbum(jid, items, options)
Mengirimkan album galeri media terkompresi (kumpulan gambar/video) dalam satu kesatuan pesan tanpa berantakan.
await sock.sendAlbum(m.chat, [
{ image: { url: "https://placehold.co/600x400.png" }, caption: "Foto Keren 1" },
{ image: { url: "https://placehold.co/600x400.png" }, caption: "Foto Keren 2" }
], { quoted: m });B. sock.sendStickerPack(jid, packData, options)
Mengirimkan file webp secara massal berwujud Paket Stiker Resmi (Third Party Sticker Pack).
await sock.sendStickerPack(m.chat, {
name: "Stiker Pack Haruka V2",
publisher: "RyuuReinzz Dev",
description: "Kumpulan stiker interaktif buatan bot",
cover: Buffer.from("..."), // Buffer gambar untuk cover kemasan stiker
stickers: [
{ data: fs.readFileSync("./sticker1.webp"), emojis: ["🤣", "🔥"] },
{ data: fs.readFileSync("./sticker2.webp"), emojis: ["❤️"] }
]
});C. sock.sendOrder(jid, orderData, options)
Mengirim kartu transaksi pesanan komersial formal katalog bisnis.
await sock.sendOrder(m.chat, {
orderId: "ORDER-ID-99823",
itemCount: 2,
status: 1, // INQUIRY
orderTitle: "Pembelian Source Code Haruka Bot",
message: "Terima kasih telah berbelanja, mohon tunggu verifikasi pembayaran QRIS Midtrans.",
totalAmount1000: 350000000, // Rp 350.000
totalCurrencyCode: "IDR",
thumbnail: "https://img.jpg" // Gambar produk terlampir
});D. Konversi ID: sock.getPNFromLid & sock.getLidFromPN
Digunakan untuk menukarkan identitas terenkripsi WhatsApp terbaru (LID ID ke Nomor Telepon asli atau sebaliknya) dalam interaksi grup.
// Mengambil nomor telepon dari LID akun di grup
const phoneNumber = await sock.getPNFromLid(m, "123xxxx@lid");
console.log("Nomor Telepon Asli Pengguna:", phoneNumber);// Mengambil LID dari nomor telepon akun di grup
const lid = await sock.getLidFromPN(m, "[email protected]");
console.log("LID Dari Pengguna:", lid);⚠️ Ketentuan Penggunaan & Lisensi (Terms of Use)
- Izin Penggunaan: Anda diberikan izin penuh untuk menggunakan dan memodifikasi library ini untuk proyek pribadi maupun kebutuhan komersial Anda sendiri.
- Larangan Keras: Dilarang keras mengunggah ulang (reuploading), menjual kembali (reselling), melisensikan ulang (relicensing), atau mendistribusikan pustaka ini sebagai produk mandiri (standalone product) tanpa izin tertulis dari RyuuReinzz.
- Klaim Hak Cipta: Dilarang mengklaim proyek orisinal ini sebagai hasil karya murni Anda sendiri. Hormati hak kekayaan intelektual pemilik kode dengan tetap mempertahankan informasi kredit pembuka.
