Logo OmniDevvKANA Web
Kembali ke katalog plugin

owner

jadibot

Mulai sesi jadibot di nomor lain (khusus owner)

Start a jadibot session on another number (owner only)

plugins/owner/jadibot.js

Lokasi file di repo kana-md

2

Perintah termasuk alias

5.4 KB

Ukuran file sumber

4/11/2026

Update terakhir, commit 11aee2b

Daftar perintah

Ketuk tombol salin untuk menyalin perintah, lalu tempel di chat WhatsApp bot KANA.

.jadibot.jadibotstart

Cara pakai

.jadibot <nama> <nomor>

Contoh

.jadibot kana2 6281234567890

Kode sumber plugin

Unduh .js

Cara pasang: simpan file ini ke folder plugins/owner/ di bot KANA kamu, lalu restart bot. Pemilik source code lain bisa mengambil update plugin terbaru dari halaman ini kapan saja.

import { sendButtons } from '../../src/ui/buttons.js'
import {
  createJadibotManager,
  getJadibotManager,
  setJadibotManager,
  pairingCodeFor,
} from '../../src/services/jadibot.js'

export const config = {
  name: 'jadibot',
  alias: ['jadibotstart'],
  category: 'owner',
  description: { id: 'Mulai sesi jadibot di nomor lain (khusus owner)', en: 'Start a jadibot session on another number (owner only)' },
  usage: '.jadibot <nama> <nomor>',
  example: '.jadibot kana2 6281234567890',
  cooldown: 5,
  isOwner: true,
}

export const i18n = {
  id: {
    jadibot: {
      usage: 'Formatnya: .jadibot <nama 3-16 huruf/angka> <nomor>. Contoh: .jadibot kana2 6281234567890 yaa, Master~',
      invalidName: 'Mouu, nama sesinya nggak valid, Master. Pakai huruf dan angka saja, 3 sampai 16 karakter yaa~',
      invalidNumber: 'Mouu, nomornya nggak valid, Master. Tulis nomor lengkap dengan kode negara, contoh 6281234567890~',
      maxSessions: 'Mouu, slot jadibot udah penuh nih, Master (maksimal 3 sesi aktif). Stop dulu salah satu pakai .stopjadibot yaa~',
      duplicate: 'Ehh, sesi bernama "{name}" udah aktif, Master. Pakai nama lain atau stop dulu yang itu yaa~',
      started: 'Siap, Master~ Sesi jadibot "{name}" buat nomor {number} lagi dimulai ✨\nKode pairing sesi: {code}\nKode juga dikirim KANA ke chat ini lewat notif sesi. Masukkan kode pairing yang diminta WhatsApp di nomor itu yaa~ {mood}',
      failed: 'Mouu, sesi jadibotnya gagal dimulai, Master: {message} (╥﹏╥)',
      btnList: 'Daftar Bot',
      btnStop: 'Stop Sesi Ini',
    },
  },
  en: {
    jadibot: {
      usage: 'Format: .jadibot <name 3-16 letters/numbers> <number>. Example: .jadibot kana2 6281234567890, Master~',
      invalidName: 'Mouu, the session name is not valid, Master. Use letters and numbers only, 3 to 16 characters~',
      invalidNumber: 'Mouu, the number is not valid, Master. Write the full number with country code, example 6281234567890~',
      maxSessions: 'Mouu, the jadibot slots are full, Master (max 3 active sessions). Stop one first with .stopjadibot~',
      duplicate: 'Eh, a session named "{name}" is already active, Master. Use another name or stop that one first~',
      started: 'Got it, Master~ Jadibot session "{name}" for number {number} is starting ✨\nSession pairing code: {code}\nKANA also sent the code to this chat via the session notice. Enter the pairing code WhatsApp asks for on that number~ {mood}',
      failed: 'Mouu, the jadibot session failed to start, Master: {message} (╥﹏╥)',
      btnList: 'Bot List',
      btnStop: 'Stop This Session',
    },
  },
}

// Buat manager singleton bila belum ada. StartConnection asli dimuat
// lewat impor dinamis di sini (sesuai kepemilikan Fase 10) dan
// dibungkus jadi startConnectionFn untuk manager: pipeline sesi tetap
// dibuat manager lewat createPipeline yang sama.
async function ensureManager(ctx) {
  const existing = getJadibotManager()
  if (existing) return existing
  const { startConnection } = await import('../../src/core/connection.js')
  const { createSessionAuth } = await import('../../src/services/jadibot.js')
  const ownerDigits = (process.env.OWNER_NUMBER || '').replace(/\D/g, '')
  const startConnectionFn = async ({ name, number, onMessage, onParticipants }) => {
    const auth = await createSessionAuth(ctx.storage, name)
    const sessionRef = { sock: null }
    const sock = await startConnection({
      auth,
      botNumber: number,
      ownerNumber: ownerDigits,
      botName: process.env.BOT_NAME || 'KANA',
      onMessage,
      onParticipants,
      session: sessionRef,
      autoBio: false,
    })
    return {
      session: sessionRef,
      stop: async () => {
        try {
          sessionRef.sock?.end?.(undefined)
        } catch {}
        try {
          sock?.end?.(undefined)
        } catch {}
      },
    }
  }
  const manager = createJadibotManager({
    storage: ctx.storage,
    registry: ctx.registry,
    owners: ownerDigits ? [ownerDigits] : [],
    defaultLang: ctx.lang,
    startConnectionFn,
  })
  setJadibotManager(manager)
  return manager
}

export const test = { input: '.jadibot', expect: /jadibot/i }

export async function handler(ctx) {
  const [name, number] = ctx.args
  if (!name || !number) return ctx.reply(ctx.t('jadibot.usage'))
  let manager
  try {
    manager = await ensureManager(ctx)
  } catch (err) {
    return ctx.reply(ctx.t('jadibot.failed', { message: err.message }))
  }
  let record
  try {
    record = await manager.start(name, number, { sock: ctx.sock, chat: ctx.chat })
  } catch (err) {
    if (err.code === 'INVALID_NAME') return ctx.reply(ctx.t('jadibot.invalidName'))
    if (err.code === 'INVALID_NUMBER') return ctx.reply(ctx.t('jadibot.invalidNumber'))
    if (err.code === 'MAX_SESSIONS') return ctx.reply(ctx.t('jadibot.maxSessions'))
    if (err.code === 'DUPLICATE') return ctx.reply(ctx.t('jadibot.duplicate', { name }))
    return ctx.reply(ctx.t('jadibot.failed', { message: err.message }))
  }
  const body = ctx.t('jadibot.started', {
    name: record.name,
    number: record.number,
    code: record.pairingCode || pairingCodeFor(record.name),
    mood: ctx.say('senang'),
  })
  return sendButtons(ctx.sock, ctx.chat, {
    title: process.env.BOT_NAME || 'KANA',
    body,
    footer: ctx.t('menu.footer'),
    replies: [
      { text: ctx.t('jadibot.btnList'), id: '.listbot' },
      { text: ctx.t('jadibot.btnStop'), id: `.stopjadibot ${record.name}` },
    ],
    textFallback: body,
  })
}