Logo OmniDevvKANA Web
Masuk
Kembali ke katalog plugin

game

hit

Ambil satu kartu lagi di permainan blackjack aktif

Take one more card in your active blackjack game

plugins/game/hit.js

Lokasi file di repo kana-md

1

Perintah termasuk alias

4.3 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.

.hit

Cara pakai

.hit

Contoh

.hit

Kode sumber plugin

Unduh .js

Cara pasang: simpan file ini ke folder plugins/game/ 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'
import { applyHit, handValue, formatHand, payoutFor } from '../../src/services/blackjack.js'

export const config = {
  name: 'hit',
  alias: [],
  category: 'game',
  description: { id: 'Ambil satu kartu lagi di permainan blackjack aktif', en: 'Take one more card in your active blackjack game' },
  usage: '.hit',
  example: '.hit',
  cooldown: 2,
}

export const i18n = {
  id: {
    hit: {
      noGame: 'Belum ada permainan blackjack yang jalan nih. Mulai dulu pakai .blackjack <bet> yaa~ šŸƒ',
      drawn: 'Kamu ambil kartu...\nšŸƒ Kamu ({value}): {hand}\nMasih di bawah 21, mau .hit lagi atau .stand?~',
      bust: 'BUST! šŸ’„ Kamu ({value}): {hand}\nLewat 21, bet {bet} koin melayang... (ā•„ļ¹ā•„) Saldo sekarang {balance} koin.',
      win: 'Menang! šŸŽ‰ Kamu ({pvalue}): {hand}\nDealer ({dvalue}): {dealer}\nTotal kembali {payout} koin. Saldo sekarang {balance} koin~',
      lose: 'Kalah nih... Kamu ({pvalue}): {hand}\nDealer ({dvalue}): {dealer}\nBet {bet} koin melayang. Saldo sekarang {balance} koin (ā•„ļ¹ā•„)',
      push: 'Seri! Kamu ({pvalue}): {hand}\nDealer ({dvalue}): {dealer}\nBet {bet} koin balik utuh. Saldo sekarang {balance} koin~ 🌸',
      btnHit: 'Hit Lagi',
      btnStand: 'Stand',
      btnStart: 'Mulai Blackjack',
      btnAgain: 'Main Lagi',
    },
  },
  en: {
    hit: {
      noGame: 'No blackjack game is running yet. Start one with .blackjack <bet> first~ šŸƒ',
      drawn: 'You draw a card...\nšŸƒ You ({value}): {hand}\nStill under 21, .hit again or .stand?~',
      bust: 'BUST! šŸ’„ You ({value}): {hand}\nOver 21, your {bet} coin bet is gone... (ā•„ļ¹ā•„) Balance now {balance} coins.',
      win: 'You win! šŸŽ‰ You ({pvalue}): {hand}\nDealer ({dvalue}): {dealer}\nTotal return {payout} coins. Balance now {balance} coins~',
      lose: 'You lose... You ({pvalue}): {hand}\nDealer ({dvalue}): {dealer}\nYour {bet} coin bet is gone. Balance now {balance} coins (ā•„ļ¹ā•„)',
      push: 'A push! You ({pvalue}): {hand}\nDealer ({dvalue}): {dealer}\nYour {bet} coin bet returns in full. Balance now {balance} coins~ 🌸',
      btnHit: 'Hit Again',
      btnStand: 'Stand',
      btnStart: 'Start Blackjack',
      btnAgain: 'Play Again',
    },
  },
}

export async function settleAndShow(ctx, state, prefix) {
  const payout = payoutFor(state)
  const profile = await getProfile(ctx.storage, ctx.senderDigits)
  const newBalance = (profile.balance || 0) + payout
  if (payout) await updateProfile(ctx.storage, ctx.senderDigits, { balance: newBalance })
  await ctx.storage.delete('kv', `bj:${ctx.senderDigits}`)
  const vars = {
    pvalue: handValue(state.player),
    hand: formatHand(state.player),
    dvalue: handValue(state.dealer),
    dealer: formatHand(state.dealer),
    bet: state.bet,
    payout,
    balance: newBalance,
    value: handValue(state.player),
  }
  const body =
    state.result === 'bust'
      ? ctx.t(`${prefix}.bust`, vars)
      : ctx.t(`${prefix}.${state.result === 'win' || state.result === 'blackjack' ? 'win' : state.result}`, vars)
  return sendButtons(ctx.sock, ctx.chat, {
    title: 'KANA',
    body,
    footer: ctx.t('menu.footer'),
    replies: [{ text: ctx.t(`${prefix}.btnAgain`), id: `.blackjack ${state.bet}` }],
    textFallback: body,
  })
}

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

export async function handler(ctx) {
  const state = await ctx.storage.get('kv', `bj:${ctx.senderDigits}`)
  if (!state || state.phase !== 'player') {
    const body = ctx.t('hit.noGame')
    return sendButtons(ctx.sock, ctx.chat, {
      title: 'KANA',
      body,
      footer: ctx.t('menu.footer'),
      replies: [{ text: ctx.t('hit.btnStart'), id: '.blackjack 100' }],
      textFallback: body,
    })
  }
  applyHit(state)
  if (state.phase === 'done') return settleAndShow(ctx, state, 'hit')
  await ctx.storage.set('kv', `bj:${ctx.senderDigits}`, state)
  const body = ctx.t('hit.drawn', { value: handValue(state.player), hand: formatHand(state.player) })
  return sendButtons(ctx.sock, ctx.chat, {
    title: 'KANA',
    body,
    footer: ctx.t('menu.footer'),
    replies: [
      { text: ctx.t('hit.btnHit'), id: '.hit' },
      { text: ctx.t('hit.btnStand'), id: '.stand' },
    ],
    textFallback: body,
  })
}