const {
default: makeWASocket,
useMultiFileAuthState,
DisconnectReason,
fetchLatestBaileysVersion,
jidDecode,
makeCacheableSignalKeyStore
} = require('@whiskeysockets/baileys');
const pino = require('pino');
const fs = require('fs');
const qrcode = require('qrcode-terminal');
const axios = require('axios');
const { performance } = require('perf_hooks');
// ================= [ DATABASE SYSTEM ] =================
if (!fs.existsSync('./user_data.json')) fs.writeFileSync('./user_data.json', JSON.stringify({}));
if (!fs.existsSync('./settings.json')) fs.writeFileSync('./settings.json', JSON.stringify({ selfMode: false, autoOnly: false }));
if (!fs.existsSync('./sessions_bots')) fs.mkdirSync('./sessions_bots');
let db_user = JSON.parse(fs.readFileSync('./user_data.json'));
let settings = JSON.parse(fs.readFileSync('./settings.json'));
// Storage Game & Bots & Cooldown
let gameZenix = {};
let afkData = {};
let tebakBom = {};
let tictactoe = {};
let activeBots = {};
let jokiCooldown = new Set();
let dungeonCooldown = new Set();
const saveDB = () => fs.writeFileSync('./user_data.json', JSON.stringify(db_user, null, 2));
const saveSettings = () => fs.writeFileSync('./settings.json', JSON.stringify(settings, null, 2));
// ================= [ DATA GAME ] =================
const pokemonData = {
'BIASA': { harga: 1000, list: ['Caterpie', 'Pidgey', 'Rattata', 'Zubat', 'Magikarp'] },
'COMMON': { harga: 3000, list: ['Bulbasaur', 'Charmander', 'Squirlte', 'Pikachu', 'Eevee'] },
'EPIC': { harga: 7000, list: ['Gengar', 'Gyarados', 'Arcanine', 'Snorlax', 'Dragonite'] },
'PRO': { harga: 10000, list: ['Lucario', 'Garchomp', 'Gardevoir', 'Greninja', 'Zoroark'] },
'LEGENDARY': { harga: 15000, list: ['Mewtwo', 'Lugia', 'Rayquaza', 'Kyogre', 'Groudon'] },
'SPESIAL': { harga: 25000, list: ['Dialga', 'Palkia', 'Giratina', 'Darkrai', 'Arceus'] },
'LIMITED': { harga: 50000, list: ['Shiny Mewtwo', 'Eternal Floette', 'Shadow Lugia', 'Gold Arceus'] }
};
const getRank = (poin) => {
const threshold = [0, 500, 2000, 5000, 15000, 50000, 150000, 500000];
const names = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond', 'Master', 'Elite Master', 'Grand Elite Master'];
let index = 0;
for (let i = 0; i < threshold.length; i++) {
if (poin >= threshold[i]) index = i;
}
let nextThreshold = threshold[index + 1] || threshold[index] * 2;
let prevThreshold = threshold[index];
let progressPercent = ((poin - prevThreshold) / (nextThreshold - prevThreshold)) * 10;
const barCount = 10;
const progress = Math.min(Math.max(Math.floor(progressPercent), 0), barCount);
const bar = '▣'.repeat(progress) + '▢'.repeat(barCount - progress);
return { name: names[index], bar: bar };
};
const getPokeImg = (name) => {
let cleanName = name.replace(/[.*?]/g, '').trim().toLowerCase()
.replace('shiny ', '').replace('shadow ', '').replace('gold ', '').replace('eternal ', '');
return https://play.pokemonshowdown.com/sprites/ani/${cleanName}.gif;
};
const getWIBTime = () => {
return new Intl.DateTimeFormat('id-ID', {
timeZone: 'Asia/Jakarta',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(new Date()).replace(/./g, ':');
};
// ================= [ MAIN ENGINE ] =================
async function startZenix() {
const { state, saveCreds } = await useMultiFileAuthState('session_zenix');
const { version } = await fetchLatestBaileysVersion();
const sock = makeWASocket({
auth: state,
logger: pino({ level: 'silent' }),
version,
browser: ['Ubuntu', 'Chrome', '20.0.04']
});
sock.decodeJid = (jid) => {
if (!jid) return jid;
if (/:\d+@/gi.test(jid)) {
let decode = jidDecode(jid) || {};
return decode.user && decode.server && decode.user + '@' + decode.server || jid;
} else return jid;
};
sock.ev.on('creds.update', saveCreds);
sock.ev.on('connection.update', (up) => {
const { connection, lastDisconnect, qr } = up;
if (qr) {
console.clear();
qrcode.generate(qr, { small: true });
}
if (connection === 'open') console.log('✅ ZENIX ONLINE!');
if (connection === 'close') {
let reason = lastDisconnect?.error?.output?.statusCode;
if (reason !== DisconnectReason.loggedOut) startZenix();
}
});
sock.ev.on('messages.upsert', async (m) => {
try {
const msg = m.messages[0];
if (!msg.message || msg.key.remoteJid === 'status@broadcast') return;
const from = msg.key.remoteJid;
const isGroup = from.endsWith('@g.us');
if (isGroup) return;
const type = Object.keys(msg.message)[0];
let body = (type === 'conversation') ? msg.message.conversation :
(type === 'extendedTextMessage') ? msg.message.extendedTextMessage.text :
(type === 'imageMessage') ? msg.message.imageMessage.caption : '';
const budy = body.toLowerCase().trim();
const prefix = '.';
const isCmd = body.startsWith(prefix);
const command = isCmd ? budy.slice(prefix.length).split(/ +/)[0] : null;
const q = body.trim().split(/ +/).slice(1).join(' ');
const ownerNumber = "6287741840026@s.whatsapp.net";
const sender = sock.decodeJid(msg.key.fromMe ? sock.user.id : isGroup ? msg.key.participant : msg.key.remoteJid);
const isOwner = sender === ownerNumber || msg.key.fromMe;
if (settings.selfMode && !isOwner) return;
if (!db_user[from]) {
db_user[from] = { koin: 1500, poin: 0, pokemon: [], autoDelete: false, hp: 100, lastDaily: 0 };
saveDB();
}
const sendViral = async (teks) => {
const sent = await sock.sendMessage(from, { text: teks, mentions: [from] }, { quoted: msg });
if (db_user[from].autoDelete) {
setTimeout(async () => {
await sock.sendMessage(from, { delete: sent.key });
}, 10000);
}
return sent;
};
// [ LOGIC AFK ]
if (afkData[from] && !isCmd && command !== 'afk') {
const now = Date.now();
const diff = now - afkData[from].waktu;
if (diff > 5000) {
const jam = Math.floor(diff / (1000 * 60 * 60));
const menit = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
const detik = Math.floor((diff % (1000 * 60)) / 1000);
let durasi = `${jam > 0 ? jam + ' jam ' : ''}${menit > 0 ? menit + ' menit ' : ''}${detik} detik`;
let teksBalik = `🎊 *WELCOME BACK TRAINER!*\n\nAnda telah bangkit dari AFK!\n📝 *Alasan:* ${afkData[from].alasan}\n⏳ *Durasi AFK:* ${durasi}\n⏰ *Waktu Kembali:* ${getWIBTime()} WIB`;
sendViral(teksBalik);
delete afkData[from];
}
}
// [ LOGIC GAME BIASA & TEBAK GAMBAR ]
if (gameZenix[from] && !isCmd) {
if (budy === gameZenix[from].jawaban) {
let reward = gameZenix[from].reward;
let pPlus = gameZenix[from].poinPlus;
db_user[from].koin += reward;
db_user[from].poin += pPlus;
saveDB();
sendViral(`🎊 *BENAR!*\n\n+${reward.toLocaleString()} Koin & +${pPlus} Poin.`);
clearTimeout(gameZenix[from].timeout);
delete gameZenix[from];
return;
}
}
// [ LOGIC TEBAK BOM ]
if (tebakBom[from] && !isNaN(budy)) {
let game = tebakBom[from];
let pilihan = parseInt(budy);
if (pilihan < 1 || pilihan > 9 || game.dipilih.includes(pilihan)) return;
game.dipilih.push(pilihan);
if (pilihan === game.bom) {
await sendViral(`💥 *BOOOMMM!* Anda memilih kotak nomor ${pilihan} yang berisi BOM!\nGame Berakhir. Koin anda berkurang 500.`);
db_user[from].koin -= 500;
saveDB();
delete tebakBom[from];
} else if (game.dipilih.length === 8) {
await sendViral(`🎊 *LUAR BIASA!* Anda berhasil menghindari semua bom!\nReward: +3.000 Koin & +200 Poin.`);
db_user[from].koin += 3000;
db_user[from].poin += 200;
saveDB();
delete tebakBom[from];
} else {
let board = "";
for (let i = 1; i <= 9; i++) {
board += game.dipilih.includes(i) ? "🟩 " : "❓ ";
if (i % 3 === 0) board += "\n";
}
sendViral(`✅ *AMAN!*\n\n${board}\nKotak tersisa: ${8 - game.dipilih.length}\nPilih angka selanjutnya (1-9):`);
}
return;
}
// [ LOGIC TIC TAC TOE ]
if (tictactoe[from]) {
let game = tictactoe[from];
if (!game.full && budy === '.join') {
if (sender === game.p1) return sendViral("Sabar, tunggu lawan dulu.");
game.p2 = sender;
game.full = true;
let board = game.board.map(v => v === 0 ? "▢" : v === 1 ? "❌" : "⭕");
sendViral(`🎮 *TTT DIMULAI!*\n\n❌: @${game.p1.split('@')[0]}\n⭕: @${game.p2.split('@')[0]}\n\n${board.slice(0, 3).join(" ")}\n${board.slice(3, 6).join(" ")}\n${board.slice(6, 9).join(" ")}\n\nGiliran: @${game.turn.split('@')[0]}\nKetik angka 1-9 untuk mengisi.`);
return;
} else if (game.full && sender === game.turn && !isNaN(budy)) {
let pos = parseInt(budy) - 1;
if (pos >= 0 && pos <= 8 && game.board[pos] === 0) {
game.board[pos] = game.turn === game.p1 ? 1 : 2;
const winLogic = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]];
let isWin = winLogic.find(a => a.every(b => game.board[b] === (game.turn === game.p1 ? 1 : 2)));
let boardRender = game.board.map(v => v === 0 ? "▢" : v === 1 ? "❌" : "⭕");
let render = `${boardRender.slice(0, 3).join(" ")}\n${boardRender.slice(3, 6).join(" ")}\n${boardRender.slice(6, 9).join(" ")}`;
if (isWin) {
sendViral(`🎊 *MENANG!*\n\n${render}\n\nSelamat @${game.turn.split('@')[0]}! +1.000 Koin.`);
db_user[game.turn].koin += 1000;
saveDB();
delete tictactoe[from];
} else if (game.board.every(v => v !== 0)) {
sendViral(`🏁 *SERI!*\n\n${render}\n\nGame berakhir tanpa pemenang.`);
delete tictactoe[from];
} else {
game.turn = game.turn === game.p1 ? game.p2 : game.p1;
sendViral(`🎮 *TTT NEXT*\n\n${render}\n\nGiliran: @${game.turn.split('@')[0]}`);
}
}
return;
}
}
const triggerList = ['p', 'halo', 'hai', 'bot', 'menu'];
if (triggerList.includes(budy) || budy === '.menu') {
let rnk = getRank(db_user[from].poin);
let menuText = `乂 *Z E N I X U L T I M A T E* 乂
👤 Trainer: @${from.split('@')[0]}
🎖️ Rank: ${rnk.name}
💰 Wallet: ${db_user[from].koin.toLocaleString()} Koin
❤️ Health: ${db_user[from].hp || 100}%
┌── 🎮 G A M E S
│ ◦ .ge | .gn | .gh | .gex
│ ◦ .clue | .stop | .nyerah
│ ◦ .tebakbom | .tictactoe
│ ◦ .tebakgambar
│ ◦ .jodoh | .rate | .cekkhodam
│ ◦ .truth | .dare | .slot
└──────────────
┌── ⚔️ R P G S Y S T E M
│ ◦ .adventure (Dungeon)
│ ◦ .heal (Gunakan Koin)
│ ◦ .daily (Klaim Harian)
│ ◦ .petarung (Status)
└──────────────
┌── 🛍️ M A R K E T
│ ◦ .gacha | .buypokemon
│ ◦ .jokigacha (Free 4x)
│ ◦ .shop | .jualpokemon
│ ◦ .mypokemon
└──────────────
┌── ⚙️ S E T T I S
│ ◦ .settings | .autodelete
│ ◦ .autoonly (Auto Mode)
│ ◦ .afk | .ping | .cekjam
│ ◦ .runtime | .translate
└──────────────
┌── 👤 A C C O U N T
│ ◦ .myprofile | .leaderboard
│ ◦ .mykoin | .mypoin
│ ◦ .carilirik | .carijudul
│ ◦ .kritikdansaran
└──────────────
┌── ☁️ Z E N I X C L O U D
│ ◦ .addbot (Pairing Code)
│ ◦ .cekbot (Daftar Bot)
└──────────────
┌── 👑 O W N E R
│ ◦ .ownerchat | .userchat
│ ◦ .mode | .block | .broadcast
│ ◦ .shutdown | .isiulangkoin
└──────────────`;
sendViral(menuText);
return;
}
if (isCmd) {
switch (command) {
// ================= [ NEW RPG COMMANDS ] =================
case 'adventure': case 'dungeon':
if (db_user[from].hp < 20) return sendViral("⚠️ HP kamu terlalu rendah! Silakan ketik *.heal* dulu.");
if (dungeonCooldown.has(from)) return sendViral("⏳ Kamu masih lelah, tunggu 1 menit lagi.");
let monster = ["Slime", "Goblin", "Dragon", "Orc", "Skeleton", "Hydra"];
let pickedMonster = monster[Math.floor(Math.random() * monster.length)];
let damage = Math.floor(Math.random() * 30) + 10;
let lootKoin = Math.floor(Math.random() * 2000) + 500;
let lootPoin = Math.floor(Math.random() * 100) + 20;
db_user[from].hp -= damage;
db_user[from].koin += lootKoin;
db_user[from].poin += lootPoin;
saveDB();
let dunTxt = `⚔️ *DUNGEON ADVENTURE*\n\nKamu bertemu dengan *${pickedMonster}*!\n💥 *Damage diterima:* -${damage} HP\n💰 *Loot:* +${lootKoin.toLocaleString()} Koin\n🎖️ *Exp:* +${lootPoin} Poin\n\n❤️ *HP Tersisa:* ${db_user[from].hp}%`;
sendViral(dunTxt);
dungeonCooldown.add(from);
setTimeout(() => dungeonCooldown.delete(from), 60000);
break;
case 'heal':
if (db_user[from].hp >= 100) return sendViral("❤️ HP kamu masih penuh!");
if (db_user[from].koin < 500) return sendViral("⚠️ Butuh 500 koin untuk beli Potion!");
db_user[from].koin -= 500;
db_user[from].hp = 100;
saveDB();
sendViral("🧪 *HEAL SUCCESS!*\nKamu meminum Potion, HP kembali ke 100%.");
break;
case 'daily':
let dailyTime = 86400000; // 24 jam
let lastD = db_user[from].lastDaily || 0;
if (Date.now() - lastD < dailyTime) {
let sisa = dailyTime - (Date.now() - lastD);
let h = Math.floor(sisa / 3600000);
let m = Math.floor((sisa % 3600000) / 60000);
return sendViral(`⏳ Kamu sudah mengambil daily! Tunggu *${h} jam ${m} menit* lagi.`);
}
db_user[from].koin += 5000;
db_user[from].lastDaily = Date.now();
saveDB();
sendViral("🎁 *DAILY REWARD*\n\nSelamat! Kamu mendapatkan *5.000 Koin* gratis hari ini.");
break;
case 'petarung':
sendViral(`🛡️ *RPG STATUS*\n\n👤 *Nama:* ${msg.pushName}\n❤️ *Health:* ${db_user[from].hp} / 100\n💰 *Wallet:* ${db_user[from].koin.toLocaleString()}\n🎖️ *Poin:* ${db_user[from].poin}`);
break;
// ================= [ NEW FEATURE COMMANDS ] =================
case 'mode':
if (!isOwner) return sendViral('❌ Hanya Owner!');
if (!q) return sendViral('📝 Pilih mode: *public* atau *self*');
settings.selfMode = q.toLowerCase() === 'self';
saveSettings();
sendViral(`⚙️ *Bot Mode* sekarang: *${settings.selfMode ? 'SELF (Owner Only)' : 'PUBLIC'}*`);
break;
case 'block':
if (!isOwner) return sendViral('❌ Hanya Owner!');
let userBlock = q.replace(/[^0-9]/g, '') + '@s.whatsapp.net';
await sock.updateBlockStatus(userBlock, "block");
sendViral(`🚫 Berhasil memblokir @${userBlock.split('@')[0]}`);
break;
case 'broadcast':
if (!isOwner) return sendViral('❌ Hanya Owner!');
if (!q) return sendViral('📝 Masukkan pesan broadcast!');
let allUsers = Object.keys(db_user);
sendViral(`📢 Mengirim broadcast ke ${allUsers.length} user...`);
for (let usr of allUsers) {
await sock.sendMessage(usr, { text: `📢 *ZENIX BROADCAST*\n\n${q}\n\n_Pesan dari Owner_` });
}
sendViral('✅ Broadcast Selesai!');
break;
case 'shutdown':
if (!isOwner) return sendViral('❌ Hanya Owner!');
await sendViral('💤 Bot akan segera dimatikan (Shutdown)...');
process.exit();
break;
case 'jodoh':
let usersList = Object.keys(db_user);
let randomTarget = usersList[Math.floor(Math.random() * usersList.length)];
let percent = Math.floor(Math.random() * 100);
let matchText = `💘 *ZENIX MATCHMAKING*\n\n@${sender.split('@')[0]} ❤️ @${randomTarget.split('@')[0]}\n\n📊 *Kecocokan:* ${percent}%\n${percent > 75 ? 'Wah, kalian cocok banget nih! 🥰' : 'Mungkin cukup jadi teman saja. ✨'}`;
sock.sendMessage(from, { text: matchText, mentions: [sender, randomTarget] }, { quoted: msg });
break;
case 'rate':
if (!q) return sendViral('📝 Mau nilai apa?');
let score = Math.floor(Math.random() * 101);
sendViral(`🧐 *RATE SYSTEM*\n\nObjek: *${q}*\nNilai: *${score}/100*\nKomentar: ${score > 80 ? 'Mantap banget!' : score > 50 ? 'Lumayan lah.' : 'Kurang kayaknya...'}`);
break;
case 'cekkhodam':
if (!q) return sendViral('📝 Masukkan namamu!');
const listKhodam = ['Macan Pemarah', 'Buaya Putih', 'Nyi Blorong', 'Tutup Panci', 'Kuntilanak Merah', 'Sempak Bolong', 'Jin Tomang', 'Kabel USB', 'Sosis So Nice', 'Botol Tupperware'];
let khodamResult = listKhodam[Math.floor(Math.random() * listKhodam.length)];
sendViral(`👻 *CEK KHODAM*\n\nNama: *${q}*\nKhodam: *${khodamResult}*\n\n_Hati-hati, khodam ini selalu mengintaimu!_`);
break;
case 'truth':
const listTruth = [
"Siapa orang yang terakhir kamu stalk di sosmed?",
"Pernahkah kamu menyukai seseorang tapi tidak berani bilang?",
"Hal paling memalukan apa yang pernah kamu alami?",
"Apa kebohongan terbesar yang pernah kamu katakan ke orang tua?",
"Siapa mantan terindahmu?"
];
sendViral(`💡 *TRUTH*\n\n"${listTruth[Math.floor(Math.random() * listTruth.length)]}"`);
break;
case 'dare':
const listDare = [
"VC orang yang kamu suka sekarang!",
"Kirim pesan 'Aku sayang kamu' ke mantan nomor 3.",
"Push up 10 kali lalu kirim fotonya ke sini.",
"VN nyanyi lagu balonku ada lima dengan suara bayi.",
"Ganti nama WhatsApp kamu jadi 'Aku Wibu' selama 1 jam."
];
sendViral(`🔥 *DARE*\n\n"${listDare[Math.floor(Math.random() * listDare.length)]}"`);
break;
case 'translate':
if (!q) return sendViral('📝 Contoh: *.translate id|en Halo apa kabar*');
let [lang, ...textTr] = q.split('|');
let toTranslate = textTr.join('|');
try {
const resTr = await axios.get(`https://api.popcat.xyz/translate?to=${lang}&text=${encodeURIComponent(toTranslate)}`);
sendViral(`🌍 *TRANSLATE*\n\nInput: ${toTranslate}\nResult (${lang}): ${resTr.data.translated}`);
} catch (e) { sendViral('❌ Gagal menerjemahkan. Gunakan format id|en'); }
break;
case 'slot':
if (db_user[from].koin < 500) return sendViral('⚠️ Butuh minimal 500 koin!');
db_user[from].koin -= 500;
let slotItems = ['🍒', '🍋', '🍉', '💎', '🔔'];
let a = slotItems[Math.floor(Math.random() * slotItems.length)];
let b = slotItems[Math.floor(Math.random() * slotItems.length)];
let c = slotItems[Math.floor(Math.random() * slotItems.length)];
let slotResult = `🎰 *SLOT MACHINE*\n\n[ ${a} | ${b} | ${c} ]\n\n`;
if (a === b && b === c) {
db_user[from].koin += 5000;
slotResult += "🎊 *JACKPOT!* Kamu dapat +5.000 Koin!";
} else if (a === b || b === c || a === c) {
db_user[from].koin += 1000;
slotResult += "✨ *DAPET!* Kamu dapat +1.000 Koin!";
} else {
slotResult += "❌ *ZONK!* Coba lagi nanti.";
}
saveDB();
sendViral(slotResult);
break;
case 'runtime':
let uptime = process.uptime();
let hour = Math.floor(uptime / 3600);
let minute = Math.floor((uptime % 3600) / 60);
let second = Math.floor(uptime % 60);
sendViral(`⏳ *BOT RUNTIME*\n\nBot telah aktif selama:\n*${hour} jam ${minute} menit ${second} detik*`);
break;
// ================= [ ORIGINAL COMMANDS ] =================
case 'addbot':
if (!q) return sendViral("📝 Masukkan nomor Anda!\nContoh: *.addbot 62812xxxx*");
let num = q.replace(/[^0-9]/g, '');
if (num.length < 10) return sendViral("❌ Nomor tidak valid!");
sendViral("⏳ *Sedang memproses pairing code...*\nMohon tunggu sampai proses sinkronisasi selesai.");
try {
const { state: botState, saveCreds: saveBotCreds } = await useMultiFileAuthState(`./sessions_bots/bot_${num}`);
const botSock = makeWASocket({
auth: {
creds: botState.creds,
keys: makeCacheableSignalKeyStore(botState.keys, pino({ level: 'silent' })),
},
logger: pino({ level: 'silent' }),
browser: ["Ubuntu", "Chrome", "20.0.04"]
});
botSock.ev.on('creds.update', saveBotCreds);
if (!botSock.authState.creds.registered) {
setTimeout(async () => {
try {
let code = await botSock.requestPairingCode(num);
code = code?.match(/.{1,4}/g)?.join("-") || code;
await sendViral(`✅ *ZENIX CLOUD PAIRING*\n\nNomor: ${num}\nKode: *${code}*\n\n_Masukkan kode di atas pada menu Perangkat Tertaut di WhatsApp Anda._`);
} catch (codeErr) {
console.log(codeErr);
sendViral("❌ Gagal mendapatkan kode. Pastikan koneksi stabil dan coba lagi.");
}
}, 7000);
} else {
sendViral("⚠️ Nomor tersebut sudah terdaftar sebagai bot!");
}
botSock.ev.on('connection.update', (up) => {
const { connection, lastDisconnect } = up;
if (connection === 'open') {
activeBots[num] = { status: "Online", time: Date.now() };
sock.sendMessage(ownerNumber, { text: `🚀 Bot baru aktif: ${num}` });
}
if (connection === 'close') {
let reason = lastDisconnect?.error?.output?.statusCode;
if (reason !== DisconnectReason.loggedOut) delete activeBots[num];
}
});
} catch (err) {
console.log(err);
sendViral("❌ Terjadi kesalahan sistem.");
}
break;
case 'jokigacha':
if (jokiCooldown.has(from)) return sendViral("⏳ *COOLDOWN!*\nSilakan tunggu 10 detik sebelum joki lagi.");
sendViral("🎰 *JOKI GACHA DIMULAI...*\nSedang memutar 4x spin spesial untuk Anda!");
let jokiResults = [];
let tiers = ['BIASA', 'COMMON', 'EPIC', 'PRO', 'LEGENDARY', 'SPESIAL'];
for (let i = 0; i < 4; i++) {
let randomTier = tiers[Math.floor(Math.random() * tiers.length)];
let randomPkm = pokemonData[randomTier].list[Math.floor(Math.random() * pokemonData[randomTier].list.length)];
db_user[from].pokemon.push(`[${randomTier}] ${randomPkm}`);
jokiResults.push(`✨ *${randomPkm}* (${randomTier})`);
}
saveDB();
setTimeout(async () => {
let captionJoki = `🎊 *HASIL JOKI GACHA*\n\nBerhasil mendapatkan 4 Pokémon:\n${jokiResults.join('\n')}\n\n🎒 Cek tas di *.mypokemon*`;
sendViral(captionJoki);
}, 2000);
jokiCooldown.add(from);
setTimeout(() => jokiCooldown.delete(from), 10000);
break;
case 'autoonly':
settings.autoOnly = !settings.autoOnly;
saveSettings();
sendViral(`🤖 *Auto Only Mode* sekarang: *${settings.autoOnly ? 'ON' : 'OFF'}*`);
break;
case 'cekjam':
const d = new Date();
const locale = 'id-ID';
const wib = d.toLocaleString(locale, { timeZone: 'Asia/Jakarta' });
const wita = d.toLocaleString(locale, { timeZone: 'Asia/Makassar' });
const wit = d.toLocaleString(locale, { timeZone: 'Asia/Jayapura' });
let jamText = `🕒 *WAKTU INDONESIA*\n\n` +
`🇮🇩 *WIB:* ${wib.split(', ')[1]}\n` +
`🇮🇩 *WITA:* ${wita.split(', ')[1]}\n` +
`🇮🇩 *WIT:* ${wit.split(', ')[1]}\n\n` +
`📅 *Tanggal:* ${wib.split(', ')[0]}`;
sendViral(jamText);
break;
case 'carilirik':
if (!q) return sendViral("📝 Masukkan judul lagu!");
sendViral(`🔍 Mencari lirik lagu: *${q}*...`);
try {
const resL = await axios.get(`https://lyrist.vercel.app/api/${encodeURIComponent(q)}`);
if (!resL.data.lyrics) return sendViral("❌ Lirik tidak ditemukan.");
let lirikTxt = `🎵 *LIRIK LAGU*\n\n📌 *Judul:* ${resL.data.title}\n👤 *Artist:* ${resL.data.artist}\n\n${resL.data.lyrics}`;
sendViral(lirikTxt);
} catch (e) { sendViral("❌ Gagal mencari lirik."); }
break;
case 'carijudul':
if (!q) return sendViral("📝 Masukkan potongan lirik atau kata kunci!");
sendViral(`🔍 Mencari judul lagu untuk: "${q}"...`);
try {
const resJ = await axios.get(`https://api.deezer.com/search?q=${encodeURIComponent(q)}`);
if (resJ.data.data.length === 0) return sendViral("❌ Judul tidak ditemukan.");
let track = resJ.data.data[0];
let judulTxt = `🎶 *JUDUL DITEMUKAN*\n\n📌 *Judul:* ${track.title}\n👤 *Artist:* ${track.artist.name}\n💿 *Album:* ${track.album.title}\n🔗 *Link:* ${track.link}`;
await sock.sendMessage(from, { image: { url: track.album.cover_medium }, caption: judulTxt }, { quoted: msg });
} catch (e) { sendViral("❌ Gagal mendeteksi judul."); }
break;
case 'cekbot':
let listBots = Object.keys(activeBots);
if (listBots.length === 0) return sendViral("📭 Belum ada bot yang aktif melalui Zenix Cloud.");
let botTxt = `📑 *DAFTAR BOT AKTIF*\n\n`;
listBots.forEach((v, i) => {
botTxt += `${i + 1}. @${v} [${activeBots[v].status}]\n`;
});
sendViral(botTxt);
break;
case 'tebakgambar':
if (gameZenix[from]) return sendViral('Selesaikan game yang ada dulu!');
try {
const resTG = await axios.get('https://github.com/ghraw/BochilTeam/database/master/games/tebakgambar.json');
const dataTG = resTG.data[Math.floor(Math.random() * resTG.data.length)];
await sock.sendMessage(from, { image: { url: dataTG.img }, caption: `🎮 *TEBAK GAMBAR*\n\nDeskripsi: ${dataTG.deskripsi || 'Tebak kata dari gambar di atas!'}\nReward: 2.500 Koin\nWaktu: *3 Menit*\n\n_Balas pesan ini untuk menjawab!_` }, { quoted: msg });
gameZenix[from] = {
jawaban: dataTG.jawaban.toLowerCase().trim(),
reward: 2500,
poinPlus: 150,
timeout: setTimeout(() => {
if (gameZenix[from]) {
sendViral(`🏁 *WAKTU HABIS*\nJawaban: *${gameZenix[from].jawaban.toUpperCase()}*`);
delete gameZenix[from];
}
}, 180000)
};
} catch (err) { sendViral('❌ Gagal mengambil soal.'); }
break;
case 'tebakbom':
if (tebakBom[from]) return sendViral("Selesaikan game sebelumnya!");
tebakBom[from] = { bom: Math.floor(Math.random() * 9) + 1, dipilih: [] };
sendViral(`🎮 *GAME TEBAK BOM*\n\nPilih nomor *1-9* dengan hati-hati. Jangan sampai terkena BOM! 💣\n\n❓ ❓ ❓\n❓ ❓ ❓\n❓ ❓ ❓`);
break;
case 'tictactoe':
if (tictactoe[from]) return sendViral("Game masih berjalan!");
tictactoe[from] = { p1: sender, p2: null, turn: sender, board: [0, 0, 0, 0, 0, 0, 0, 0, 0], full: false };
sendViral(`🎮 *TIC TAC TOE*\n\nMenunggu lawan... Silakan orang lain ketik *.join* untuk bergabung.`);
break;
case 'afk':
let alasan = q || 'Tanpa Alasan';
afkData[from] = { alasan: alasan, waktu: Date.now() };
sendViral(`💤 *SISTEM AFK AKTIF*\n\nAnda sekarang AFK dengan alasan: *${alasan}*\n\n_Bot tidak akan mengganggu sampai Anda mengirim pesan lagi nanti._`);
break;
case 'settings':
let setTxt = `⚙️ *USER SETTINGS*
👤 User: @${from.split('@')[0]}
🗑️ Auto Delete: ${db_user[from].autoDelete ? '✅ ON' : '❌ OFF'}
🤖 Auto Only: ${settings.autoOnly ? '✅ ON' : '❌ OFF'}
🔒 Global Mode: ${settings.selfMode ? 'Owner Only' : 'Public'}
Gunakan perintah di bawah untuk mengubah:
◦ .autodelete (On/Off hapus pesan bot)`;
sendViral(setTxt);
break;
case 'autodelete':
db_user[from].autoDelete = !db_user[from].autoDelete;
saveDB();
sendViral(`🗑️ *Auto Delete* sekarang: *${db_user[from].autoDelete ? 'ON (10s)' : 'OFF'}*`);
break;
case 'ownerchat':
if (!isOwner) return sendViral('❌ Hanya Owner!');
settings.selfMode = true;
saveSettings();
sendViral('🔒 *OWNER MODE AKTIF*');
break;
case 'userchat':
if (!isOwner) return sendViral('❌ Hanya Owner!');
settings.selfMode = false;
saveSettings();
sendViral('🔓 *USER MODE AKTIF*');
break;
case 'ge': case 'gn': case 'gh': case 'gex': case 'game':
if (gameZenix[from]) return sendViral('Selesaikan game yang ada dulu!');
let mode = command === 'ge' ? 'EASY' : command === 'gn' ? 'NORMAL' : command === 'gh' ? 'HARD' : command === 'gex' ? 'EXTREME' : 'NORMAL';
let rewardKoin = mode === 'EASY' ? 500 : mode === 'NORMAL' ? 1500 : mode === 'HARD' ? 5000 : 15000;
let rewardPoin = mode === 'EASY' ? 20 : mode === 'NORMAL' ? 100 : mode === 'HARD' ? 400 : 1000;
let gamePool = ['tebakkata', 'tebakbendera', 'susunkata'];
if (mode === 'HARD') gamePool.push('math');
const pickGame = gamePool[Math.floor(Math.random() * gamePool.length)];
let quest, answer;
if (pickGame === 'math') {
let n1 = Math.floor(Math.random() * 100); let n2 = Math.floor(Math.random() * 50);
quest = `Berapa hasil dari *${n1} x ${n2}* ?`;
answer = (n1 * n2).toString();
} else {
const resG = await axios.get(`https://github.com/ghraw/BochilTeam/database/master/games/${pickGame}.json`);
let filtered = mode === 'EXTREME' ? resG.data.filter(x => (x.jawaban || '').length > 7) : resG.data;
const dataG = filtered[Math.floor(Math.random() * filtered.length)];
quest = dataG.soal || dataG.pertanyaan;
answer = (dataG.jawaban || '').toLowerCase().trim();
}
sendViral(`🎮 *ZENIX GAME [${mode}]*\n\nSoal: *${quest}*\nReward: ${rewardKoin.toLocaleString()} Koin\nWaktu: *3 Menit*\n\n_Balas untuk menjawab!_`);
gameZenix[from] = {
jawaban: answer, reward: rewardKoin, poinPlus: rewardPoin,
timeout: setTimeout(() => {
if (gameZenix[from]) {
sendViral(`🏁 *WAKTU HABIS*\nJawaban: *${gameZenix[from].jawaban.toUpperCase()}*`);
delete gameZenix[from];
}
}, 180000)
};
break;
case 'stop':
if (!gameZenix[from]) return sendViral('Gak ada game aktif!');
clearTimeout(gameZenix[from].timeout);
delete gameZenix[from];
sendViral('🛑 *GAME DIBERHENTIKAN*');
break;
case 'ping':
const start = performance.now();
const end = performance.now();
sendViral(`🚀 *PONG!*\nSpeed: *${(end - start).toFixed(0)} ms*`);
break;
case 'kritikdansaran':
if (!q) return sendViral('📝 Masukkan pesan!');
await sock.sendMessage(ownerNumber, { text: `📩 *KRITIK & SARAN*\nDari: @${from.split('@')[0]}\nIsi: ${q}`, mentions: [from] });
sendViral('✅ Terkirim!');
break;
case 'clue':
if (!gameZenix[from]) return sendViral('Nggak ada game!');
let j = gameZenix[from].jawaban;
let clue = j.split('').map((x, i) => (i === 0 || i === Math.floor(j.length / 2) || i === j.length - 1) ? x : '*').join('');
sendViral(`💡 *CLUE:* \`${clue.toUpperCase()}\``);
break;
case 'nyerah':
if (!gameZenix[from]) return sendViral('Gak ada game.');
let ans = gameZenix[from].jawaban;
clearTimeout(gameZenix[from].timeout);
delete gameZenix[from];
sendViral(`🏳️ Menyerah! Jawabannya: *${ans.toUpperCase()}*`);
break;
case 'gacha':
let avail = Object.keys(pokemonData).filter(t => pokemonData[t].harga <= db_user[from].koin);
if (!avail.length) return sendViral('Koin lu gak cukup!');
let tier = avail[avail.length - 1];
let pkm = pokemonData[tier].list[Math.floor(Math.random() * pokemonData[tier].list.length)];
db_user[from].koin -= pokemonData[tier].harga;
db_user[from].pokemon.push(`[${tier}] ${pkm}`);
saveDB();
await sock.sendMessage(from, { image: { url: getPokeImg(pkm) }, caption: `🎰 *GACHA:* *${pkm}* (${tier})\n💰 Sisa Koin: ${db_user[from].koin.toLocaleString()}` }, { quoted: msg });
break;
case 'buypokemon':
if (!q) return sendViral('📝 Masukkan Tier!');
let selectedTier = q.toUpperCase();
if (!pokemonData[selectedTier]) return sendViral('❌ Tier salah!');
if (db_user[from].koin < pokemonData[selectedTier].harga) return sendViral('⚠️ Koin kurang!');
let dapetPkm = pokemonData[selectedTier].list[Math.floor(Math.random() * pokemonData[selectedTier].list.length)];
db_user[from].koin -= pokemonData[selectedTier].harga;
db_user[from].pokemon.push(`[${selectedTier}] ${dapetPkm}`);
saveDB();
await sock.sendMessage(from, { image: { url: getPokeImg(dapetPkm) }, caption: `🛍️ *Dapet:* *${dapetPkm}*\nTier: ${selectedTier}\n💰 Sisa Koin: ${db_user[from].koin.toLocaleString()}` }, { quoted: msg });
break;
case 'isiulangkoin':
if (!isOwner) return sendViral('❌ Owner only!');
if (!q) return sendViral('📝 Format: .isiulangkoin nomor|jumlah');
let target, koinRefill;
if (q.includes('|')) {
target = q.split('|')[0].replace(/\s/g, '').replace(/[^0-9]/g, '') + '@s.whatsapp.net';
koinRefill = parseInt(q.split('|')[1].replace(/[.\s]/g, ''));
} else {
target = from;
koinRefill = parseInt(q.replace(/[.\s]/g, ''));
}
if (!db_user[target]) return sendViral('❌ User tidak ditemukan!');
if (isNaN(koinRefill)) return sendViral('❌ Jumlah harus angka!');
db_user[target].koin += koinRefill;
saveDB();
sendViral(`✅ Berhasil isi ulang *${koinRefill.toLocaleString()} Koin* ke @${target.split('@')[0]}\n💰 Total: *${db_user[target].koin.toLocaleString()}*`);
break;
case 'mykoin':
sendViral(`💰 *JUMLAH KOIN ANDA*\n\nWallet: *${db_user[from].koin.toLocaleString()}* Koin`);
break;
case 'mypoin':
let rP = getRank(db_user[from].poin);
sendViral(`🎖️ *JUMLAH POIN ANDA*\n\nTotal Poin: *${db_user[from].poin.toLocaleString()}*\nRank: *${rP.name}*`);
break;
case 'shop':
let listShop = `🛒 *SHOP*\n`;
for (let k in pokemonData) listShop += `◦ *${k}:* ${pokemonData[k].harga.toLocaleString()}\n`;
sendViral(listShop);
break;
case 'jualpokemon':
if (!q) return sendViral('📝 Masukkan nama Pokémon yang ingin dijual!');
// Cari berdasarkan index (case insensitive)
let sellIdx = db_user[from].pokemon.findIndex(p => p.toLowerCase().includes(q.toLowerCase()));
if (sellIdx === -1) return sendViral(`❌ Pokémon "${q}" tidak ada di tas kamu!`);
let sellData = db_user[from].pokemon[sellIdx];
let sellTier = sellData.match(/\[(.*?)\]/)[1];
let sellName = sellData.replace(/\[.*?\]/g, '').trim();
let sellPrice = Math.floor(pokemonData[sellTier.toUpperCase()].harga / 2);
db_user[from].koin += sellPrice;
db_user[from].pokemon.splice(sellIdx, 1);
saveDB();
await sock.sendMessage(from, {
image: { url: getPokeImg(sellName) },
caption: `💰 *POKÉMON TERJUAL!*\n\n👾 *Nama:* ${sellName}\n🏷️ *Tier:* ${sellTier}\n💵 *Hasil Jual:* +${sellPrice.toLocaleString()} Koin`
}, { quoted: msg });
break;
case 'mypokemon':
let bag = db_user[from].pokemon.length ? db_user[from].pokemon.map((p, i) => `${i + 1}. ${p}`).join('\n') : 'Kosong.';
sendViral(`🎒 *TAS*\n${bag}`);
break;
case 'leaderboard':
let top = Object.keys(db_user).sort((a, b) => db_user[b].koin - db_user[a].koin).slice(0, 10);
let txt = `🏆 *TOP 10*\n`;
top.forEach((v, i) => { txt += `${i + 1}. @${v.split('@')[0]} - ${db_user[v].koin.toLocaleString()}\n` });
sock.sendMessage(from, { text: txt, mentions: top });
break;
case 'myprofile':
let userProf = db_user[from];
let pushname = msg.pushName || "Trainer";
let userRank = getRank(userProf.poin);
let ppUrl;
try { ppUrl = await sock.profilePictureUrl(from, 'image'); } catch { ppUrl = 'https://github.com/ghraw/PokeAPI/sprites/master/sprites/items/poke-ball.png'; }
let card = `
╔════════════════════╗
TRAINER CARD
╚════════════════════╝
👤 Name: ${pushname}
📱 Number: @${from.split('@')[0]}
🎖️ Rank: ${userRank.name}
📊 Exp: [${userRank.bar}]
┌─── STORAGE ───┐
│ ❤️ HP: ${userProf.hp || 100}%
│ 💰 Koin: ${userProf.koin.toLocaleString()}
│ 🎖️ Poin: ${userProf.poin.toLocaleString()}
│ 🎒 Poke: ${userProf.pokemon.length} Ekor
└─────────────────┘
Zenix Ultimate Engine v1.1`;
sock.sendMessage(from, { image: { url: ppUrl }, caption: card, mentions: [from] }, { quoted: msg });
break;
}
}
} catch (e) { console.log(e) }
});
}
startZenix();
const {
default: makeWASocket,
useMultiFileAuthState,
DisconnectReason,
fetchLatestBaileysVersion,
jidDecode,
makeCacheableSignalKeyStore
} = require('@whiskeysockets/baileys');
const pino = require('pino');
const fs = require('fs');
const qrcode = require('qrcode-terminal');
const axios = require('axios');
const { performance } = require('perf_hooks');
// ================= [ DATABASE SYSTEM ] =================
if (!fs.existsSync('./user_data.json')) fs.writeFileSync('./user_data.json', JSON.stringify({}));
if (!fs.existsSync('./settings.json')) fs.writeFileSync('./settings.json', JSON.stringify({ selfMode: false, autoOnly: false }));
if (!fs.existsSync('./sessions_bots')) fs.mkdirSync('./sessions_bots');
let db_user = JSON.parse(fs.readFileSync('./user_data.json'));
let settings = JSON.parse(fs.readFileSync('./settings.json'));
// Storage Game & Bots & Cooldown
let gameZenix = {};
let afkData = {};
let tebakBom = {};
let tictactoe = {};
let activeBots = {};
let jokiCooldown = new Set();
let dungeonCooldown = new Set();
const saveDB = () => fs.writeFileSync('./user_data.json', JSON.stringify(db_user, null, 2));
const saveSettings = () => fs.writeFileSync('./settings.json', JSON.stringify(settings, null, 2));
// ================= [ DATA GAME ] =================
const pokemonData = {
'BIASA': { harga: 1000, list: ['Caterpie', 'Pidgey', 'Rattata', 'Zubat', 'Magikarp'] },
'COMMON': { harga: 3000, list: ['Bulbasaur', 'Charmander', 'Squirlte', 'Pikachu', 'Eevee'] },
'EPIC': { harga: 7000, list: ['Gengar', 'Gyarados', 'Arcanine', 'Snorlax', 'Dragonite'] },
'PRO': { harga: 10000, list: ['Lucario', 'Garchomp', 'Gardevoir', 'Greninja', 'Zoroark'] },
'LEGENDARY': { harga: 15000, list: ['Mewtwo', 'Lugia', 'Rayquaza', 'Kyogre', 'Groudon'] },
'SPESIAL': { harga: 25000, list: ['Dialga', 'Palkia', 'Giratina', 'Darkrai', 'Arceus'] },
'LIMITED': { harga: 50000, list: ['Shiny Mewtwo', 'Eternal Floette', 'Shadow Lugia', 'Gold Arceus'] }
};
const getRank = (poin) => {
const threshold = [0, 500, 2000, 5000, 15000, 50000, 150000, 500000];
const names = ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond', 'Master', 'Elite Master', 'Grand Elite Master'];
let index = 0;
for (let i = 0; i < threshold.length; i++) {
if (poin >= threshold[i]) index = i;
}
let nextThreshold = threshold[index + 1] || threshold[index] * 2;
let prevThreshold = threshold[index];
let progressPercent = ((poin - prevThreshold) / (nextThreshold - prevThreshold)) * 10;
const barCount = 10;
const progress = Math.min(Math.max(Math.floor(progressPercent), 0), barCount);
const bar = '▣'.repeat(progress) + '▢'.repeat(barCount - progress);
return { name: names[index], bar: bar };
};
const getPokeImg = (name) => {
let cleanName = name.replace(/[.*?]/g, '').trim().toLowerCase()
.replace('shiny ', '').replace('shadow ', '').replace('gold ', '').replace('eternal ', '');
return
https://play.pokemonshowdown.com/sprites/ani/${cleanName}.gif;};
const getWIBTime = () => {
return new Intl.DateTimeFormat('id-ID', {
timeZone: 'Asia/Jakarta',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(new Date()).replace(/./g, ':');
};
// ================= [ MAIN ENGINE ] =================
async function startZenix() {
const { state, saveCreds } = await useMultiFileAuthState('session_zenix');
const { version } = await fetchLatestBaileysVersion();
👤 Trainer: @${from.split('@')[0]}
🎖️ Rank: ${rnk.name}
💰 Wallet: ${db_user[from].koin.toLocaleString()} Koin
❤️ Health: ${db_user[from].hp || 100}%
┌── 🎮 G A M E S
│ ◦ .ge | .gn | .gh | .gex
│ ◦ .clue | .stop | .nyerah
│ ◦ .tebakbom | .tictactoe
│ ◦ .tebakgambar
│ ◦ .jodoh | .rate | .cekkhodam
│ ◦ .truth | .dare | .slot
└──────────────
┌── ⚔️ R P G S Y S T E M
│ ◦ .adventure (Dungeon)
│ ◦ .heal (Gunakan Koin)
│ ◦ .daily (Klaim Harian)
│ ◦ .petarung (Status)
└──────────────
┌── 🛍️ M A R K E T
│ ◦ .gacha | .buypokemon
│ ◦ .jokigacha (Free 4x)
│ ◦ .shop | .jualpokemon
│ ◦ .mypokemon
└──────────────
┌── ⚙️ S E T T I S
│ ◦ .settings | .autodelete
│ ◦ .autoonly (Auto Mode)
│ ◦ .afk | .ping | .cekjam
│ ◦ .runtime | .translate
└──────────────
┌── 👤 A C C O U N T
│ ◦ .myprofile | .leaderboard
│ ◦ .mykoin | .mypoin
│ ◦ .carilirik | .carijudul
│ ◦ .kritikdansaran
└──────────────
┌── ☁️ Z E N I X C L O U D
│ ◦ .addbot (Pairing Code)
│ ◦ .cekbot (Daftar Bot)
└──────────────
┌── 👑 O W N E R
│ ◦ .ownerchat | .userchat
│ ◦ .mode | .block | .broadcast
│ ◦ .shutdown | .isiulangkoin
└──────────────`;
sendViral(menuText);
return;
}
👤 User: @${from.split('@')[0]}
🗑️ Auto Delete: ${db_user[from].autoDelete ? '✅ ON' : '❌ OFF'}
🤖 Auto Only: ${settings.autoOnly ? '✅ ON' : '❌ OFF'}
🔒 Global Mode: ${settings.selfMode ? 'Owner Only' : 'Public'}
Gunakan perintah di bawah untuk mengubah:
◦ .autodelete (On/Off hapus pesan bot)`;
sendViral(setTxt);
break;
╔════════════════════╗
TRAINER CARD
╚════════════════════╝
👤 Name: ${pushname}
📱 Number:
@${from.split('@')[0]}🎖️ Rank: ${userRank.name}
📊 Exp: [${userRank.bar}]
┌─── STORAGE ───┐
│ ❤️ HP: ${userProf.hp || 100}%
│ 💰 Koin: ${userProf.koin.toLocaleString()}
│ 🎖️ Poin: ${userProf.poin.toLocaleString()}
│ 🎒 Poke: ${userProf.pokemon.length} Ekor
└─────────────────┘
Zenix Ultimate Engine v1.1`;
sock.sendMessage(from, { image: { url: ppUrl }, caption: card, mentions: [from] }, { quoted: msg });
break;
}
}
} catch (e) { console.log(e) }
});
}
startZenix();