// code from goatstore // api: https://store.agi.bd const moment = require("moment-timezone"); 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]}`; } function fmtDuration(ms) { const h = Math.floor(ms / 3600000); const m = Math.floor((ms % 3600000) / 60000); const s = Math.floor((ms % 60000) / 1000); if (h > 0) return `${h}h ${m}m`; if (m > 0) return `${m}m ${s}s`; return `${s}s`; } const GIFT_FRAMES = ["🎁", "πŸ“¦", "πŸŽ€", "🎁"]; const STREAK_BREAK_MS = 48 * 60 * 60 * 1000; // miss more than 48h -> streak resets module.exports = { config: { name: "daily", version: "2.0", author: "ROCKY CHOWDHURY", countDown: 5, role: 0, description: { en: "Receive daily gift" }, category: "π—ͺπ—”π—Ÿπ—Ÿπ—˜π—§", guide: { en: " {pn}: Claim your daily bonus" + "\n {pn} info: View daily bonus information" }, envConfig: { dailyReward: 1000000, // flat coin reward every claim cooldownHours: 24 // hours required between claims } }, langs: { en: { alreadyReceived: "πŸ’Œ π’šπ’π’–'𝒗𝒆 π’‚π’π’“π’†π’‚π’…π’š π’„π’π’‚π’Šπ’Žπ’†π’… π’šπ’π’–π’“ 𝒃𝒐𝒏𝒖𝒔~", received: "🎁 π‘Ήπ’†π’˜π’‚π’“π’…: +πŸ’²%1 π’„π’π’Šπ’" } }, onStart: async function ({ args, message, event, envCommands, usersData, commandName, getLang, api }) { const env = (envCommands && envCommands[commandName]) || this.config.envConfig; const dailyReward = env.dailyReward; const cooldownMs = env.cooldownHours * 60 * 60 * 1000; const { senderID } = event; // ---- Info page ---- if (args[0] === "info") { const msg = `❀°‒ π‘«π’‚π’Šπ’π’š 𝑩𝒐𝒏𝒖𝒔 ‒°❀\n\n` + `🎁 π‘Ήπ’†π’˜π’‚π’“π’…: πŸ’²${shortMoney(dailyReward)} 𝒑𝒆𝒓 π’„π’π’‚π’Šπ’Ž\n` + `⏰ π‘ͺπ’π’π’π’…π’π’˜π’: ${env.cooldownHours}𝒉\n\n` + `✨ π‘Όπ’”π’‚π’ˆπ’†: {pn}`; return message.reply(msg); } const userData = await usersData.get(senderID); const data = userData.data || {}; const lastDaily = data.lastDaily || 0; const prevStreak = data.dailyStreak || 0; const now = Date.now(); const elapsed = now - lastDaily; // ---- Still on cooldown ---- if (lastDaily && elapsed < cooldownMs) { const remaining = cooldownMs - elapsed; const nextClaimStr = moment(lastDaily + cooldownMs) .tz("Asia/Dhaka") .format("MMM D, h:mm A"); return message.reply( `⏳ ❀°‒ π‘«π’‚π’Šπ’π’š 𝑩𝒐𝒏𝒖𝒔 ‒°❀ ⏳\n\n` + `${getLang("alreadyReceived")}\n\n` + `⏰ π‘»π’Šπ’Žπ’† 𝒍𝒆𝒇𝒕: ${fmtDuration(remaining)}\n` + `πŸ“… 𝑡𝒆𝒙𝒕 π’„π’π’‚π’Šπ’Ž: ${nextClaimStr}\n` + `πŸ”₯ π‘Ίπ’•π’“π’†π’‚π’Œ: ${prevStreak} ${prevStreak === 1 ? "day" : "days"}` ); } // ---- Work out new streak ---- const streakBroken = lastDaily && elapsed > STREAK_BREAK_MS; const newStreak = streakBroken || !lastDaily ? 1 : prevStreak + 1; // ---- Send the first "gift box" frame ---- const sentInfo = await new Promise((resolve, reject) => { api.sendMessage( `❀°‒ π‘«π’‚π’Šπ’π’š 𝑩𝒐𝒏𝒖𝒔 ‒°❀\n\n${GIFT_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; } // ---- Little unwrap animation ---- for (let i = 1; i < GIFT_FRAMES.length; i++) { await delay(500); await safeEdit(`❀°‒ π‘«π’‚π’Šπ’π’š 𝑩𝒐𝒏𝒖𝒔 ‒°❀\n\n${GIFT_FRAMES[i]} π’π’‘π’†π’π’Šπ’π’ˆ π’šπ’π’–π’“ π’ˆπ’Šπ’‡π’•...`); } await delay(500); // ---- Apply the reward (flat amount every time) ---- data.lastDaily = now; data.dailyStreak = newStreak; const newBalance = (userData.money || 0) + dailyReward; await usersData.set(senderID, { money: newBalance, data }); const msg = `πŸŽ‰ ❀°‒ π‘«π’‚π’Šπ’π’š 𝑩𝒐𝒏𝒖𝒔 ‒°❀ πŸŽ‰\n` + `β™‘β”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ™‘\n\n` + `πŸ’Œ π’šπ’π’–π’“ π’ˆπ’Šπ’‡π’• 𝒉𝒂𝒔 π’‚π’“π’“π’Šπ’—π’†π’…! πŸ’Œ\n\n` + `${getLang("received", shortMoney(dailyReward))}\n` + `πŸ”₯ π‘Ίπ’•π’“π’†π’‚π’Œ: ${newStreak} ${newStreak === 1 ? "day" : "days"} π’Šπ’ 𝒂 π’“π’π’˜\n` + `πŸ’° 𝑩𝒂𝒍𝒂𝒏𝒄𝒆: ${shortMoney(newBalance)}\n` + `β™‘β”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ”ˆβ™‘\n` + `⏰ π’„π’π’Žπ’† π’ƒπ’‚π’„π’Œ π’Šπ’ ${env.cooldownHours}𝒉 𝒇𝒐𝒓 π’šπ’π’–π’“ 𝒏𝒆𝒙𝒕 π’ˆπ’Šπ’‡π’•~ ✨`; await safeEdit(msg); } };