Skip to content

Repository files navigation

GojaBot — WhatsApp Bot Hybrid Architecture (Go + Goja JS)

Bot WhatsApp dengan arsitektur hibrida: Golang menangani socket WhatsApp secara langsung (via whatsmeow), sedangkan logic fitur diproses menggunakan JavaScript melalui engine github.com/dop251/goja.

Tidak ada HTTP/REST API antara Go dan JS — semua eksekusi terjadi secara native di dalam satu proses Go.

📐 Arsitektur

┌─────────────────────────────────────────────────────┐
│ GojaBot (1 Binary Go) │
│ │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ WhatsApp │ │ Goja JS Engine │ │
│ │ Socket │─────▶│ │ │
│ │ (whatsmeow) │ │ handler.js │ │
│ │ │ │ ├── serialize() │ │
│ │ • Connect │ │ ├── loadPlugins() │ │
│ │ • Receive │◀─────│ └── handleMessage() │ │
│ │ • Send │ │ │ │
│ │ • Upload │ │ plugins/ │ │
│ │ • Download │ │ ├── ping.js │ │
│ │ │ │ ├── menu.js │ │
│ └──────────────┘ │ ├── sticker.js │ │
│ │ └── owner.js │ │
│ ┌──────────────┐ └──────────────────────────┘ │
│ │ SQLite │ │
│ │ (Sessions) │ ┌──────────────────────────┐ │
│ └──────────────┘ │ MongoDB │ │
│ │ • Local: group metadata │ │
│ ┌──────────────┐ │ • Cloud: user data │ │
│ │ AntiSpam │ └──────────────────────────┘ │
│ │ (sync.Map) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────┘

🔄 Alur Pesan (Message Flow)

  1. Go menerima pesan masuk dari WhatsApp socket (whatsmeow event handler)
  2. Go memeriksa anti-spam (hanya 1 bot merespon jika ada multiple instances)
  3. Go mengkonversi events.Messagemap[string]interface{} (serialize)
  4. Goja menerima object JS yang sudah di-serialize
  5. JShandler.jsserialize() → enrichment (prefix, command parsing, owner check)
  6. JS mencari plugin yang cocok di registry (no switch-case)
  7. JS plugin memanggil conn.sendMessage(), conn.sendSticker(), dll
  8. Go mengeksekusi whatsmeow API (upload, send, download) dan return hasilnya
  9. Seluruh proses terjadi di shared memory — zero serialization overhead

🔧 Cara Goja Mengikat Fungsi Go ke JS

┌─────────────────┐ shared memory ┌─────────────────┐
│ Go Runtime │◀──────────────────▶│ Goja JS VM │
│ │ │ │
│ whatsmeow. │ conn.sendMessage │ handler.js │
│ Client. │◀──────────────────│ plugin.handler() │
│ SendMessage() │ │ │
│ │ conn.download │ │
│ whatsmeow. │ Media() │ │
│ Client. │◀──────────────────│ sticker.js │
│ Download() │ → ArrayBuffer │ │
│ │──────────────────▶│ │
└─────────────────┘ └─────────────────┘

Key points:

  • goja.Runtime.Set("conn", obj) → membuat object conn accessible di JS
  • Go function di-wrap sebagai func(goja.FunctionCall) goja.Value
  • JS ArrayBuffer ↔ Go []byte — transfer langsung via shared memory
  • _rawMsg menyimpan reference ke events.Message Go struct di JS object
  • Ketika JS memanggil conn.downloadMedia(msg._rawMsg), Goja mengembalikan reference Go asli

📁 Struktur File

gojabot/
├── main.go # Entry point, pairing code, whatsmeow init
├── goja_engine.go # Bridge Go↔Goja: bindings, serialize, CommonJS
├── antispam.go # Anti-spam multi-bot (sync.Map)
├── jadibot.go # Sub-bot manager (session persistence)
├── mongodb.go # MongoDB dual-DB manager (local + cloud)
├── .env # Konfigurasi
├── js/
│ ├── handler.js # Serialize + plugin loader + router
│ └── plugins/
│ ├── ping.js # Cek kecepatan respon
│ ├── menu.js # Daftar fitur (auto-generated)
│ ├── sticker.js # Image/video → stiker
│ └── owner.js # Kontak owner (vCard)
└── README.md

