Logo OmniDevvKANA Web
Kembali ke katalog plugin

group

welcome

Alihkan sapaan selamat datang grup

Toggle group welcome greeting

plugins/group/welcome.js

Lokasi file di repo kana-md

1

Perintah termasuk alias

4.3 KB

Ukuran file sumber

4/11/2026

Update terakhir, commit ab47575

Daftar perintah

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

.welcome

Cara pakai

.welcome <on|off>

Contoh

.welcome on

Kode sumber plugin

Unduh .js

Cara pasang: simpan file ini ke folder plugins/group/ di bot KANA kamu, lalu restart bot. Pemilik source code lain bisa mengambil update plugin terbaru dari halaman ini kapan saja.

import { readFile } from 'node:fs/promises'
import { dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
import { getGroupSettings, updateGroupSettings } from '../../src/services/group-service.js'
import { getGroupText } from '../../src/services/group-settings.js'
import { renderTemplate } from '../../src/config/templates.js'
import { digitsOf } from '../../src/services/guard-rules.js'

const here = dirname(fileURLToPath(import.meta.url))

export const config = {
  name: 'welcome',
  alias: [],
  category: 'group',
  description: { id: 'Alihkan sapaan selamat datang grup', en: 'Toggle group welcome greeting' },
  usage: '.welcome <on|off>',
  example: '.welcome on',
  cooldown: 3,
  isGroup: true,
  isAdmin: true,
}

export const i18n = {
  id: {
    welcome: {
      changed: 'Siap~ welcome sekarang {state}. {mood}',
      on: 'AKTIF', off: 'mati',
      usage: 'Pakai: .welcome on atau .welcome off yaa~',
      hello: 'Halo halo @{digits}~ Selamat datang di {group}! KANA seneng banget kamu gabung. Jangan lupa baca rules grup yaa, semoga betah! {mood}',
      helloText: 'Halo halo @{digits}~ Selamat datang di {group}! Semoga betah yaa! {mood}',
      bye: 'Dadahh {name} ({digits})~ Makasih udah pernah main di {group}. Semoga sukses selalu yaa, KANA bakal kangen~ {mood}',
      byeText: 'Dadahh {digits}~ Makasih udah pernah gabung di {group}. Semoga sukses selalu yaa~ {mood}',
    },
  },
  en: {
    welcome: {
      changed: 'Got it~ welcome is now {state}. {mood}',
      on: 'ON', off: 'off',
      usage: 'Use: .welcome on or .welcome off~',
      hello: 'Hello hello @{digits}~ Welcome to {group}! KANA is so happy you joined. Please read the group rules, hope you enjoy it here! {mood}',
      helloText: 'Hello hello @{digits}~ Welcome to {group}! Hope you enjoy it here! {mood}',
      bye: 'Bye bye {name} ({digits})~ Thanks for being in {group}. Wishing you success always, KANA will miss you~ {mood}',
      byeText: 'Bye bye {digits}~ Thanks for joining {group}. Wishing you success always~ {mood}',
    },
  },
}

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

export async function handler(ctx) {
  const arg = (ctx.args[0] || '').toLowerCase()
  if (!['on', 'off'].includes(arg)) return ctx.reply(ctx.t('welcome.usage'))
  await updateGroupSettings(ctx.storage, ctx.chat, { welcome: arg === 'on' })
  await ctx.reply(ctx.t('welcome.changed', { state: ctx.t(arg === 'on' ? 'welcome.on' : 'welcome.off'), mood: ctx.say('senang') }))
}

export async function onParticipantsUpdate(ctx) {
  if (ctx.action !== 'add' && ctx.action !== 'remove') return
  const settings = await getGroupSettings(ctx.storage, ctx.chat)
  if (ctx.action === 'add' && !settings.welcome) return
  if (ctx.action === 'remove' && !settings.goodbye) return
  let groupName = ctx.chat
  let meta = null
  try {
    meta = await ctx.getGroupMetadata()
    if (meta?.subject) groupName = meta.subject
  } catch {}
  const count = Array.isArray(meta?.participants) ? meta.participants.length : 0
  const isAdd = ctx.action === 'add'
  const kind = isAdd ? 'welcome' : 'goodbye'
  const template = await getGroupText(ctx.storage, ctx.chat, kind)
  for (const participant of ctx.participants ?? []) {
    const jid = typeof participant === 'string' ? participant : participant?.id || String(participant)
    const digits = digitsOf(jid)
    const rendered = renderTemplate(template, {
      user: isAdd ? `@${digits}` : digits,
      group: groupName,
      count,
    })
    const caption =
      rendered.trim() ||
      ctx.t(isAdd ? 'welcome.hello' : 'welcome.bye', {
        digits, group: groupName, name: digits, mood: ctx.say(isAdd ? 'senang' : 'pamit'),
      })
    const textFallback =
      rendered.trim() ||
      ctx.t(isAdd ? 'welcome.helloText' : 'welcome.byeText', {
        digits, group: groupName, mood: ctx.say(isAdd ? 'senang' : 'pamit'),
      })
    const file = isAdd ? 'welcome.jpg' : 'goodbye.jpg'
    let image = null
    try { image = await readFile(join(here, '../../assets', file)) } catch { image = null }
    try {
      if (image) {
        await ctx.sock.sendMessage(ctx.chat, { image, caption, ...(isAdd ? { mentions: [jid] } : {}) })
      } else if (isAdd) {
        await ctx.sendText(textFallback, [jid])
      } else {
        await ctx.sendText(textFallback)
      }
    } catch {
      // Jangan jatuhkan hook karena satu kiriman gagal.
    }
  }
}