// code from goatstore // api: https://store.agi.bd const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); function shortMoney(n) { const suf = ["", "K", "M", "B", "T", "QA", "QI"]; let num = Number(n) || 0; let i = 0; while (Math.abs(num) >= 1000 && i < suf.length - 1) { num /= 1000; i++; } return `${Number(num.toFixed(2))}${suf[i]}`; } // Same tier system as top.js, kept in sync so ranks feel consistent everywhere. function tierFor(balance) { if (balance >= 100_000_000) return "Legend"; if (balance >= 10_000_000) return "Diamond"; if (balance >= 1_000_000) return "Platinum"; if (balance >= 100_000) return "Gold"; if (balance >= 10_000) return "Silver"; if (balance >= 1_000) return "Bronze"; return "Rookie"; } function tierEmoji(tier) { const map = { Legend: "πŸ‘‘", Diamond: "πŸ’Ž", Platinum: "🌟", Gold: "🏡️", Silver: "πŸ”·", Bronze: "πŸ”Ά", Rookie: "🌱" }; return map[tier] || "✨"; } const SEARCH_FRAMES = ["πŸ”", "πŸ’°", "✨"]; module.exports = { config: { name: "balance", version: "1.0", author: "ROCKY CHOWDHURY", countDown: 5, role: 0, description: { en: "Check your (or someone else's) coin balance" }, category: "π—ͺπ—”π—Ÿπ—Ÿπ—˜π—§", guide: { en: " {pn}: Check your own balance" + "\n {pn} @mention (or reply to someone): Check their balance" } }, onStart: async function ({ args, message, event, usersData, api }) { // ---- Work out whose balance we're checking ---- let targetID = event.senderID; let targetName = null; if (event.type === "message_reply" && event.messageReply) { targetID = event.messageReply.senderID; } else if (Object.keys(event.mentions || {}).length > 0) { targetID = Object.keys(event.mentions)[0]; } const isSelf = targetID === event.senderID; // ---- Send the first "searching" frame ---- const sentInfo = await new Promise((resolve, reject) => { api.sendMessage( `❀°‒ 𝑩𝒂𝒍𝒂𝒏𝒄𝒆 π‘ͺπ’‰π’†π’„π’Œ ‒°❀\n\n${SEARCH_FRAMES[0]} π’„π’‰π’†π’„π’Œπ’Šπ’π’ˆ...`, event.threadID, (err, info) => { if (err) return reject(err); resolve(info); }, event.messageID ); }); async function safeEdit(text, retries = 3) { for (let attempt = 0; attempt <= retries; attempt++) { try { await api.editMessage(text, sentInfo.messageID); return true; } catch (e) { if (attempt === retries) { console.log("editMessage failed after retries:", e); return false; } await delay(300); } } return false; } for (let i = 1; i < SEARCH_FRAMES.length; i++) { await delay(400); await safeEdit(`❀°‒ 𝑩𝒂𝒍𝒂𝒏𝒄𝒆 π‘ͺπ’‰π’†π’„π’Œ ‒°❀\n\n${SEARCH_FRAMES[i]} π’„π’‰π’†π’„π’Œπ’Šπ’π’ˆ...`); } await delay(400); // ---- Fetch balance ---- const userData = await usersData.get(targetID); const balance = (userData && userData.money) || 0; const streak = (userData && userData.data && userData.data.dailyStreak) || 0; const tier = tierFor(balance); const icon = tierEmoji(tier); // ---- Resolve display name ---- let name = "you"; if (!isSelf) { try { const info = await api.getUserInfo(targetID); name = (info[targetID] && info[targetID].name) || "this user"; } catch (e) { name = "this user"; } } const msg = `πŸ’° ❀°‒ 𝑩𝒂𝒍𝒂𝒏𝒄𝒆 π‘ͺπ’‰π’†π’„π’Œ ‒°❀ πŸ’°\n` + `β™‘β”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ™‘\n\n` + (isSelf ? `πŸ’Œ π’šπ’π’–π’“ 𝒃𝒂𝒍𝒂𝒏𝒄𝒆:\n` : `πŸ’Œ ${name}'𝒔 𝒃𝒂𝒍𝒂𝒏𝒄𝒆:\n`) + `πŸ’² ${shortMoney(balance)}\n\n` + `${icon} π‘»π’Šπ’†π’“: ${tier}\n` + (streak > 0 ? `πŸ”₯ π‘«π’‚π’Šπ’π’š π‘Ίπ’•π’“π’†π’‚π’Œ: ${streak} ${streak === 1 ? "day" : "days"}\n` : "") + `β™‘β”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ™‘\n` + `✨ π’Œπ’†π’†π’‘ π’†π’‚π’“π’π’Šπ’π’ˆ~ ✨`; await safeEdit(msg); } };