🚀 Cara Menjalankan

Prerequisites

  • Go 1.21+
  • ImageMagick (apt install imagemagick)
  • MongoDB (opsional, untuk fitur database)

Build & Run

# Clone / masuk ke direktoricd /root/gojabot
# Build binary
go build -o gojabot .# Edit konfigurasi
nano .env
# Jalankan
./gojabot

Pada startup pertama, bot akan menampilkan pairing code di terminal:

══════════════════════════════════════
🔑 PAIRING CODE: ABCD-EFGH
══════════════════════════════════════
Masukkan kode di atas pada WhatsApp:
Settings → Linked Devices → Link a Device
══════════════════════════════════════

Konfigurasi (.env)

BOT_NAME=GojaBotBOT_PREFIX=.OWNER_NUMBER=6288294961496,6281953678883,6289518562932OWNER_NAME=OwnerANTISPAM_TTL_MS=5000BOT_INSTANCE_ID=bot-mainMONGO_LOCAL_URI=mongodb://localhost:27017MONGO_LOCAL_DB=gojabot_localMONGO_CLOUD_URI=your_cloud_uriMONGO_CLOUD_DB=gojabot_cloud

🔌 Cara Menambah Plugin Baru

Buat file .js di folder js/plugins/. Format:

'use strict';module.exports={name: 'nama_plugin',command: ['cmd1','cmd2'],// Array command yang trigger plugin inicategory: 'tools',// Kategori untuk menudescription: 'Deskripsi plugin',isOwner: false,// true = hanya ownerisGroup: false,// true = hanya di grupisPrivate: false,// true = hanya di private chathandler: function(msg,{ conn, db, plugins, args, text, prefix }){// msg.from → JID chat (grup atau private)// msg.sender → JID pengirim// msg.pushName → Nama pengirim// msg.body → Isi pesan// msg.command → Nama command (tanpa prefix)// msg.args → Array argumen// msg.text → Teks setelah command// msg.isGroup → Boolean// msg.isOwner → Boolean// msg.quoted → Quoted message object atau null// msg.messageType → 'conversation', 'image', 'video', dll// msg._rawMsg → Reference ke raw Go event (untuk downloadMedia)conn.sendMessage(msg.from,'Hello from plugin!');},};

Fungsi yang Tersedia di Plugin

FungsiDeskripsi
conn.sendMessage(jid, text)Kirim pesan teks
conn.reply(jid, text, quotedID)Reply ke pesan
conn.sendImage(jid, bytes, caption)Kirim gambar
conn.sendSticker(jid, bytes)Kirim stiker (auto-convert WebP)
conn.sendContact(jid, name, phone)Kirim vCard
conn.downloadMedia(rawMsg)Download media → ArrayBuffer
db.getGroup(jid)Ambil data grup dari MongoDB
db.upsertGroup(jid, data)Update/insert data grup
db.getUser(jid)Ambil data user dari MongoDB
db.upsertUser(jid, data)Update/insert data user
db.isUserBanned(jid)Cek status ban user
log(level, message)Log ke terminal Go

🤖 JadiBot (Bot Numpang)

Sistem JadiBot memungkinkan user lain "meminjamkan" nomor mereka sebagai bot tambahan:

  1. Setiap jadibot punya whatsmeow.Client + GojaEngine sendiri
  2. Session tersimpan di SQLite (device keys) + JSON (metadata)
  3. Auto-restore saat startup
  4. Anti-spam shared: hanya 1 bot merespon per command

🛡️ Anti-Spam (Concurrency Control)

  • Menggunakan sync.Map untuk lock-free concurrent access
  • Claim(messageID, botID) → atomic first-come-first-served
  • TTL-based auto-cleanup
  • Shared antar bot utama dan semua jadibot instances

📦 Dependencies

PackageKegunaan
go.mau.fi/whatsmeowWhatsApp Web API (socket langsung)
github.com/dop251/gojaJavaScript engine embedded di Go
go.mongodb.org/mongo-driverNative MongoDB driver
modernc.org/sqlitePure Go SQLite (tanpa CGO)
github.com/joho/godotenvLoad .env configuration
ImageMagick (system)Konversi image → WebP untuk sticker

About

A high-performance WhatsApp bot powered by Go and JavaScript integration

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages