← back to browse
goat command

autotimer

Auto Islamic Timer

0
views
0
likes
0
installs
raw source
const moment = require("moment-timezone");
const axios = require("axios");
const fs = require("fs-extra");
const path = require("path");

const cacheFullPath = path.resolve(__dirname, "cache", "autotimer");

function ensureCacheDir() {
  try {
    if (typeof cacheFullPath === "string") {
      fs.ensureDirSync(cacheFullPath);
    }
  } catch (e) {
    console.log("[AutoTimer] Failed to create cache dir:", e.message);
  }
}

const prayerNames = {
  "04:30 AM": "ফজরের",
  "01:00 PM": "যোহরের",
  "04:30 PM": "আসরের",
  "06:30 PM": "মাগরিবের",
  "08:00 PM": "এশার"
};

const timerData = {
  "12:00 AM": {
    text: `🌌 রাতের নীরবতা মনে করিয়ে দেয়—
আল্লাহর সৃষ্টি কত সুন্দর।

🤲 একটু জিকির করুন, দোয়া করুন
এবং শান্তিতে বিশ্রাম নিন।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/7ch5ym.mp4"
  },

  "01:00 AM": {
    text: `✨ তারাভরা আকাশ আর নীরব রাত—
সৃষ্টিকর্তার অসীম কুদরতের নিদর্শন।

🤲 নিজের জন্য ও প্রিয়জনদের জন্য
দোয়া করতে ভুলবেন না।

😴 এবার একটু বিশ্রাম নিন।`,
    video: "https://files.catbox.moe/rqnlpt.mp4"
  },

  "02:00 AM": {
    text: `🍃 নীরব এই রাতও
আল্লাহর একটি সুন্দর নিয়ামত।

🤲 প্রতিটি নিয়ামতের জন্য
শুকরিয়া আদায় করুন।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/ev7guv.mp4"
  },

  "03:00 AM": {
    text: `🌙 রাতের শেষ প্রহর—
আল্লাহকে স্মরণ করার সুন্দর সময়।

🤲 বেশি বেশি ইস্তিগফার করুন
এবং নিজের জন্য দোয়া করুন।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/rijx8m.mp4"
  },

  "04:30 AM": {
    text: `🤲 আর কিছুক্ষণ পর ফজরের নামাজের সময় হবে।

🕌 অজু করে নামাজের জন্য
প্রস্তুত হয়ে নিন।

✨ দিনের শুরু হোক ইবাদত দিয়ে।`,
    video: "https://files.catbox.moe/ee9khu.mp4"
  },

  "06:00 AM": {
    text: `🌿 নতুন সকাল, নতুন একটি সুযোগ।

✨ আলহামদুলিল্লাহ বলে
আজকের দিনটি শুরু করুন।

🤍 আল্লাহ সবাইকে হেফাজত করুন।`,
    video: "https://files.catbox.moe/otdztt.mp4"
  },

  "07:00 AM": {
    text: `🍀 সকালের নির্মল বাতাস,
সবুজ প্রকৃতি আর সুন্দর পরিবেশ।

🤲 আল্লাহর প্রতিটি নিয়ামতের জন্য
শুকরিয়া আদায় করুন।

💚 হাসিমুখে দিন শুরু করুন।`,
    video: "https://files.catbox.moe/q6b7fo.mp4"
  },

  "08:00 AM": {
    text: `🌱 প্রতিটি নতুন সকাল
একটি নতুন সুযোগ নিয়ে আসে।

✨ ভালো কাজে এগিয়ে চলুন
এবং দিনটি সুন্দরভাবে কাটান।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/jxa3ka.mp4"
  },

  "09:00 AM": {
    text: `🌳 প্রকৃতির সৌন্দর্য দেখুন
এবং আল্লাহর সৃষ্টি নিয়ে চিন্তা করুন।

🤲 প্রতিটি মুহূর্তের জন্য
শুকরিয়া আদায় করুন।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/wtu9vw.mp4"
  },

  "10:00 AM": {
    text: `🌺 ফুল, আকাশ আর সবুজ পৃথিবী—
সবই আল্লাহর সুন্দর সৃষ্টি।

🤍 আজকের প্রতিটি নিয়ামতের জন্য
শুকরিয়া আদায় করুন।`,
    video: "https://files.catbox.moe/guv0tc.mp4"
  },

  "11:00 AM": {
    text: `🍃 ব্যস্ততার মাঝেও একটু থামুন।

🤲 আল্লাহর অগণিত নিয়ামতের জন্য
শুকরিয়া আদায় করুন।

✨ মনকে শান্ত রাখুন।`,
    video: "https://files.catbox.moe/aecxiz.mp4"
  },

  "12:00 PM": {
    text: `🌏 সুন্দর এই পৃথিবী
আল্লাহর এক অসীম নিয়ামত।

🤲 সবার জন্য দোয়া রইল।

💚 ভালো থাকুন, সুস্থ থাকুন।`,
    video: "https://files.catbox.moe/wrc15v.mp4"
  },

  "01:00 PM": {
    text: `🤲 আর কিছুক্ষণ পর যোহরের নামাজের সময় হবে।

🕌 সবাই নামাজের জন্য
প্রস্তুত হয়ে নিন।

✨ কাজের ব্যস্ততার মাঝেও
নামাজকে গুরুত্ব দিন।`,
    video: "https://files.catbox.moe/c5qbek.mp4"
  },

  "02:00 PM": {
    text: `🍃 একটু সময় নিয়ে প্রকৃতির সৌন্দর্য উপভোগ করুন।

🤲 সবসময় আল্লাহর ওপর ভরসা রাখুন।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/vgecfk.mp4"
  },

  "03:00 PM": {
    text: `🍂 বিকেলের মৃদু হাওয়া
মনে করিয়ে দেয়—
আল্লাহর প্রতিটি সৃষ্টি কত সুন্দর।

🤍 প্রতিটি নিয়ামতের জন্য
আলহামদুলিল্লাহ।`,
    video: "https://files.catbox.moe/iddna6.mp4"
  },

  "04:30 PM": {
    text: `🤲 আর কিছুক্ষণ পর আসরের নামাজের সময় হবে।

🕌 সবাই নামাজের জন্য
প্রস্তুতি নিয়ে নিন।

✨ দিনের ব্যস্ততার মাঝেও
নামাজের কথা মনে রাখুন।`,
    video: "https://files.catbox.moe/vcgbxq.mp4"
  },

  "06:30 PM": {
    text: `🤲 আর কিছুক্ষণ পর মাগরিবের নামাজের সময় হবে।

🕌 অজু করে নামাজের জন্য
প্রস্তুত হয়ে নিন।

🌙 দিনের শেষ আলোয়
আল্লাহকে স্মরণ করুন।`,
    video: "https://files.catbox.moe/y8pnz7.mp4"
  },

  "08:00 PM": {
    text: `🤲 আর কিছুক্ষণ পর এশার নামাজের সময় হবে।

🕌 সবাই নামাজের জন্য
প্রস্তুত হয়ে নিন।

✨ দিনের শেষ ইবাদতটি
সুন্দরভাবে আদায় করুন।`,
    video: "https://files.catbox.moe/rpnut9.mp4"
  },

  "09:00 PM": {
    text: `✨ রাতের শান্ত আকাশ
আল্লাহর অসীম কুদরত মনে করিয়ে দেয়।

🤲 আজকের সকল নিয়ামতের জন্য
শুকরিয়া আদায় করুন।

🤍 আলহামদুলিল্লাহ`,
    video: "https://files.catbox.moe/fpac7y.mp4"
  },

  "10:00 PM": {
    text: `🌠 আল্লাহর হেফাজতের ওপর
ভরসা রেখে শান্তিতে বিশ্রাম নিন।

🤲 আগামী দিনের জন্য
দোয়া করুন।

🤍 শুভ রাত্রি।`,
    video: "https://files.catbox.moe/e7v8en.mp4"
  },

  "11:00 PM": {
    text: `🌙 নীরব রাত, শীতল বাতাস
আর আল্লাহর রহমত।

🤲 আগামী দিনটি হোক
কল্যাণময় ও বরকতময়।

✨ শান্তিতে বিশ্রাম নিন।`,
    video: "https://files.catbox.moe/7bas7j.mp4"
  }
};

