← back to browse
goat command

ntc

Send stylish notice to groups by replying with serial numbers

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

module.exports = {
  config: {
    name: "ntc",
    version: "5.1.1",
    author: "RS.RIFAT",
    countDown: 5,
    role: 1, // Admin priority
    description: "Send stylish notice to groups by replying with serial numbers",
    category: "admin",
    guide: {
      en: "[all <msg> | list | reply with <serial(s)> <msg>]"
    }
  },

  onStart: async function ({ api, event, args, message, threadsData }) {
    const OWNER_UID = ["61557500431580"];
    const DATA_FILE = path.join(__dirname, "ntcGroups.json");

    if (!OWNER_UID.includes(event.senderID)) {
      return message.reply("❌ You are not authorized to use ntc!");
    }

    // Load or initialize state
    if (!global.ntcState) global.ntcState = { listMsgID: null, groupsData: {} };

    // Function to get active group threads
    const getGroupThreads = async () => {
      let groups = [];
      if (threadsData && typeof threadsData.getAll === "function") {
        try {
          const allThreads = await threadsData.getAll();
          groups = allThreads.filter(t => t && t.isGroup);
        } catch (e) {
          console.error(e);
        }
      }
      if (!groups.length && global.db && Array.isArray(global.db.allThreadData)) {
        groups = global.db.allThreadData.filter(t => t && t.isGroup);
      }
      if (!groups.length && api && typeof api.getThreadList === "function") {
        try {
          const threadList = await api.getThreadList(100, null, ["INBOX"]);
          groups = threadList.filter(t => t && t.isGroup);
        } catch (e) {
          console.error(e);
        }
      }
      return groups;
    };

    // Function to save groups
    const saveGroups = (groups) => {
      const data = {};
      groups.forEach((g, index) => {
        const i = index + 1;
        const memberCount = g.participantIDs?.length || g.members?.length || 0;
        data[i] = {
          serial: `#${i}`,
          name: `📌 ${g.threadName || g.name || "Unknown"}`,
          threadID: g.threadID,
          members: `👥 ${memberCount}`
        };
      });
      try {
        fs.writeJsonSync(DATA_FILE, data, { spaces: 2 });
      } catch (e) {
        console.error(e);
      }
      return data;
    };

    const makeStylishNotice = (bodyMsg) => {
      return `ㅤ️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️𝙽𝙾𝚃𝙸𝙵𝙸𝙲𝙰𝚃𝙸𝙾𝙽 𝙵𝚁𝙾𝙼 __-么 RS- __-RIFAT-_\n☆━━━━━━━━━━━━━━━━━━☆\n${bodyMsg}`;
    };

    try {
      // LIST COMMAND
      if (args[0] === "list") {
        const activeGroups = await getGroupThreads();
        global.ntcState.groupsData = saveGroups(activeGroups);

        let text = "📋 𝗚𝗿𝗼𝘂𝗽 𝗟𝗶𝘀𝘁 📋\n────────────────────\n";
        for (let i in global.ntcState.groupsData) {
          const g = global.ntcState.groupsData[i];
          text += `${i} ${g.name}\n🆔 UID: ${g.threadID}\n${g.members}\n\n`;
        }

        return message.reply(text, (err, info) => {
          if (err || !info) return;
          global.ntcState.listMsgID = info.messageID;
          if (global.GoatBot && global.GoatBot.onReply) {
            global.GoatBot.onReply.set(info.messageID, {
              commandName: this.config.name,
              messageID: info.messageID,
              author: event.senderID
            });
          }
        });
      }

      // SEND TO ALL
      else if (args[0] === "all") {
        const msg = args.slice(1).join(" ");
        if (!msg) return message.reply("⚠️ Usage: ntc all <Message>");

        if (!Object.keys(global.ntcState.groupsData).length) {
          const activeGroups = await getGroupThreads();
          global.ntcState.groupsData = saveGroups(activeGroups);
        }

        const notice = makeStylishNotice(msg);
        let count = 0;
        for (let i in global.ntcState.groupsData) {
          try {
            await api.sendMessage(notice, global.ntcState.groupsData[i].threadID);
            count++;
          } catch (e) {
            console.error(`Failed to send ntc to group ${global.ntcState.groupsData[i].threadID}`, e);
          }
        }
        return message.reply(`✅ Notice sent to ${count} groups.`);
      }

      else {
        return message.reply("⚡ Usage: ntc [all <msg> | list | reply with <serial(s)> <msg>]");
      }
    } catch (e) {
      console.error(e);
      return message.reply("❌ Error executing command!");
    }
  },

  onReply: async function ({ api, event, Reply, message }) {
    const OWNER_UID = ["61557500431580"];
    if (!OWNER_UID.includes(event.senderID)) return;

    const { groupsData } = global.ntcState || {};
    if (!groupsData) return;

    const parts = event.body.trim().split(" ");
    const serials = parts.filter(x => /^\d+$/.test(x));
    const msg = parts.filter(x => !/^\d+$/.test(x)).join(" ");

    if (!serials.length || !msg) {
      return message.reply("⚠️ Reply format: <serial(s)> <message>");
    }

    const makeStylishNotice = (bodyMsg) => {
      return `ㅤ️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️𝙽𝙾𝚃𝙸𝙵𝙸𝙲𝙰𝚃𝙸𝙾𝙽 𝙵𝚁𝙾𝙼 __-么 RS- __-RIFAT-_\n☆━━━━━━━━━━━━━━━━━━☆\n${bodyMsg}`;
    };

    const failed = [];
    for (let s of serials) {
      const target = groupsData[s];
      if (!target) { failed.push(s); continue; }
      try {
        await api.sendMessage(makeStylishNotice(msg), target.threadID);
      } catch (e) {
        failed.push(s);
      }
    }

    if (Reply && Reply.messageID) {
      try {
        api.unsendMessage(Reply.messageID);
      } catch (e) {}
    }

    let response = "✅ Notice sent successfully!";
    if (failed.length) response += `\n⚠️ Failed serials: ${failed.join(", ")}`;
    return message.reply(response);
  }
};

View raw file