Logo OmniDevvKANA Web
Kembali ke katalog plugin

user

transfer

Kirim koin saldo kamu ke pengguna lain

Send your balance coins to another user

plugins/user/transfer.js

Lokasi file di repo kana-md

2

Perintah termasuk alias

3.4 KB

Ukuran file sumber

4/11/2026

Update terakhir, commit 44f4010

Daftar perintah

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

.transfer.tf

Cara pakai

.transfer <nomor> <jumlah>

Contoh

.transfer 628123456789 500

Kode sumber plugin

Unduh .js

Cara pasang: simpan file ini ke folder plugins/user/ 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 { getProfile, updateProfile } from '../../src/services/user-service.js'

export const config = {
  name: 'transfer',
  alias: ['tf'],
  category: 'user',
  description: { id: 'Kirim koin saldo kamu ke pengguna lain', en: 'Send your balance coins to another user' },
  usage: '.transfer <nomor> <jumlah>',
  example: '.transfer 628123456789 500',
  cooldown: 3,
}

export const i18n = {
  id: {
    transfer: {
      usage: 'Formatnya: .transfer <nomor tujuan> <jumlah>, contoh: .transfer 628123456789 500. Minimal 100 koin yaa~ 💸',
      badNumber: 'Nomor tujuannya harus 9 sampai 15 digit angka yaa~',
      self: 'Ehh, nggak bisa transfer ke diri sendiri dong (≧▽≦) Pilih nomor lain yaa~',
      badAmount: 'Jumlahnya harus angka bulat minimal 100 koin yaa~',
      noBalance: 'Mouu, saldo kamu kurang. Kamu punya {balance} koin, mau kirim {amount} koin (╥﹏╥)',
      done: 'Transfer beres! 💸\nKamu kirim {amount} koin ke {number}.\nSaldo kamu sekarang: {senderBalance} koin\nSaldo penerima sekarang: {receiverBalance} koin\n\n{mood}',
      btnProfile: 'Profil Aku',
      btnMenu: 'Menu User',
    },
  },
  en: {
    transfer: {
      usage: 'Format: .transfer <destination number> <amount>, example: .transfer 628123456789 500. Minimum 100 coins~ 💸',
      badNumber: 'The destination number must be 9 to 15 digits~',
      self: 'Eh, you cannot transfer to yourself (≧▽≦) Pick another number~',
      badAmount: 'The amount must be a whole number of at least 100 coins~',
      noBalance: 'Mouu, your balance is not enough. You have {balance} coins and tried to send {amount} coins (╥﹏╥)',
      done: 'Transfer done! 💸\nYou sent {amount} coins to {number}.\nYour balance now: {senderBalance} coins\nReceiver balance now: {receiverBalance} coins\n\n{mood}',
      btnProfile: 'My Profile',
      btnMenu: 'User Menu',
    },
  },
}

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

export async function handler(ctx) {
  const rawNumber = String(ctx.args[0] ?? '').replace(/\D/g, '')
  const amount = Number(ctx.args[1])
  if (!ctx.args[0] || ctx.args[1] === undefined) return ctx.reply(ctx.t('transfer.usage'))
  if (!/^\d{9,15}$/.test(rawNumber)) return ctx.reply(ctx.t('transfer.badNumber'))
  if (rawNumber === ctx.senderDigits) return ctx.reply(ctx.t('transfer.self'))
  if (!Number.isInteger(amount) || amount < 100) return ctx.reply(ctx.t('transfer.badAmount'))
  const sender = await getProfile(ctx.storage, ctx.senderDigits)
  const senderBalance = sender.balance || 0
  if (senderBalance < amount) return ctx.reply(ctx.t('transfer.noBalance', { balance: senderBalance, amount }))
  const receiver = await getProfile(ctx.storage, rawNumber)
  const updatedSender = await updateProfile(ctx.storage, ctx.senderDigits, { balance: senderBalance - amount })
  const updatedReceiver = await updateProfile(ctx.storage, rawNumber, { balance: (receiver.balance || 0) + amount })
  const body = ctx.t('transfer.done', {
    amount,
    number: rawNumber,
    senderBalance: updatedSender.balance,
    receiverBalance: updatedReceiver.balance,
    mood: ctx.say('sukses'),
  })
  return sendButtons(ctx.sock, ctx.chat, {
    title: 'KANA',
    body,
    footer: ctx.t('menu.footer'),
    replies: [
      { text: ctx.t('transfer.btnProfile'), id: '.profil' },
      { text: ctx.t('transfer.btnMenu'), id: '.menu user' },
    ],
    textFallback: body,
  })
}