Logo OmniDevvKANA Web
Kembali ke katalog plugin

main

webcode

Minta kode login dashboard web (berlaku 10 menit, sekali pakai)

Request a web dashboard login code (valid 10 minutes, single use)

plugins/main/webcode.js

Lokasi file di repo kana-md

2

Perintah termasuk alias

3.5 KB

Ukuran file sumber

4/11/2026

Update terakhir, commit 11eb12a

Daftar perintah

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

.webcode.loginweb

Cara pakai

.webcode

Contoh

.webcode

Kode sumber plugin

Unduh .js

Cara pasang: simpan file ini ke folder plugins/main/ 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 { createWebCode } from '../../src/services/web-login.js'

// Jalur cadangan login web: user meminta kode langsung dari WhatsApp
// lewat .webcode, lalu mengetik kode itu di halaman login dashboard.
// Kode disimpan sebagai hash di namespace 'web_login' (lihat
// src/services/web-login.js dan docs/WEB.md) dan kode mentahnya hanya
// muncul di balasan chat ini. Kode TIDAK PERNAH ditulis ke log.
//
// Soal tombol salin: MB.Button dari library memang mendukung addCopy
// (cta_copy), tetapi helper proyek src/ui/buttons.js saat ini hanya
// mengekspor sendButtons yang membangun quick_reply lewat addReply.
// Menyelipkan cta_copy di pesan yang sama juga melanggar aturan library
// (quick_reply tidak boleh dicampur jenis tombol lain). Jadi untuk
// sekarang kode dikirim sebagai teks biasa yang gampang disalin manual,
// disusul pesan tombol quick_reply [.menu] saja. Keterbatasan ini juga
// dicatat di docs/WEB.md; bila buttons.js nanti mengekspor pembangun
// cta_copy, plugin ini yang disesuaikan.
export const config = {
  name: 'webcode',
  alias: ['loginweb'],
  category: 'main',
  description: {
    id: 'Minta kode login dashboard web (berlaku 10 menit, sekali pakai)',
    en: 'Request a web dashboard login code (valid 10 minutes, single use)',
  },
  usage: '.webcode',
  example: '.webcode',
  cooldown: 30,
}

export const i18n = {
  id: {
    webcode: {
      body:
        'Kode login web kamu udah KANA bikin nih~ {mood}\n\nKode kamu:\n{code}\n\nBuka {url} lalu ketik kode itu yaa. Kodenya berlaku {minutes} menit dan cuma bisa dipakai sekali. Kode lama kamu langsung hangus tiap kode baru dibuat.\nJangan bagi kode ini ke siapa pun, rahasia kita berdua aja~ (⁄ ⁄>⁄ ▽ ⁄<⁄ ⁄) 💕',
      follow: 'Kode di atas tinggal kamu salin terus tempel di halaman login yaa~ Mau balik jalan-jalan di bot? Pencet tombol di bawah ini aja (≧▽≦) ✨',
      btnMenu: 'Menu Utama',
      noNumber: 'Mouu, KANA nggak bisa baca nomor kamu nih... coba lagi dari chat pribadi yaa~ (╥﹏╥)',
    },
  },
  en: {
    webcode: {
      body:
        'Your web login code is ready~ {mood}\n\nYour code:\n{code}\n\nOpen {url} and type that code in. It stays valid for {minutes} minutes and can only be used once. Your previous code stops working the moment a new one is made.\nDo not share this code with anyone, keep it just between us~ (⁄ ⁄>⁄ ▽ ⁄<⁄ ⁄) 💕',
      follow: 'Just copy the code above and paste it on the login page~ Want to wander around the bot again? Tap the button below (≧▽≦) ✨',
      btnMenu: 'Main Menu',
      noNumber: 'Mouu, KANA could not read your number... please try again from a private chat~ (╥﹏╥)',
    },
  },
}

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

export async function handler(ctx) {
  const digits = ctx.senderDigits || String(ctx.sender ?? '').replace(/\D/g, '')
  if (!digits) return ctx.reply(ctx.t('webcode.noNumber'))
  const { code } = await createWebCode(ctx.storage, digits)
  const url = process.env.WEB_LOGIN_URL?.trim() || 'https://kana.omnicorp.web.id/login'
  const body = ctx.t('webcode.body', { code, url, minutes: 10, mood: ctx.say('senang') })
  // Teks biasa dulu (isi kode), supaya kode tetap sampai walau tombol gagal.
  await ctx.reply(body)
  return sendButtons(ctx.sock, ctx.chat, {
    title: 'KANA',
    body: ctx.t('webcode.follow'),
    footer: ctx.t('menu.footer'),
    replies: [{ text: ctx.t('webcode.btnMenu'), id: '.menu' }],
    textFallback: ctx.t('webcode.follow'),
  })
}