/* ============== INFO: Feature : RPG CLAN Type: cjs Note: yg mawu pake aja ============== DONT DELETE MY WM PLEASE ################## CODE by Herza $ My github https://github.com/herzonly $ My Instagram https://instagram.com/justme.herz $ My channel https://whatsapp.com/channel/0029VaGVOvq1iUxY6WgHLv2R ################# DONT DELETE MY WM PLEASE */ const crypto = require('crypto'); function generateClanId() { return crypto.randomBytes(3).toString('hex').slice(0, 6).toUpperCase(); } function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } let handler = async (m, { conn, text, usedPrefix, command, args }) => { if (!global.db.data.clans) global.db.data.clans = {}; if (!global.db.data.clanRequests) global.db.data.clanRequests = {}; if (!global.db.data.clanWar) global.db.data.clanWar = {}; const sender = m.sender; const [subCommand, ...params] = args; switch(subCommand) { case 'create': if (!params[0]) { return conn.reply(m.chat, `Gunakan: ${usedPrefix}clan create `, m); } const clanName = params[0]; if (global.db.data.users[sender].cname) { return conn.reply(m.chat, 'Anda sudah memiliki clan. Silakan keluar dari clan saat ini terlebih dahulu.', m); } const clanExists = Object.values(global.db.data.clans).some(clan => clan.name.toLowerCase() === clanName.toLowerCase()); if (clanExists) { return conn.reply(m.chat, 'Nama clan sudah digunakan. Pilih nama lain.', m); } const clanId = generateClanId(); global.db.data.clans[clanId] = { name: clanName, leader: sender, members: [sender], profile: 'https://telegra.ph/file/c6feafae251e9d8e590b2.jpg', catm: 10000, created: new Date().toISOString(), hp: 100 }; global.db.data.users[sender].cname = clanName; global.db.data.users[sender].cleader = true; global.db.data.users[sender].cid = clanId; global.db.data.users[sender].cprofile = 'https://telegra.ph/file/c6feafae251e9d8e590b2.jpg'; global.db.data.users[sender].catm = 10000; conn.reply(m.chat, `Clan ${clanName} berhasil dibuat! Clan ID: ${clanId}`, m); break; case 'withdraw': if (!global.db.data.users[sender].cname) { return conn.reply(m.chat, 'Anda belum memiliki clan.', m); } const withdrawClanId = global.db.data.users[sender].cid; const withdrawClan = global.db.data.clans[withdrawClanId]; const withdrawAmount = parseFloat(params[0]); if (!withdrawAmount || isNaN(withdrawAmount) || withdrawAmount <= 0) { return conn.reply(m.chat, 'Masukkan jumlah penarikan yang valid.', m); } if (withdrawClan.catm < withdrawAmount) { return conn.reply(m.chat, 'Saldo clan tidak mencukupi.', m); } withdrawClan.catm -= withdrawAmount; global.db.data.users[sender].money += withdrawAmount; const leaderNotification = `Peringatan: @${sender.split('@')[0]} telah menarik ${withdrawAmount} dari dana clan.`; conn.reply(m.chat, leaderNotification, null, { contextInfo: { mentionedJid: conn.parseMention(leaderNotification) } }); break; case 'transfer': if (!global.db.data.users[sender].cleader) { return conn.reply(m.chat, 'Hanya leader clan yang dapat mentransfer kepemimpinan.', m); } const mentionedUsers = conn.parseMention(text); if (mentionedUsers.length === 0) { return conn.reply(m.chat, `Gunakan: ${usedPrefix}clan transfer @user`, m); } const newLeader = mentionedUsers[0]; const transferClanId = global.db.data.users[sender].cid; if (newLeader === sender) { return conn.reply(m.chat, 'Anda tidak dapat mentransfer kepemimpinan kepada diri sendiri.', m); } const transferClan = global.db.data.clans[transferClanId]; if (!transferClan.members.includes(newLeader)) { return conn.reply(m.chat, 'Pengguna yang dituju harus menjadi anggota clan.', m); } transferClan.leader = newLeader; global.db.data.users[sender].cleader = false; global.db.data.users[newLeader].cleader = true; const transferNotification = `Kepemimpinan clan telah dipindahkan kepada @${newLeader.split('@')[0]}`; conn.reply(m.chat, transferNotification, null, { contextInfo: { mentionedJid: conn.parseMention(transferNotification) } }); break; case 'join': if (!params[0]) { return conn.reply(m.chat, `Gunakan: ${usedPrefix}clan join `, m); } const joinClanId = params[0].toUpperCase(); if (!global.db.data.clans[joinClanId]) { return conn.reply(m.chat, 'Clan ID tidak ditemukan.', m); } if (global.db.data.users[sender].cname) { return conn.reply(m.chat, 'Anda sudah memiliki clan. Silakan keluar dari clan saat ini terlebih dahulu.', m); } const clan = global.db.data.clans[joinClanId]; const clanLeader = clan.leader; global.db.data.clanRequests[joinClanId] = global.db.data.clanRequests[joinClanId] || {}; global.db.data.clanRequests[joinClanId][sender] = { requester: sender, timestamp: Date.now() }; conn.reply(m.chat, `Permintaan bergabung clan terkirim. Menunggu persetujuan leader clan.`, m); const leaderMessage = `Ada yang ingin bergabung ke clan Anda!\n\nGunakan:\n${usedPrefix}clan accept @${sender.split('@')[0]} untuk menerima\n${usedPrefix}clan decline @${sender.split('@')[0]} untuk menolak`; conn.reply(m.chat, leaderMessage, null, { contextInfo: { mentionedJid: conn.parseMention(leaderMessage) } }); break; case 'accept': if (!global.db.data.users[sender].cleader) { return conn.reply(m.chat, 'Hanya leader clan yang dapat menerima permintaan.', m); } const acceptMentionedUsers = conn.parseMention(text); if (acceptMentionedUsers.length === 0) { return conn.reply(m.chat, `Gunakan: ${usedPrefix}clan accept @user`, m); } const userToAccept = acceptMentionedUsers[0]; const senderClanId = global.db.data.users[sender].cid; if (!global.db.data.clanRequests[senderClanId] || !global.db.data.clanRequests[senderClanId][userToAccept]) { return conn.reply(m.chat, 'Tidak ada permintaan bergabung dari pengguna ini.', m); } const acceptedClan = global.db.data.clans[senderClanId]; acceptedClan.members.push(userToAccept); global.db.data.users[userToAccept].cname = acceptedClan.name; global.db.data.users[userToAccept].cid = senderClanId; global.db.data.users[userToAccept].cprofile = acceptedClan.profile; global.db.data.users[userToAccept].catm = 0; global.db.data.users[userToAccept].cleader = false; delete global.db.data.clanRequests[senderClanId][userToAccept]; const acceptMessage = `@${userToAccept.split('@')[0]} telah diterima bergabung ke clan.`; conn.reply(m.chat, acceptMessage, null, { contextInfo: { mentionedJid: conn.parseMention(acceptMessage) } }); break; case 'decline': if (!global.db.data.users[sender].cleader) { return conn.reply(m.chat, 'Hanya leader clan yang dapat menolak permintaan.', m); } const declineMentionedUsers = conn.parseMention(text); if (declineMentionedUsers.length === 0) { return conn.reply(m.chat, `Gunakan: ${usedPrefix}clan decline @user`, m); } const userToDecline = declineMentionedUsers[0]; const declineSenderClanId = global.db.data.users[sender].cid; if (!global.db.data.clanRequests[declineSenderClanId] || !global.db.data.clanRequests[declineSenderClanId][userToDecline]) { return conn.reply(m.chat, 'Tidak ada permintaan bergabung dari pengguna ini.', m); } delete global.db.data.clanRequests[declineSenderClanId][userToDecline]; const declineMessage = `Maaf, permintaan bergabung clan Anda ditolak oleh leader.`; conn.reply(m.chat, declineMessage, null, { contextInfo: { mentionedJid: conn.parseMention(declineMessage) } }); break; case 'info': if (!global.db.data.users[sender].cname) { return conn.reply(m.chat, 'Anda belum bergabung dengan clan manapun.', m); } const userClanId = global.db.data.users[sender].cid; const clanInfo = global.db.data.clans[userClanId]; const membersInfo = clanInfo.members.map((member, index) => `${index + 1}. @${member.split('@')[0]}`).join('\n'); const infoMessage = `🏰 Clan Info 🏰 Clan Name: ${clanInfo.name} Clan Created: ${new Date(clanInfo.created).toLocaleDateString()} Clan Leader: @${clanInfo.leader.split('@')[0]} Clan Members: ${clanInfo.members.length} Clan ID: ${userClanId} Clan Profile: ${clanInfo.profile} Clan ATM: ${clanInfo.catm} Clan HP: ${clanInfo.hp || 100} Daftar Anggota: ${membersInfo}`; conn.reply(m.chat, infoMessage, null, { contextInfo: { mentionedJid: conn.parseMention(infoMessage) } }); break; case 'deposit': if (!global.db.data.users[sender].cname) { return conn.reply(m.chat, 'Anda belum memiliki clan.', m); } const depositAmount = parseFloat(params[0]); if (!depositAmount || isNaN(depositAmount) || depositAmount <= 0) { return conn.reply(m.chat, 'Masukkan jumlah deposit yang valid.', m); } const userMoney = global.db.data.users[sender].money || 0; if (userMoney < depositAmount) { return conn.reply(m.chat, 'Saldo Anda tidak mencukupi untuk melakukan deposit.', m); } const depositClanId = global.db.data.users[sender].cid; const depositClan = global.db.data.clans[depositClanId]; global.db.data.users[sender].money -= depositAmount; depositClan.catm += depositAmount; const depositNotification = `@${sender.split('@')[0]} telah mendepositkan ${depositAmount} ke dana clan.`; conn.reply(m.chat, depositNotification, null, { contextInfo: { mentionedJid: conn.parseMention(depositNotification) } }); break; case 'war': if (!params[0]) return conn.reply(m.chat, `Gunakan: ${usedPrefix}clan war `, m); if (params[0] === 'accept' || params[0] === 'decline') { if (!global.db.data.users[sender].cleader) return conn.reply(m.chat, 'Hanya leader yang bisa melakukan ini.', m); const warClanId = global.db.data.users[sender].cid; if (!global.db.data.clanWar[warClanId]) return conn.reply(m.chat, 'Tidak ada permintaan war.', m); const opponentId = global.db.data.clanWar[warClanId].opponent; if (params[0] === 'accept') { global.db.data.clanWar[warClanId].status = 'ongoing'; global.db.data.clanWar[opponentId].status = 'ongoing'; conn.reply(m.chat, 'Clan war dimulai! Perang akan berlangsung dengan serangan setiap 3 detik.', m); // Notify both clan leaders that war has started const clan1Leader = global.db.data.clans[warClanId].leader; const clan2Leader = global.db.data.clans[opponentId].leader; conn.reply(clan1Leader, `⚔️ WAR DIMULAI ⚔️\nClan ${global.db.data.clans[warClanId].name} VS Clan ${global.db.data.clans[opponentId].name}`, null); conn.reply(clan2Leader, `⚔️ WAR DIMULAI ⚔️\nClan ${global.db.data.clans[opponentId].name} VS Clan ${global.db.data.clans[warClanId].name}`, null); startWarWithDelay(warClanId, opponentId, conn); } else { delete global.db.data.clanWar[warClanId]; delete global.db.data.clanWar[opponentId]; conn.reply(m.chat, 'Clan war ditolak.', m); // Notify the opponent leader that war was declined conn.reply(global.db.data.clans[opponentId].leader, `Clan ${global.db.data.clans[warClanId].name} menolak tantangan war anda.`, null); } return; } const targetClanId = params[0].toUpperCase(); if (!global.db.data.users[sender].cname) return conn.reply(m.chat, 'Anda tidak memiliki clan.', m); if (!global.db.data.users[sender].cleader) return conn.reply(m.chat, 'Hanya leader clan yang dapat memulai war.', m); if (!global.db.data.clans[targetClanId]) return conn.reply(m.chat, 'Clan tidak ditemukan.', m); const warSenderClanId = global.db.data.users[sender].cid; if (targetClanId === warSenderClanId) return conn.reply(m.chat, 'Tidak bisa menyerang clan sendiri.', m); // Check if already in war if (global.db.data.clanWar[warSenderClanId]) return conn.reply(m.chat, 'Clan anda sedang dalam war atau memiliki permintaan war yang belum diselesaikan.', m); if (global.db.data.clanWar[targetClanId]) return conn.reply(m.chat, 'Clan target sedang dalam war atau memiliki permintaan war yang belum diselesaikan.', m); // Reset clan HP for war global.db.data.clans[warSenderClanId].hp = 100; global.db.data.clans[targetClanId].hp = 100; const targetLeader = global.db.data.clans[targetClanId].leader; global.db.data.clanWar[warSenderClanId] = { opponent: targetClanId, status: 'pending', startTime: Date.now() }; global.db.data.clanWar[targetClanId] = { opponent: warSenderClanId, status: 'pending', startTime: Date.now() }; conn.reply(targetLeader, `⚔️ TANTANGAN WAR ⚔️\nClan ${global.db.data.clans[warSenderClanId].name} menantang clan anda untuk war!\n\nGunakan:\n${usedPrefix}clan war accept - untuk menerima\n${usedPrefix}clan war decline - untuk menolak`, null); conn.reply(m.chat, `Tantangan war telah dikirim ke leader clan ${global.db.data.clans[targetClanId].name}.`, m); break; case 'leave': if (!global.db.data.users[sender].cname) { return conn.reply(m.chat, 'Anda belum bergabung dengan clan manapun.', m); } const leaveClanId = global.db.data.users[sender].cid; const leaveClan = global.db.data.clans[leaveClanId]; if (leaveClan.leader === sender) { return conn.reply(m.chat, 'Sebagai leader, Anda tidak dapat meninggalkan clan. Gunakan .clan remove untuk membubarkan clan.', m); } leaveClan.members = leaveClan.members.filter(member => member !== sender); delete global.db.data.users[sender].cname; delete global.db.data.users[sender].cid; delete global.db.data.users[sender].cprofile; delete global.db.data.users[sender].catm; conn.reply(m.chat, 'Anda telah keluar dari clan.', m); break; case 'remove': if (!global.db.data.users[sender].cleader) { return conn.reply(m.chat, 'Hanya leader clan yang dapat membubarkan clan.', m); } const removeClanId = global.db.data.users[sender].cid; const removeClan = global.db.data.clans[removeClanId]; const remainingMembers = removeClan.members.filter(member => member !== sender); const atmSplit = removeClan.catm / (remainingMembers.length || 1); remainingMembers.forEach(member => { if (global.db.data.users[member]) { global.db.data.users[member].catm = (global.db.data.users[member].catm || 0) + atmSplit; } }); remainingMembers.forEach(member => { delete global.db.data.users[member].cname; delete global.db.data.users[member].cid; delete global.db.data.users[member].cprofile; }); delete global.db.data.clans[removeClanId]; delete global.db.data.users[sender].cname; delete global.db.data.users[sender].cleader; delete global.db.data.users[sender].cid; delete global.db.data.users[sender].cprofile; conn.reply(m.chat, 'Clan telah dibubarkan. Sisa dana clan dibagi ke anggota yang tersisa.', m); break; default: const helpMessage = ` Perintah Clan: • ${usedPrefix}clan create - Buat clan baru • ${usedPrefix}clan join - Minta bergabung clan • ${usedPrefix}clan accept @user - Terima permintaan bergabung • ${usedPrefix}clan decline @user - Tolak permintaan bergabung • ${usedPrefix}clan withdraw - Tarik dana clan • ${usedPrefix}clan deposit - Deposit dana ke clan • ${usedPrefix}clan leave - keluar dari clan • ${usedPrefix}clan remove - membubarkan clan • ${usedPrefix}clan transfer @user - Transfer kepemimpinan • ${usedPrefix}clan info - Lihat info clan • ${usedPrefix}clan war - untuk war antar clan • ${usedPrefix}clan war accept - menyetujui war antar clan • ${usedPrefix}clan war decline - menolak war dengan clan lain`; conn.reply(m.chat, helpMessage, m); break; } }; handler.help = ['clan']; handler.tags = ['rpg']; handler.limit = true handler.command = /^(clan)$/i; module.exports = handler; async function startWarWithDelay(clan1Id, clan2Id, conn) { const clan1 = global.db.data.clans[clan1Id]; const clan2 = global.db.data.clans[clan2Id]; let clan1Leader = clan1.leader; let clan2Leader = clan2.leader; clan1.hp = 50; clan2.hp = 50; conn.reply(clan1Leader, `⚔️ STATUS WAR ⚔️\nClan ${clan1.name}: HP ${clan1.hp}\nClan ${clan2.name}: HP ${clan2.hp}`, null); conn.reply(clan2Leader, `⚔️ STATUS WAR ⚔️\nClan ${clan2.name}: HP ${clan2.hp}\nClan ${clan1.name}: HP ${clan1.hp}`, null); let attackingClanId = Math.random() < 0.5 ? clan1Id : clan2Id; await runWarLoop(clan1Id, clan2Id, attackingClanId, conn); } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function runWarLoop(clan1Id, clan2Id, attackingClanId, conn) { const clan1 = global.db.data.clans[clan1Id]; const clan2 = global.db.data.clans[clan2Id]; let clan1Leader = clan1.leader; let clan2Leader = clan2.leader; while (clan1.hp > 0 && clan2.hp > 0) { let damage = getRandom(5, 15); let defendingClanId = attackingClanId === clan1Id ? clan2Id : clan1Id; let attackingClan = global.db.data.clans[attackingClanId]; let defendingClan = global.db.data.clans[defendingClanId]; defendingClan.hp -= damage; if (defendingClan.hp < 0) defendingClan.hp = 0; await sleep(3000); const attackerMessage = `⚔️ SERANGAN WAR ⚔️\nClan ${attackingClan.name} menyerang Clan ${defendingClan.name}!\nDamage: ${damage}\n\nStatus HP:\nClan ${attackingClan.name}: ${attackingClan.hp}\nClan ${defendingClan.name}: ${defendingClan.hp}`; const defenderMessage = `⚡ CLAN DISERANG ⚡\nClan ${defendingClan.name} diserang oleh Clan ${attackingClan.name}!\nDarah clan kamu berkurang ${damage}!\n\nStatus HP:\nClan ${defendingClan.name}: ${defendingClan.hp}\nClan ${attackingClan.name}: ${attackingClan.hp}`; conn.reply(attackingClan.leader, attackerMessage, null); conn.reply(defendingClan.leader, defenderMessage, null); attackingClanId = defendingClanId; await sleep(3000); } let winnerClanId = clan1.hp > 0 ? clan1Id : clan2Id; let loserClanId = winnerClanId === clan1Id ? clan2Id : clan1Id; let stealAmount = Math.floor(global.db.data.clans[loserClanId].catm * 0.203); global.db.data.clans[loserClanId].catm -= stealAmount; global.db.data.clans[winnerClanId].catm += stealAmount; global.db.data.clanWar[winnerClanId].status = 'completed'; global.db.data.clanWar[loserClanId].status = 'completed'; const winnerMessage = `🏆 WAR SELESAI - KEMENANGAN! 🏆\nClan ${global.db.data.clans[winnerClanId].name} menang melawan Clan ${global.db.data.clans[loserClanId].name}!\n\nClan kamu berhasil mendapatkan uang sebesar ${stealAmount} yang ditambahkan ke ATM clan.`; const loserMessage = `❌ WAR SELESAI - KEKALAHAN! ❌\nClan ${global.db.data.clans[loserClanId].name} kalah melawan Clan ${global.db.data.clans[winnerClanId].name}.\n\nClan ${global.db.data.clans[winnerClanId].name} menang dan merampas uang ATM clan kamu sebesar ${stealAmount}.`; conn.reply(global.db.data.clans[winnerClanId].leader, winnerMessage, null); conn.reply(global.db.data.clans[loserClanId].leader, loserMessage, null); setTimeout(() => { delete global.db.data.clanWar[clan1Id]; delete global.db.data.clanWar[clan2Id]; }, 5000); } setInterval(() => { for (let clanId in global.db.data.clans) { if (!global.db.data.clans[clanId].hp) global.db.data.clans[clanId].hp = 100; if (global.db.data.clans[clanId].hp < 100) global.db.data.clans[clanId].hp += 20; if (global.db.data.clans[clanId].hp > 100) global.db.data.clans[clanId].hp = 100; } }, 24 * 60 * 60 * 1000);