Logo OmniDevvKANA Web
Kembali ke katalog plugin

user

level

Lihat level dan XP kamu secara detail

See your level and XP in detail

plugins/user/level.js

Lokasi file di repo kana-md

2

Perintah termasuk alias

1.8 KB

Ukuran file sumber

4/11/2026

Update terakhir, commit a0f6049

Daftar perintah

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

.level.lvl

Cara pakai

.level

Contoh

.level

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, levelFromXp, xpForLevel } from '../../src/services/user-service.js'

export const config = {
  name: 'level',
  alias: ['lvl'],
  category: 'user',
  description: { id: 'Lihat level dan XP kamu secara detail', en: 'See your level and XP in detail' },
  usage: '.level',
  example: '.level',
  cooldown: 3,
}

export const i18n = {
  id: {
    level: {
      detail:
        'Level kamu sekarang: {level}\nXP total: {xp}\nProgres level ini: {progress}/{needed} XP ({percent}%)\nSisa ke level {nextLevel}: {toNext} XP lagi. Semangat yaa~ {mood}',
      btnLeaderboard: 'Leaderboard',
      btnProfile: 'Profil Aku',
    },
  },
  en: {
    level: {
      detail:
        'Your current level: {level}\nTotal XP: {xp}\nThis level progress: {progress}/{needed} XP ({percent}%)\nLeft to level {nextLevel}: {toNext} more XP. Keep going~ {mood}',
      btnLeaderboard: 'Leaderboard',
      btnProfile: 'My Profile',
    },
  },
}

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

export async function handler(ctx) {
  const profile = await getProfile(ctx.storage, ctx.senderDigits)
  const xp = profile.xp || 0
  const level = levelFromXp(xp)
  const base = xpForLevel(level)
  const next = xpForLevel(level + 1)
  const progress = Math.max(0, xp - base)
  const needed = Math.max(1, next - base)
  const body = ctx.t('level.detail', {
    level,
    xp,
    progress,
    needed,
    percent: Math.floor((progress / needed) * 100),
    nextLevel: level + 1,
    toNext: Math.max(0, next - xp),
    mood: ctx.say('senang'),
  })
  return sendButtons(ctx.sock, ctx.chat, {
    title: 'KANA',
    body,
    footer: ctx.t('menu.footer'),
    replies: [
      { text: ctx.t('level.btnLeaderboard'), id: '.leaderboard' },
      { text: ctx.t('level.btnProfile'), id: '.profil' },
    ],
    textFallback: body,
  })
}