let sentMap = new Map();
let interval = null;

module.exports = {
  config: {
    name: "autotimer",
    version: "1.0.0",
    author: "𝐌𝐚𝐑𝐮𝐅",
    countDown: 5,
    role: 2,
    shortDescription: {
      en: "Auto Islamic Timer"
    },
    longDescription: {
      en: "Sends automatic time-based Islamic messages with video"
    },
    category: "system",
    guide: {
      en: "{pn} on / off / status / next / reload / list"
    }
  },

  onStart: async function ({ message, args, event, threadsData }) {
    const threadID = event.threadID;
    const sub = (args[0] || "").toLowerCase();

    switch (sub) {
      case "on": {
        await threadsData.set(threadID, true, "data.autoTimer");
        return message.reply("✅ এই গ্রুপে AutoTimer ON করা হয়েছে।");
      }

      case "off": {
        await threadsData.set(threadID, false, "data.autoTimer");
        return message.reply("❌ এই গ্রুপে AutoTimer OFF করা হয়েছে।");
      }

      case "status": {
        let threadData;

        try {
          threadData = await threadsData.get(threadID);
        } catch (e) {
          threadData = null;
        }

        const isOn = threadData?.data?.autoTimer !== false;

        return message.reply(
          `📊 AutoTimer Status: ${isOn ? "ON ✅" : "OFF ❌"}`
        );
      }

      case "next": {
        const now = moment().tz("Asia/Dhaka");

        const upcoming = Object.keys(timerData)
          .map((label) => {
            const slot = moment.tz(
              label,
              "hh:mm A",
              "Asia/Dhaka"
            );

            let target = now.clone().set({
              hour: slot.hour(),
              minute: slot.minute(),
              second: 0,
              millisecond: 0
            });

            if (target.isSameOrBefore(now)) {
              target.add(1, "day");
            }

            return { label, target };
          })
          .sort(
            (a, b) =>
              a.target.valueOf() - b.target.valueOf()
          )[0];

        const diffMin = upcoming.target.diff(
          now,
          "minutes"
        );

        const hours = Math.floor(diffMin / 60);
        const mins = diffMin % 60;

        const remaining =
          hours > 0
            ? `${hours} ঘণ্টা ${mins} মিনিট`
            : `${mins} মিনিট`;

        return message.reply(
          `⏳ পরবর্তী টাইমার ➜ ${upcoming.label}\n🕒 বাকি সময় ➜ প্রায় ${remaining}`
        );
      }

      case "reload": {
        const now = moment()
          .tz("Asia/Dhaka")
          .format("hh:mm A");

        const videoFileName =
          now.replace(/[: ]/g, "_") + ".mp4";

        const videoFullPath =
          path.resolve(
            cacheFullPath,
            videoFileName
          );

        try {
          if (fs.existsSync(videoFullPath)) {
            fs.removeSync(videoFullPath);

            return message.reply(
              `♻️ ক্যাশ রিলোড করা হয়েছে (${now})। পরের বার নতুন ভিডিও ডাউনলোড হবে।`
            );
          }

          return message.reply(
            `ℹ️ এই স্লটের (${now}) জন্য কোনো ক্যাশ করা ভিডিও পাওয়া যায়নি।`
          );
        } catch (e) {
          return message.reply(
            "⚠️ রিলোড করতে সমস্যা হয়েছে: " +
            e.message
          );
        }
      }

      case "list": {
        const slots =
          Object.keys(timerData).join(", ");

        return message.reply(
          `🗒️ সকল টাইমার স্লট:\n${slots}`
        );
      }

      default: {
        return message.reply(
          "📌 ব্যবহার করুন:\n" +
          "• autotimer on — এই গ্রুপে চালু করুন\n" +
          "• autotimer off — এই গ্রুপে বন্ধ করুন\n" +
          "• autotimer status — বর্তমান অবস্থা দেখুন\n" +
          "• autotimer next — পরবর্তী টাইমার কখন দেখুন\n" +
          "• autotimer reload — বর্তমান স্লটের ক্যাশ রিসেট করুন\n" +
          "• autotimer list — সব টাইমার স্লট দেখুন"
        );
      }
    }
  },

  onLoad: function ({ api, threadsData }) {
    if (interval) return;

    ensureCacheDir();

    console.log(
      "[AutoTimer] Started successfully!"
    );

    interval = setInterval(async () => {
      try {
        ensureCacheDir();

        const now = moment()
          .tz("Asia/Dhaka")
          .format("hh:mm A");

        const today = moment()
          .tz("Asia/Dhaka")
          .format("DD-MM-YYYY");

        const data = timerData[now];

        if (!data) return;

        const key = `${today}_${now}`;

        if (sentMap.has(key)) return;

        sentMap.set(key, true);

        if (sentMap.size > 40) {
          sentMap.clear();
        }

        if (
          typeof now !== "string" ||
          typeof cacheFullPath !== "string"
        ) {
          console.log(
            "[AutoTimer] Invalid timer path data."
          );
          return;
        }

        const videoFileName =
          now.replace(/[: ]/g, "_") + ".mp4";

        const videoFullPath =
          path.resolve(
            cacheFullPath,
            videoFileName
          );

        if (!fs.existsSync(videoFullPath)) {
          try {
            const res = await axios.get(
              data.video,
              {
                responseType: "arraybuffer",
                timeout: 60000
              }
            );

            fs.writeFileSync(
              videoFullPath,
              Buffer.from(res.data)
            );
          } catch (e) {
            console.log(
              "[AutoTimer] Video download error:",
              e.message
            );
            return;
          }
        }

        if (!fs.existsSync(videoFullPath)) {
          console.log(
            "[AutoTimer] Video file not found."
          );
          return;
        }

        const prayerName =
          prayerNames[now];

        const title = prayerName
          ? `🕌 ${prayerName} নামাজের সময় হয়েছে`
          : `✨ আজকের সুন্দর সময়`;

        const footer = prayerName
          ? "🤲 সবাই নামাজ আদায় করুন"
          : "🤲 আল্লাহকে স্মরণ করুন";

        const body =
`━━━━━━━━━━━━━━━━━━
${title}
🕒 সময়: ${now}
📅 তারিখ: ${today}
━━━━━━━━━━━━━━━━━━

${data.text}

◢◤━━━━━━━━━━━━━━━━◥◣
🤖 𝐌𝐚𝐑𝐮𝐅'𝐬 𝐁𝐨𝐓 💫🪽
${footer}
◥◣━━━━━━━━━━━━━━━━◢◤`;

        let threads = [];

        try {
          threads = await api.getThreadList(
            200,
            null,
            ["INBOX"]
          );
        } catch (e) {
          return;
        }

        const groups = threads.filter(
          t => t.isGroup
        );

        for (const thread of groups) {
          try {
            let enabled = true;

            try {
              const td =
                await threadsData.get(
                  thread.threadID
                );

              enabled =
                td?.data?.autoTimer !== false;
            } catch (e) {
              enabled = true;
            }

            if (!enabled) continue;

            await api.sendMessage(
              {
                body,
                attachment:
                  fs.createReadStream(
                    videoFullPath
                  )
              },
              thread.threadID
            );

            await new Promise(
              resolve =>
                setTimeout(resolve, 1000)
            );
          } catch (err) {
          }
        }

        console.log(
          `[AutoTimer] Sent → ${now}`
        );
      } catch (err) {
        console.log(
          "[AutoTimer] Main error:",
          err.message
        );
      }
    }, 30000);
  }
};

View raw file