// code from goatstore // api: https://store.agi.bd "use strict"; const https = require("https"); const CONFIG = { city: "Dhaka", country: "Bangladesh", timezone: "Asia/Dhaka", interval: 30 * 1000, apiUrl: "https://api.aladhan.com/v1/timingsByCity?city=Dhaka&country=Bangladesh&method=1" }; const PRAYERS = { Fajr: { name: "ফজর", message: time => ` ╭━━━〔 🌙💗 𝐁𝐁𝐘 𝐔𝐓𝐇𝐎 💗🌙 〕━━━╮ 🥺😘 Bbyyy, ঘুমাচ্ছো এখনো? 🥹💞 🌸 ফজরের নামাজের সময় হয়েছে, সোনা! ⏰ 𝐓𝐈𝐌𝐄 : ${time} 🕌 প্লিজ বাবু, একটু উঠে অজু করে ফজরের নামাজটা পড়ে নাও, জান! 🤍 😘 নামাজ পড়ে আবার ঘুমিও, বাবু। আল্লাহ তোমাকে ভালো রাখুন। 🫶🥹 ╰━━━〔 💗 𝐋𝐎𝐕𝐄 & 𝐃𝐔𝐀 💗 〕━━━╯` }, Dhuhr: { name: "যোহর", message: time => ` ╭━━━〔 ☀️💗 𝐘𝐎𝐇𝐎𝐑 𝐓𝐈𝐌𝐄 💗☀️ 〕━━━╮ 🥹😘 Bby, আজকে অনেক গরম, তাই না? 🌞 ⏰ 𝐓𝐈𝐌𝐄 : ${time} 💗 সোনা, একটু ফ্রেশ হয়ে নাও, অজু করে যোহরের নামাজটা পড়ে নাও। 🕌 🤍 কাজের মাঝে নিজের যত্ন নিও, আর নামাজটা সময়মতো আদায় করো, বাবু। ╰━━━〔 🌸 𝐓𝐀𝐊𝐄 𝐂𝐀𝐑𝐄 🌸 〕━━━╯` }, Asr: { name: "আসর", message: time => ` ╭━━━〔 🌤️💗 𝐀𝐒𝐑 𝐓𝐈𝐌𝐄 💗🌤️ 〕━━━╮ 😘 বাবু, একটু শোনো না! 🥺💞 ⏰ 𝐓𝐈𝐌𝐄 : ${time} 🕌 আসরের নামাজের সময় হয়েছে, সোনা। অজু করে নামাজটা পড়ে নাও। 🤍 💗 ব্যস্ততা যতই থাকুক, নিজের ইবাদতের জন্য একটু সময় রেখো, জান। ╰━━━〔 💗 𝐒𝐓𝐀𝐘 𝐁𝐋𝐄𝐒𝐒𝐄𝐃 💗 〕━━━╯` }, Maghrib: { name: "মাগরিব", message: time => ` ╭━━━〔 🌇💗 𝐌𝐀𝐆𝐇𝐑𝐈𝐁 𝐓𝐈𝐌𝐄 💗🌇 〕━━━╮ 🥺😘 Bby, মাগরিবের নামাজের সময় হয়েছে! ⏰ 𝐓𝐈𝐌𝐄 : ${time} 🌸 সোনা, অজু করে নামাজটা পড়ে নাও। আল্লাহর ডাকে সাড়া দাও, বাবু। 🤍 💞 নামাজ শেষে আবার আড্ডা হবে, আগে নামাজটা আদায় করে নাও। 🫶 ╰━━━〔 🤍 𝐃𝐔𝐀 𝐅𝐎𝐑 𝐘𝐎𝐔 🤍 〕━━━╯` }, Isha: { name: "এশা", message: time => ` ╭━━━〔 🌙💗 𝐈𝐒𝐇𝐀 𝐓𝐈𝐌𝐄 💗🌙 〕━━━╮ 🥹😘 বাবু, রাত হয়ে গেছে, জানো? ⏰ 𝐓𝐈𝐌𝐄 : ${time} 🕌 এশার নামাজের সময় হয়েছে, সোনা। অজু করে নামাজটা পড়ে নাও। 🤍 🌸 সারাদিনের ব্যস্ততা শেষে আল্লাহর কাছে নিজের জন্য দোয়া করো। 😘 নামাজ পড়ে নিশ্চিন্তে ঘুমিও, বাবু। তোমার রাতটা শান্তিময় হোক। 💗 ╰━━━〔 🌙 𝐒𝐖𝐄𝐄𝐓 𝐃𝐑𝐄𝐀𝐌𝐒 🌙 〕━━━╯` } }; function getDhakaTime() { const parts = new Intl.DateTimeFormat("en-GB", { timeZone: CONFIG.timezone, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).formatToParts(new Date()); const values = {}; for (const part of parts) { if (part.type !== "literal") { values[part.type] = part.value; } } return { date: `${values.year}-${values.month}-${values.day}`, time: `${values.hour}:${values.minute}` }; } function fetchPrayerTimes() { return new Promise((resolve, reject) => { https.get(CONFIG.apiUrl, { timeout: 15000 }, response => { let body = ""; response.on("data", chunk => { body += chunk; }); response.on("end", () => { try { if (response.statusCode !== 200) { throw new Error(`Prayer API HTTP ${response.statusCode}`); } const json = JSON.parse(body); if (json.code !== 200 || !json.data?.timings) { throw new Error("Invalid prayer-time response"); } resolve(json.data.timings); } catch (error) { reject(error); } }); }).on("error", reject); }); } function sendMessage(api, message, threadID) { return new Promise(resolve => { api.sendMessage(message, threadID, error => { if (error) { console.error("[Namaj] Message send failed:", error.message || error); } resolve(!error); }); }); } function getAllGroups(api) { return new Promise((resolve, reject) => { api.getThreadList(100, null, ["INBOX"], (error, threads) => { if (error) return reject(error); const groups = (threads || []) .filter(thread => thread.isGroup && thread.threadID) .map(thread => thread.threadID); resolve([...new Set(groups)]); }); }); } async function broadcast(api, message) { const groups = await getAllGroups(api); let sent = 0; for (const threadID of groups) { if (await sendMessage(api, message, threadID)) { sent++; } await new Promise(resolve => setTimeout(resolve, 700)); } console.log(`[Namaj] Sent to ${sent}/${groups.length} groups.`); } function startScheduler(api) { if (global.__sajuNamajInterval) return; let activeDate = ""; let timings = null; let busy = false; const sentKeys = new Set(); async function tick() { if (busy) return; busy = true; try { const now = getDhakaTime(); if (activeDate !== now.date || !timings) { timings = await fetchPrayerTimes(); activeDate = now.date; sentKeys.clear(); console.log("[Namaj] Prayer times updated for", activeDate); } for (const [key, prayer] of Object.entries(PRAYERS)) { const prayerTime = String(timings[key] || "").slice(0, 5); const uniqueKey = `${now.date}-${key}`; if (prayerTime !== now.time || sentKeys.has(uniqueKey)) { continue; } // Prevent duplicate messages during the same minute. sentKeys.add(uniqueKey); const message = prayer.message(prayerTime); console.log(`[Namaj] ${prayer.name} reminder triggered.`); await broadcast(api, message); } } catch (error) { console.error("[Namaj] Scheduler error:", error.message || error); } finally { busy = false; } } tick(); global.__sajuNamajInterval = setInterval(tick, CONFIG.interval); console.log("[Namaj] Dhaka prayer reminder scheduler started."); } module.exports = { config: { name: "namaj", version: "3.0.0", author: "Saju", countDown: 5, role: 0, shortDescription: "Lovely prayer reminders", longDescription: "Dhaka prayer-time messages", category: "utility" }, onLoad: async function ({ api }) { startScheduler(api); }, onStart: async function ({ api, event }) { await sendMessage( api, "🕌💗 𝐒𝐀𝐉𝐔 𝐍𝐀𝐌𝐀𝐉 𝐑𝐄𝐌𝐈𝐍𝐃𝐄𝐑 💗🕌\n\n" + "এই command-এর scheduler চালু আছে কি না, startup log দেখুন।", event.threadID ); } };