Logo OmniDevvKANA Web
Kembali ke katalog plugin

rpg

clan

Clan RPG: buat clan, gabung clan, dan lihat info clan

RPG clan: create a clan, join a clan, and see clan info

plugins/rpg/clan.js

Lokasi file di repo kana-md

1

Perintah termasuk alias

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

.clan

Cara pakai

.clan | .clan buat <nama> | .clan gabung <id>

Contoh

.clan buat Naga Moe

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 { createClan, joinClan, getClan, clanPower } from '../../src/rpg/engine.js'
import { getProfile } from '../../src/services/user-service.js'

export const config = {
  name: 'clan',
  alias: [],
  category: 'rpg',
  description: { id: 'Clan RPG: buat clan, gabung clan, dan lihat info clan', en: 'RPG clan: create a clan, join a clan, and see clan info' },
  usage: '.clan | .clan buat <nama> | .clan gabung <id>',
  example: '.clan buat Naga Moe',
  cooldown: 5,
}

export const i18n = {
  id: {
    clan: {
      noClan: 'Kamu belum punya clan nih 🥺\nBuat baru: .clan buat <nama>\nGabung yang ada: .clan gabung <id clan>',
      info: '🛡️ CLAN {name} 🛡️\nID: {id}\nPemilik: {owner}\nAnggota: {members} orang\nPower total: {power}\nBank clan: {bank} koin 🏦\n\nAjak clan lain perang pakai .clanwar yaa~',
      created: '🛡️ Clan {name} berhasil dibuat! ID clan: {id}\nAjak teman gabung pakai .clan gabung {id} yaa~\n{mood}',
      joined: '🛡️ Selamat datang di clan {name}! Sekarang kita satu keluarga~\n{mood}',
      already: 'Ehh, kamu udah punya clan lho... satu clan aja yaa 💕',
      taken: 'Mouu, nama clan itu udah dipakai clan lain... coba nama lain yaa 🥺',
      notFound: 'Clan dengan ID {id} nggak ketemu nih... cek lagi ID nya yaa',
      invalidName: 'Nama clannya yang bener dong~ contoh .clan buat Naga Moe',
      needArg: 'Ketik nama atau ID nya juga dong~ contoh .clan buat Naga Moe atau .clan gabung naga-moe',
      btnWar: 'Perang Clan',
      btnProfile: 'Profil RPG',
      btnMenu: 'Menu RPG',
    },
  },
  en: {
    clan: {
      noClan: 'You do not have a clan yet 🥺\nCreate one: .clan buat <name>\nJoin an existing one: .clan gabung <clan id>',
      info: '🛡️ CLAN {name} 🛡️\nID: {id}\nOwner: {owner}\nMembers: {members} people\nTotal power: {power}\nClan bank: {bank} coins 🏦\n\nChallenge other clans with .clanwar~',
      created: '🛡️ Clan {name} created! Clan ID: {id}\nInvite friends with .clan gabung {id}~\n{mood}',
      joined: '🛡️ Welcome to clan {name}! We are one family now~\n{mood}',
      already: 'Eh, you already have a clan... one clan only please 💕',
      taken: 'Mouu, that clan name is taken by another clan... try another name 🥺',
      notFound: 'Clan with ID {id} was not found... check the ID again',
      invalidName: 'Give a proper clan name please~ e.g. .clan buat Naga Moe',
      needArg: 'Type the name or ID too~ e.g. .clan buat Naga Moe or .clan gabung naga-moe',
      btnWar: 'Clan War',
      btnProfile: 'RPG Profile',
      btnMenu: 'RPG Menu',
    },
  },
}

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

export async function handler(ctx) {
  const replies = [
    { text: ctx.t('clan.btnWar'), id: '.clanwar' },
    { text: ctx.t('clan.btnProfile'), id: '.rpg' },
    { text: ctx.t('clan.btnMenu'), id: '.menurpg' },
  ]
  const send = (body) =>
    sendButtons(ctx.sock, ctx.chat, { title: 'KANA RPG', body, footer: ctx.t('menu.footer'), replies, textFallback: body })
  const action = (ctx.args?.[0] || '').toLowerCase()
  if (['buat', 'create', 'bikin'].includes(action)) {
    const name = (ctx.args ?? []).slice(1).join(' ').trim()
    if (!name) return send(ctx.t('clan.invalidName'))
    const res = await createClan(ctx.storage, ctx.senderDigits, name)
    if (res.ok) return send(ctx.t('clan.created', { name: res.clan.name, id: res.clan.id, mood: ctx.say('senang') }))
    if (res.reason === 'already_in_clan') return send(ctx.t('clan.already'))
    if (res.reason === 'name_taken') return send(ctx.t('clan.taken'))
    return send(ctx.t('clan.invalidName'))
  }
  if (['gabung', 'join'].includes(action)) {
    const id = (ctx.args?.[1] || '').toLowerCase()
    if (!id) return send(ctx.t('clan.needArg'))
    const res = await joinClan(ctx.storage, ctx.senderDigits, id)
    if (res.ok) return send(ctx.t('clan.joined', { name: res.clan.name, mood: ctx.say('senang') }))
    if (res.reason === 'already_in_clan') return send(ctx.t('clan.already'))
    return send(ctx.t('clan.notFound', { id }))
  }
  const profile = await getProfile(ctx.storage, ctx.senderDigits)
  if (!profile.clanId) return send(ctx.t('clan.noClan'))
  const clan = await getClan(ctx.storage, profile.clanId)
  if (!clan) return send(ctx.t('clan.noClan'))
  const power = await clanPower(ctx.storage, clan)
  return send(
    ctx.t('clan.info', {
      name: clan.name,
      id: clan.id,
      owner: clan.owner,
      members: (clan.members ?? []).length,
      power,
      bank: clan.bank ?? 0,
    })
  )
}