Logo OmniDevvKANA Web
Kembali ke katalog plugin

rpg

duel

Duel RPG lawan pemain lain, pemenang merebut sampai 100 koin

RPG duel against another player, winner takes up to 100 coins

plugins/rpg/duel.js

Lokasi file di repo kana-md

1

Perintah termasuk alias

2.7 KB

Ukuran file sumber

4/11/2026

Update terakhir, commit eae5127

Daftar perintah

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

.duel

Cara pakai

.duel @tag | .duel <nomor>

Contoh

.duel 6281234567890

Kode sumber plugin

Unduh .js

Cara pasang: simpan file ini ke folder plugins/rpg/ 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 { duel } from '../../src/rpg/engine.js'

export const config = {
  name: 'duel',
  alias: [],
  category: 'rpg',
  description: { id: 'Duel RPG lawan pemain lain, pemenang merebut sampai 100 koin', en: 'RPG duel against another player, winner takes up to 100 coins' },
  usage: '.duel @tag | .duel <nomor>',
  example: '.duel 6281234567890',
  cooldown: 10,
}

export const i18n = {
  id: {
    duel: {
      noTarget: 'Mau duel lawan siapa nih? Tag orangnya atau ketik nomornya, contoh .duel @teman yaa~',
      self: 'Ehh, masa duel lawan diri sendiri... KANA nggak tega liatnya 🥺',
      result: '⚔️ HASIL DUEL ⚔️\nKamu (power {powerA}) vs lawan (power {powerB})\n{verdict}\nKoin berpindah: {coins} 💰\n{mood}',
      win: '🎉 Kamu menang! Kerja bagus, jagoan KANA~',
      lose: 'Mouu, kamu kalah kali ini... latih power di .dungeon dulu yaa 🥺',
      btnDungeon: 'Dungeon',
      btnProfile: 'Profil RPG',
      btnMenu: 'Menu RPG',
    },
  },
  en: {
    duel: {
      noTarget: 'Who do you want to duel? Tag them or type their number, e.g. .duel @friend~',
      self: 'Eh, dueling yourself... KANA cannot watch that 🥺',
      result: '⚔️ DUEL RESULT ⚔️\nYou (power {powerA}) vs opponent (power {powerB})\n{verdict}\nCoins moved: {coins} 💰\n{mood}',
      win: '🎉 You won! Great job, my champion~',
      lose: 'Mouu, you lost this time... raise your power in .dungeon first 🥺',
      btnDungeon: 'Dungeon',
      btnProfile: 'RPG Profile',
      btnMenu: 'RPG Menu',
    },
  },
}

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

export async function handler(ctx) {
  const replies = [
    { text: ctx.t('duel.btnDungeon'), id: '.dungeon' },
    { text: ctx.t('duel.btnProfile'), id: '.rpg' },
    { text: ctx.t('duel.btnMenu'), id: '.menurpg' },
  ]
  const send = (body) =>
    sendButtons(ctx.sock, ctx.chat, { title: 'KANA RPG', body, footer: ctx.t('menu.footer'), replies, textFallback: body })
  let target = ''
  if (ctx.mentionedJids?.length) target = String(ctx.mentionedJids[0]).split('@')[0].replace(/\D/g, '')
  if (!target && ctx.quoted?.sender) {
    target = String(ctx.quoted.sender).split('@')[0].replace(/\D/g, '')
  }
  if (!target) target = String(ctx.args?.[0] ?? '').replace(/\D/g, '')
  if (!target) return send(ctx.t('duel.noTarget'))
  if (target === ctx.senderDigits) return send(ctx.t('duel.self'))
  const res = await duel(ctx.storage, ctx.senderDigits, target)
  const won = res.winner === ctx.senderDigits
  const body = ctx.t('duel.result', {
    powerA: res.powerA,
    powerB: res.powerB,
    verdict: won ? ctx.t('duel.win') : ctx.t('duel.lose'),
    coins: res.coins,
    mood: won ? ctx.say('senang') : ctx.say('gagal'),
  })
  return send(body)
}