From 7146370256f3aa9cfad4730fe0f12cfabf10db0a Mon Sep 17 00:00:00 2001 From: Abuzzpoet <76829545+Abuzzpoet@users.noreply.github.com> Date: Tue, 26 Nov 2024 22:09:15 +0700 Subject: [PATCH] Add files via upload --- cmd/owner/backup.js | 96 ++++++++++++++++++++++++++++++++++++++++ cmd/owner/banned.js | 10 +++-- cmd/owner/delpremium.js | 48 ++++++++++++++++++++ cmd/owner/join.js | 59 ++++++++++++++++++++++++ cmd/owner/leave.js | 33 ++++++++++++++ cmd/owner/listbanned.js | 28 +++++++----- cmd/owner/listgroup.js | 55 +++++++++++++++++++++++ cmd/owner/listpremium.js | 45 +++++++++++++++++++ cmd/owner/setbio.js | 2 +- cmd/owner/setlimit.js | 26 +++++++++++ cmd/owner/setname.js | 2 +- cmd/owner/setppbot.js | 73 ++++++++++++++++++++++++++++++ cmd/owner/setpremium.js | 76 +++++++++++++++++++++++++++++++ cmd/owner/unbanned.js | 10 +++-- 14 files changed, 543 insertions(+), 20 deletions(-) create mode 100644 cmd/owner/backup.js create mode 100644 cmd/owner/delpremium.js create mode 100644 cmd/owner/join.js create mode 100644 cmd/owner/leave.js create mode 100644 cmd/owner/listgroup.js create mode 100644 cmd/owner/listpremium.js create mode 100644 cmd/owner/setlimit.js create mode 100644 cmd/owner/setppbot.js create mode 100644 cmd/owner/setpremium.js diff --git a/cmd/owner/backup.js b/cmd/owner/backup.js new file mode 100644 index 0000000..ec960fb --- /dev/null +++ b/cmd/owner/backup.js @@ -0,0 +1,96 @@ +import fs from 'fs' +import path from 'path' +import archiver from 'archiver' + +export default (handler) => { + handler.reg({ + cmd: ['backup', 'b'], + tags: 'owner', + desc: 'Backup files, send to owner', + isOwner: true, + run: async (m, { sock, db }) => { + const excludePatterns = ['.npm', 'node_modules', 'temp', 'package-lock.json'] + const rootDir = process.cwd() + const tempDir = path.join(rootDir, 'temp') + let backupNumber = 1 + + try { + const ownerNumber = db?.setting?.owner + if (!ownerNumber) { + return m.reply('❌ Nomor owner tidak ditemukan di pengaturan.') + } + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }) + } + + const existingBackups = fs.readdirSync(tempDir) + .filter(file => /^backup-\d+\.zip$/.test(file)) + .map(file => parseInt(file.match(/^backup-(\d+)\.zip$/)[1], 10)) + .sort((a, b) => b - a) + if (existingBackups.length > 0) { + backupNumber = existingBackups[0] + 1 + } + const backupFilename = `backup-${backupNumber}.zip` + const output = fs.createWriteStream(path.join(tempDir, backupFilename)) + const archive = archiver('zip', { zlib: { level: 9 } }) + output.on('close', async () => { + console.log(`✅ File backup selesai: ${backupFilename}`) + const fileSizeInBytes = archive.pointer() + const fileSizeInKB = (fileSizeInBytes / 1024).toFixed(2) // KB + const fileSizeInMB = (fileSizeInKB / 1024).toFixed(2) // MB + + let fileSize + if (fileSizeInMB >= 1) { + fileSize = `${fileSizeInMB} MB` + } else if (fileSizeInKB >= 1) { + fileSize = `${fileSizeInKB} KB` + } + try { + await sock.sendMessage(ownerNumber + '@s.whatsapp.net', { + document: { url: path.join(tempDir, backupFilename) }, + mimetype: 'application/zip', + fileName: backupFilename, + caption: `🔒 Backup berhasil!\nNama file: ${backupFilename}\nUkuran: ${fileSize}.`, + }) + + m.reply(`✅ Backup selesai dan telah dikirim ke owner.`) + + } catch (err) { + m.reply(`❌ Gagal mengirim file backup ke owner: ${err.message}`) + } + }) + + archive.on('error', (err) => { + throw err + }) + + archive.pipe(output) + + const addToArchive = (src) => { + const items = fs.readdirSync(src) + + for (const item of items) { + const sourcePath = path.join(src, item) + if (excludePatterns.some(pattern => item.includes(pattern))) { + console.log(`⏩ Melewati: ${item}`) + continue + } + const stats = fs.statSync(sourcePath) + if (stats.isDirectory()) { + archive.directory(sourcePath, item) + console.log(`📁 Menambahkan folder: ${item}`) + } else if (stats.isFile()) { + archive.file(sourcePath, { name: item }) + console.log(`✅ Menambahkan file: ${item}`) + } + } + } + + addToArchive(rootDir) + archive.finalize() + } catch (error) { + m.reply(`❌ Terjadi kesalahan: ${error.message}`) + } + }, + }) +} diff --git a/cmd/owner/banned.js b/cmd/owner/banned.js index 8ed8b6e..490901d 100644 --- a/cmd/owner/banned.js +++ b/cmd/owner/banned.js @@ -2,7 +2,7 @@ export default (handler) => { handler.reg({ cmd: ['ban', 'banned'], tags: 'owner', - desc: 'Ban multiple users', + desc: 'Ban users', isOwner: true, run: async (m, { db, sock }) => { const input = m.text ? m.text : m.quoted ? m.quoted.sender : m.mentions.length > 0 ? m.mentions[0] : false @@ -15,8 +15,10 @@ export default (handler) => { return m.reply('⚠️ Users tersebut tidak ditemukan terdaftar dalam database.', true) } set.banned = true - m.reply(`✅ Pengguna ${input} telah di-banned.`, true) - }, + m.reply({ + text: `✅ Pengguna @${jid.split('@')[0]} telah di-banned.`, + mentions: [jid], + }) }, - ) + }) } diff --git a/cmd/owner/delpremium.js b/cmd/owner/delpremium.js new file mode 100644 index 0000000..d4f518b --- /dev/null +++ b/cmd/owner/delpremium.js @@ -0,0 +1,48 @@ +export default (handler) => { + handler.reg({ + cmd: ['delpremium', 'delprem', 'removepremium'], + tags: 'owner', + desc: 'delete premium user.', + isOwner: true, + run: async (m, { db, sock }) => { + const input = m.text ? m.text : m.quoted ? m.quoted.sender : m.mentions.length > 0 ? m.mentions[0] : false + if (!input) { + return m.reply( + 'Silakan tag atau reply target untuk dihapus status premiumnya.\nContoh: .delpremium @user', + true + ) + } + + // Mengecek apakah nomor terdaftar di WhatsApp + const p = await sock.onWhatsApp(input.trim()) + if (p.length === 0) return m.reply('⚠️ Nomor tidak terdaftar di WhatsApp.', true) + + // Mendapatkan JID dan mencari pengguna di database + const jid = sock.decodeJid(p[0].jid) + const user = db.users[jid] + + // Jika pengguna tidak ditemukan + if (!user) { + return m.reply('⚠️ Pengguna tersebut tidak ditemukan dalam database.', true) + } + + // Hapus status premium dan atur ulang limit + user.premium = false + user.exp_prem = -1 + user.limit = 10 + + // Kirim pesan konfirmasi + const removeMessage = { + text: `❌ Pengguna @${jid.split('@')[0]} telah dihapus status premiumnya.\nLimit pengguna sekarang diatur menjadi 10.`, + mentions: [jid], + } + + m.reply(removeMessage) + + // Simpan perubahan ke database + if (db && db.write) { + await db.write() + } + }, + }) +} diff --git a/cmd/owner/join.js b/cmd/owner/join.js new file mode 100644 index 0000000..a7cf09e --- /dev/null +++ b/cmd/owner/join.js @@ -0,0 +1,59 @@ +export default (handler) => { + handler.reg({ + cmd: ['join'], + tags: 'owner', + desc: 'Join a group using an invite link', + isOwner: true, + run: async (m, { sock }) => { + try { + const text = m.text && m.text.trim() + if (!text) { + m.reply('❌ Harap berikan tautan undangan grup yang valid.\n\n*Penggunaan:*\n.join https://chat.whatsapp.com/XXXXXX') + return + } + + const inviteCode = text.split("https://chat.whatsapp.com/")[1] + if (!inviteCode) { + m.reply('❌ Tautan undangan grup tidak valid. Harap berikan tautan yang benar.') + return + } + + const groupId = await sock.groupAcceptInvite(inviteCode).catch((err) => { + if (err.message.includes('already in group')) { + throw new Error('Bot sudah menjadi anggota grup ini.') + } + throw err + }) + + const groupMeta = await sock.groupMetadata(groupId) + const groupName = groupMeta.subject || 'grup tersebut' + const groupAdmins = groupMeta.participants + .filter((p) => ['admin', 'superadmin'].includes(p.admin)) + .map((p) => p.id) + + if (groupAdmins.length === 0) { + m.reply(`✅ Bot berhasil bergabung ke grup *${groupName}*.\nNamun, tidak ada admin untuk memberi bot akses sebagai admin.`) + return + } + + const adminMessage = `✅ Bot telah bergabung ke grup *${groupName}*.\n\nAdmin, silakan berikan akses admin kepada bot jika diperlukan.` + + for (const admin of groupAdmins) { + try { + await sock.sendMessage(admin, { text: adminMessage }) + } catch (err) { + m.reply(`❌ Gagal mengirim pesan ke admin: @${admin.split('@')[0]} (${err.message})`) + } + } + + m.reply(`🔄 Permintaan telah dikirim ke admin grup untuk memberikan akses admin kepada bot di grup *${groupName}*.`) + } catch (error) { + if (error.message === 'Bot sudah menjadi anggota grup ini.') { + m.reply('⚠️ Bot sudah berada di grup ini.') + } else { + m.reply(`❌ Terjadi kesalahan: ${error.message}`) + } + } + }, + }) +} diff --git a/cmd/owner/leave.js b/cmd/owner/leave.js new file mode 100644 index 0000000..0e9beda --- /dev/null +++ b/cmd/owner/leave.js @@ -0,0 +1,33 @@ +export default (handler) => { + handler.reg({ + cmd: ['leave'], + tags: 'owner', + desc: 'leave the group', + isOwner: true, + isGroup: true, + run: async (m, { sock, db }) => { + try { + const groupId = m.from + const groupMeta = await sock.groupMetadata(groupId) + const groupName = groupMeta.subject + const ownerNumber = db?.setting?.owner + if (!ownerNumber) { + return m.reply('❌ Nomor owner tidak ditemukan di pengaturan.') + } + + await sock.sendMessage(groupId, { + text: `⚠️ Bot akan keluar dari grup *${groupName}* dalam beberapa detik.` + }) + + await sock.sendMessage(ownerNumber + '@s.whatsapp.net', { + text: `⚠️ Bot akan keluar dari grup *${groupName}*\n(${groupId}).` + }) + + await sock.groupLeave(groupId) + m.reply(`✅ Bot telah keluar dari grup *${groupName}*.`) + } catch (error) { + m.reply(`❌ Terjadi kesalahan: ${error.message}`) + } + }, + }) +} diff --git a/cmd/owner/listbanned.js b/cmd/owner/listbanned.js index 86b0a48..b7cccb5 100644 --- a/cmd/owner/listbanned.js +++ b/cmd/owner/listbanned.js @@ -8,17 +8,25 @@ export default (handler) => { try { const bannedUsers = Object.entries(db.users || {}) .filter(([_, data]) => data.banned) - .map(([jid, data], i) => `${i + 1}. ${data.name || 'Tanpa Nama'} (${jid})`) - if (bannedUsers.length === 0) { - return m.reply('Tidak ada pengguna yang di-banned.', true) - } - - m.reply(`Daftar Pengguna yang Di-banned:\n\n${bannedUsers.join('\n')}`) - } catch (error) { - m.reply(`❌ Terjadi kesalahan: ${error.message}`) + if (bannedUsers.length === 0) { + return m.reply('Tidak ada pengguna yang di-banned.', true) } - }, + + let teks = `𖦏 *DAFTAR PENGGUNA YANG DI-BANNED*\n\n` + let mentions = [] + + bannedUsers.forEach(([jid, data], i) => { + const name = data.name || 'Tanpa Nama' + const tag = '@' + jid.split('@')[0] + teks += `${i + 1}. ${name} (${tag})\n` + mentions.push(jid) + }) + + m.reply(teks, null, { mentions }) + } catch (error) { + m.reply(`❌ Terjadi kesalahan: ${error.message}`) + } }, - ) + }) } diff --git a/cmd/owner/listgroup.js b/cmd/owner/listgroup.js new file mode 100644 index 0000000..4fa3723 --- /dev/null +++ b/cmd/owner/listgroup.js @@ -0,0 +1,55 @@ +import moment from 'moment-timezone' + +export default (handler) => { + handler.reg({ + cmd: ['listgrup', 'listgc', 'listgroup'], + tags: 'owner', + desc: 'List groups connected with bot', + isOwner: true, + run: async (m, { sock }) => { + try { + // Mengambil daftar semua grup yang bot ikuti + const groups = await sock.groupFetchAllParticipating() + const groupList = Object.values(groups) + + if (groupList.length === 0) { + return m.reply('⚠️ Bot tidak terhubung dengan grup mana pun.') + } + + // Menyusun informasi grup + let teks = `𖦏 *LIST GROUP CHAT*\n\nTotal Grup: ${groupList.length} Grup\n\n` + let mentions = [] // Menyimpan semua mention + + for (let i = 0; i < groupList.length; i++) { + const group = groupList[i] + const metadata = await sock.groupMetadata(group.id).catch(() => null) + + if (metadata) { + teks += `𖥔 Nama: ${metadata.subject}\n` + if (metadata.owner !== undefined) { + const ownerJid = metadata.owner + const ownerTag = '@' + ownerJid.split('@')[0] + teks += `𖥔 Owner: ${ownerTag}\n` + mentions.push(ownerJid) // Menambahkan owner ke daftar mention + } else { + teks += `𖥔 Owner: Tidak diketahui\n` + } + teks += `𖥔 ID: ${metadata.id}\n` + teks += `𖥔 Dibuat: ${moment(metadata.creation * 1000) + .tz('Asia/Jakarta') + .format('DD/MM/YYYY HH:mm:ss')}\n` + teks += `𖥔 Member: ${metadata.participants.length}\n` + teks += `────────────────────────\n\n` + } else { + teks += `${i + 1}. *${group.subject}*\n(ID: ${group.id})\n\n` + } + } + + // Mengirim balasan dengan mention + m.reply(teks, null, { mentions }) + } catch (error) { + m.reply(`❌ Terjadi kesalahan: ${error.message}`) + } + }, + }) +} diff --git a/cmd/owner/listpremium.js b/cmd/owner/listpremium.js new file mode 100644 index 0000000..9b9c704 --- /dev/null +++ b/cmd/owner/listpremium.js @@ -0,0 +1,45 @@ +import moment from "moment-timezone" +import { checkPremiumUser, getPremiumExpired, getAllPremiumUser } from "../../system/db/premium.js" + +export default (handler) => { + handler.reg({ + cmd: ['listpremium', 'listprem', 'premiumlist'], + tags: 'owner', + desc: 'list premium user.', + isOwner: true, + run: async (m, { db }) => { + const premiumUsers = getAllPremiumUser(db) // Mendapatkan semua pengguna premium + + if (premiumUsers.length === 0) { + return m.reply('❌ Tidak ada pengguna premium saat ini.') + } + + let message = '*📋 Daftar Pengguna Premium:*\n\n' + premiumUsers.forEach((userId, index) => { + // Cek ulang apakah status premium valid + const isValidPremium = checkPremiumUser(userId, db) + if (!isValidPremium) return // Skip jika premium tidak valid + + const user = db.users[userId] + const expTime = getPremiumExpired(userId, db) + + const expiryDate = expTime === 0 + ? 'Tanpa Batas Waktu' + : moment(expTime).tz('Asia/Jakarta').format('HH:mm:ss [WIB], DD MMMM YYYY') + + message += `*${index + 1}. ${user.name || 'Tidak Diketahui'}* (@${userId.split('@')[0]})\n` + message += ` └ Expired: ${expiryDate}\n\n` + }) + + if (message.trim() === '*📋 Daftar Pengguna Premium:*\n\n') { + // Jika semua premium sudah kedaluwarsa + return m.reply('❌ Tidak ada pengguna premium yang valid saat ini.') + } + + m.reply({ + text: message.trim(), + mentions: premiumUsers, // Memastikan semua pengguna premium disebutkan + }) + }, + }) +} diff --git a/cmd/owner/setbio.js b/cmd/owner/setbio.js index 1dcdc23..0f6749f 100644 --- a/cmd/owner/setbio.js +++ b/cmd/owner/setbio.js @@ -6,7 +6,7 @@ export default (handler) => { isOwner: true, run: async (m, { sock }) => { if (!m.text) { - return m.reply('Silahkan berikan bio bot anda\ncontoh: .setbiobot MyWaBot', true) + return m.reply('Silahkan berikan bio bot anda\ncontoh: .setbiobot Shiroko', true) } sock.updateProfileStatus(m.text) m.reply(`bio bot berhasil berganti menjadi, ${m.text}`) diff --git a/cmd/owner/setlimit.js b/cmd/owner/setlimit.js new file mode 100644 index 0000000..0bc09bc --- /dev/null +++ b/cmd/owner/setlimit.js @@ -0,0 +1,26 @@ +export default (handler) => { + handler.reg({ + cmd: ['setlimit', 'limit'], + tags: 'owner', + desc: 'Set limit for users', + isOwner: true, + run: async (m, { db, sock }) => { + let [input, limit] = m.text.split(",") + if (!input && !limit) return m.reply('Silakan tentukan pengguna dan limit yang ingin diterapkan.\nContoh: .limit @user,1000', true) + if (!input || !limit) return m.reply('Perintah salah. Format yang benar\n.limit @user,1000', true) + const p = await sock.onWhatsApp(input.trim()) + if (p.length == 0) return m.reply('⚠️ Nomor tidak terdaftar di WhatsApp', true) + const jid = sock.decodeJid(p[0].jid) + const set = db.users[jid] + if (!set) { + return m.reply('⚠️ Pengguna tersebut tidak ditemukan dalam database.', true) + } + + set.limit = parseInt(limit) + m.reply({ + text: `✅ Pengguna @${jid.split('@')[0]} telah diberi limit sebesar ${limit}.`, + mentions: [jid], + }) + }, + }) +} diff --git a/cmd/owner/setname.js b/cmd/owner/setname.js index b191c21..7fa362d 100644 --- a/cmd/owner/setname.js +++ b/cmd/owner/setname.js @@ -6,7 +6,7 @@ export default (handler) => { isOwner: true, run: async (m, { sock }) => { if (!m.text) { - return m.reply('Silahkan berikan nama bot anda\ncontoh: .setnamabot MyWaBot', true) + return m.reply('Silahkan berikan nama bot anda\ncontoh: .setnamabot Shiroko', true) } sock.updateProfileName(m.text) m.reply(`Nama bot berhasil berganti menjadi, @${m.text}`) diff --git a/cmd/owner/setppbot.js b/cmd/owner/setppbot.js new file mode 100644 index 0000000..79ee9f7 --- /dev/null +++ b/cmd/owner/setppbot.js @@ -0,0 +1,73 @@ +import fs from 'fs' +import { S_WHATSAPP_NET } from 'baileys' + +export default (handler) => { + handler.reg({ + cmd: ['setppbot', 'setpp'], + tags: 'group', + desc: 'Set Profile Picture for Bot', + isOwner: true, + run: async (m, { sock, db, func }) => { + try { + const botNumber = `${db.setting.number}@s.whatsapp.net` + const quoted = m.quoted ? m.quoted : m + const mime = (quoted.msg || quoted).mimetype || "" + + // Periksa apakah gambar valid + if (!/image/.test(mime)) { + return m.reply("❌ Harap kirim atau reply gambar untuk mengganti foto profil bot.") + } + + // Unduh media (gambar) + let media = await sock.downloadMediaMessage(m.quoted, `${Date.now()}`) + if (!media) { + return m.reply("❌ Gagal mengunduh gambar. Pastikan media masih tersedia.") + } + + if (m.text === 'panjang') { + // Mode "panjang" + try { + + // Proses gambar menggunakan generateProfilePicture + const { img } = await func.generateProfilePicture(media) + + // Kirim query untuk mengganti foto profil bot + await sock.query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'w:profile:picture', + }, + content: [ + { + tag: 'picture', + attrs: { type: 'image' }, + content: img, + }, + ], + }) + + + m.reply("✅ Berhasil mengganti foto profil bot dengan gambar panjang!") + } catch (error) { + m.reply(`❌ Terjadi kesalahan saat mengganti foto profil panjang: ${error.message}`) + } + } else { + // Mode default + try { + await sock.updateProfilePicture(botNumber, { url: media }) + m.reply("✅ Berhasil mengganti foto profil bot!") + } catch (error) { + m.reply(`❌ Terjadi kesalahan saat mengganti foto profil bot: ${error.message}`) + } + } + + // Hapus file sementara + fs.unlinkSync(media) + } catch (error) { + m.reply(`❌ Terjadi kesalahan: ${error.message}`) + } + }, + }) +} \ No newline at end of file diff --git a/cmd/owner/setpremium.js b/cmd/owner/setpremium.js new file mode 100644 index 0000000..64189b4 --- /dev/null +++ b/cmd/owner/setpremium.js @@ -0,0 +1,76 @@ +import moment from "moment-timezone" +import { addPremiumUser, checkPremiumUser } from "../../system/db/premium.js" + +export default (handler) => { + handler.reg({ + cmd: ['setpremium', 'setprem', 'premium', 'prem'], + tags: 'owner', + desc: 'Set premium status for users', + isOwner: true, + run: async (m, { db, sock }) => { + const [input, days] = m.text.split(',').map(i => i.trim()) + if (!input) { + return m.reply( + '❓ *Cara Penggunaan:*\n' + + '- Untuk memberikan premium: `.premium @user,7`\n' + + '- Untuk tanpa batas waktu: `.premium @user,0`\n' + + 'Durasi yang valid: 1, 3, 7, 14, atau 30 hari.', + true + ) + } + + const validDurations = [1, 3, 7, 14, 30] + let premiumDuration + + if (days?.toLowerCase() === 'unlimited') { + premiumDuration = 'PERMANENT' + } else { + const duration = parseInt(days) + if (isNaN(duration) || !validDurations.includes(duration)) { + return m.reply('⚠️ Durasi tidak valid. Pilih antara 1, 3, 7, 14, atau 30 hari.', true) + } + premiumDuration = duration * 24 * 60 * 60 * 1000 + } + + const p = await sock.onWhatsApp(input.trim()) + if (p.length === 0) { + return m.reply('⚠️ Nomor tidak terdaftar di WhatsApp.', true) + } + + const jid = sock.decodeJid(p[0].jid) + const user = db.users[jid] + + if (!user) { + return m.reply('⚠️ Pengguna tidak ditemukan dalam database.', true) + } + + // Tambahkan pengguna sebagai premium dan reset limit jika kedaluwarsa + try { + const isExpired = !checkPremiumUser(jid, db) + addPremiumUser(jid, premiumDuration, db, isExpired) + } catch (error) { + return m.reply(`⚠️ Terjadi kesalahan: ${error.message}`) + } + + const expiryDate = premiumDuration === 'PERMANENT' + ? 'Tanpa Batas Waktu' + : moment(Date.now() + premiumDuration).tz('Asia/Jakarta').format('HH:mm:ss [WIB], DD MMMM') + + const premiumMessage = premiumDuration === 'PERMANENT' + ? { + text: `✅ Pengguna @${jid.split('@')[0]} telah menjadi pengguna premium *tanpa batas waktu*.\nLimit premium: ${isExpired ? 10 : 100}.`, + mentions: [jid], + } + : { + text: `✅ Pengguna @${jid.split('@')[0]} telah menjadi pengguna premium selama *${days} hari*.\nPremium berakhir pada: *${expiryDate}*.\nLimit premium: ${isExpired ? 10 : 100}.`, + mentions: [jid], + } + + m.reply(premiumMessage) + + if (db && db.write) { + await db.write() + } + }, + }) +} diff --git a/cmd/owner/unbanned.js b/cmd/owner/unbanned.js index cbc841f..7428926 100644 --- a/cmd/owner/unbanned.js +++ b/cmd/owner/unbanned.js @@ -2,7 +2,7 @@ export default (handler) => { handler.reg({ cmd: ['unban', 'unbanned'], tags: 'owner', - desc: 'Unban a user', + desc: 'Unban user', isOwner: true, run: async (m, { db, sock }) => { const input = m.text ? m.text : m.quoted ? m.quoted.sender : m.mentions.length > 0 ? m.mentions[0] : false @@ -15,8 +15,10 @@ export default (handler) => { return m.reply('⚠️ Users tersebut tidak ditemukan terdaftar dalam database.', true) } set.banned = false - m.reply(`✅ Pengguna ${input} telah di-unbanned.`, true) - }, + m.reply({ + text: `✅ Pengguna @${jid.split('@')[0]} telah di-unbanned.`, + mentions: [jid], + }) }, - ) + }) }