// code from goatstore // api: https://store.agi.bd const fs = require("fs"); const path = require("path"); const bankDataPath = path.join(__dirname, "bankData.json"); function loadBankData() { try { if (!fs.existsSync(bankDataPath)) { fs.writeFileSync(bankDataPath, JSON.stringify({}, null, 2), "utf8"); } const data = fs.readFileSync(bankDataPath, "utf8"); return data.trim() ? JSON.parse(data) : {}; } catch (error) { return {}; } } function saveBankData(data) { fs.writeFileSync(bankDataPath, JSON.stringify(data, null, 2), "utf8"); } function formatNumberWithFullForm(number) { number = Number(number) || 0; if (number >= 1e12) { return number.toLocaleString("en-US", { maximumFractionDigits: 2 }); } return number.toLocaleString("en-US", { maximumFractionDigits: 2 }); } module.exports = { config: { name: "bank", version: "2.0", description: "Deposit, withdraw, transfer and earn interest from your bank", guide: { en: "{pn} balance\n" + "{pn} deposit \n" + "{pn} withdraw \n" + "{pn} interest\n" + "{pn} transfer \n" + "{pn} richest" }, category: "💰 Economy", countDown: 15, role: 0, author: "Loufi | SiAM | Samuel | Modified: Shikaki" }, onStart: async function ({ args, message, event, api, usersData }) { try { const userID = String(event.senderID); const command = (args[0] || "balance").toLowerCase(); const userMoneyRaw = await usersData.get(userID, "money"); const userMoney = Number(userMoneyRaw) || 0; const bankData = loadBankData(); if (!bankData[userID]) { bankData[userID] = { bank: 0, lastInterestClaimed: Date.now() }; saveBankData(bankData); } if (typeof bankData[userID].bank !== "number") { bankData[userID].bank = Number(bankData[userID].bank) || 0; } if (!bankData[userID].lastInterestClaimed) { bankData[userID].lastInterestClaimed = Date.now(); } const bankBalance = bankData[userID].bank; const amount = Number(args[1]); // ========================= // BALANCE // ========================= if ( command === "balance" || command === "bal" || command === "b" ) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ BANK đŸĻ]\n\n" + `❏ Cash: $${formatNumberWithFullForm(userMoney)}\n\n` + `❏ Bank: $${formatNumberWithFullForm(bankBalance)}\n\n` + `❏ Total: $${formatNumberWithFullForm(userMoney + bankBalance)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // ========================= // DEPOSIT // ========================= if (command === "deposit" || command === "dep") { if (!Number.isFinite(amount) || amount <= 0) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Please enter a valid amount to deposit 🔁\n\n" + "Example: bank deposit 1000\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if (amount > userMoney) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ You don't have enough money to deposit ❌\n\n" + `❏ Your cash: $${formatNumberWithFullForm(userMoney)}\n` + `❏ Required: $${formatNumberWithFullForm(amount)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } bankData[userID].bank += amount; await usersData.set(userID, { money: userMoney - amount }); saveBankData(bankData); return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + `❏ Successfully deposited $${formatNumberWithFullForm(amount)} ✅\n\n` + `❏ Bank balance: $${formatNumberWithFullForm(bankData[userID].bank)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // ========================= // WITHDRAW // ========================= if ( command === "withdraw" || command === "with" ) { if (!Number.isFinite(amount) || amount <= 0) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Please enter a valid amount to withdraw ❌\n\n" + "Example: bank withdraw 1000\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if (amount > bankBalance) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Insufficient bank balance đŸ—ŋ\n\n" + `❏ Bank balance: $${formatNumberWithFullForm(bankBalance)}\n` + `❏ Requested: $${formatNumberWithFullForm(amount)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } bankData[userID].bank -= amount; await usersData.set(userID, { money: userMoney + amount }); saveBankData(bankData); return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + `❏ Successfully withdrew $${formatNumberWithFullForm(amount)} ✅\n\n` + `❏ Cash: $${formatNumberWithFullForm(userMoney + amount)}\n` + `❏ Bank: $${formatNumberWithFullForm(bankData[userID].bank)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // ========================= // INTEREST // ========================= if (command === "interest" || command === "int") { const interestRate = 0.001; // 0.1% per day const currentTime = Date.now(); const lastClaim = Number(bankData[userID].lastInterestClaimed) || currentTime; const timeDiff = currentTime - lastClaim; const oneDay = 24 * 60 * 60 * 1000; if (bankBalance <= 0) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ You don't have money in your bank to earn interest 💸\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if (timeDiff < oneDay) { const remaining = oneDay - timeDiff; const hours = Math.floor(remaining / 3600000); const minutes = Math.floor( (remaining % 3600000) / 60000 ); return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + `❏ You can claim interest again in ${hours}h ${minutes}m âŗ\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } const daysPassed = timeDiff / oneDay; const interestEarned = bankBalance * interestRate * daysPassed; bankData[userID].bank += interestEarned; bankData[userID].lastInterestClaimed = currentTime; saveBankData(bankData); return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + `❏ Interest earned: $${formatNumberWithFullForm(interestEarned)} 💰\n\n` + `❏ New bank balance: $${formatNumberWithFullForm(bankData[userID].bank)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // ========================= // TRANSFER // ========================= if ( command === "transfer" || command === "send" ) { const recipientUID = String(args[1] || ""); const transferAmount = Number(args[2]); if (!recipientUID || !/^\d+$/.test(recipientUID)) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Invalid recipient UID ❌\n\n" + "Example:\n" + "bank transfer 100012345678 5000\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if (recipientUID === userID) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ You cannot transfer money to yourself đŸ—ŋ\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if ( !Number.isFinite(transferAmount) || transferAmount <= 0 ) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Enter a valid transfer amount ❌\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if (transferAmount > bankBalance) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Insufficient bank balance 💸\n\n" + `❏ Your bank: $${formatNumberWithFullForm(bankBalance)}\n` + `❏ Requested: $${formatNumberWithFullForm(transferAmount)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // Check recipient let recipientName = recipientUID; try { const userInfo = await api.getUserInfo(recipientUID); if (userInfo && userInfo[recipientUID]) { recipientName = userInfo[recipientUID].name; } } catch (error) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ Could not find that user ❌\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } if (!bankData[recipientUID]) { bankData[recipientUID] = { bank: 0, lastInterestClaimed: Date.now() }; } bankData[userID].bank -= transferAmount; bankData[recipientUID].bank += transferAmount; saveBankData(bankData); return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + `❏ Sent: $${formatNumberWithFullForm(transferAmount)} ✅\n\n` + `❏ Recipient: ${recipientName}\n` + `❏ UID: ${recipientUID}\n\n` + `❏ Your new balance: $${formatNumberWithFullForm(bankData[userID].bank)}\n\n` + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // ========================= // RICHEST // ========================= if ( command === "richest" || command === "top" ) { const entries = Object.entries(bankData); if (entries.length === 0) { return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ No bank data found yet.\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } entries.sort((a, b) => { return ( Number(b[1].bank || 0) - Number(a[1].bank || 0) ); }); const topUsers = entries.slice(0, 10); let leaderboard = ""; for (let i = 0; i < topUsers.length; i++) { const uid = topUsers[i][0]; const balance = Number(topUsers[i][1].bank || 0); let name = uid; try { const info = await api.getUserInfo(uid); if (info && info[uid] && info[uid].name) { name = info[uid].name; } } catch (error) {} leaderboard += `${i + 1}. ${name}\n` + ` 💰 $${formatNumberWithFullForm(balance)}\n\n`; } return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "🏆 [ TOP BANK USERS ] 🏆\n\n" + leaderboard + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } // ========================= // HELP // ========================= return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ BANK COMMANDS đŸĻ]\n\n" + "❏ bank balance\n" + "❏ bank deposit \n" + "❏ bank withdraw \n" + "❏ bank interest\n" + "❏ bank transfer \n" + "❏ bank richest\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } catch (error) { console.error("BANK COMMAND ERROR:", error); return message.reply( "â•”â•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•—\n\n" + "[đŸĻ Bank đŸĻ]\n\n" + "❏ An error occurred while processing the bank command đŸĨ˛\n" + "❏ Please try again later.\n\n" + "â•šâ•â•â•â•āŽœÛŠÛžÛŠāŽœâ•â•â•â•" ); } } };