← back to browse
goat command

approve

Approve pending members

0
views
0
likes
0
installs

Aliases: aprv

raw source
module.exports = {
  config: {
    name: "approve",
    aliases: ["aprv"],
    version: "3.0",
    author: "xalman",
    countDown: 5,
    role: 1,
    shortDescription: { en: "Approve pending members" },
    category: "box chat",
    guide: { en: "{pn} | {pn} 1 | {pn} all" }
  },

  onStart: async ({ api, event, args, commandName }) => {
    const { threadID, messageID, senderID, isGroup } = event;
    if (!isGroup) return api.sendMessage("❌ Group only.", threadID, messageID);

    let info;
    try {
      info = await api.getThreadInfo(threadID);
    } catch {
      return api.sendMessage("❌ Failed to get pending list.", threadID, messageID);
    }

    const queue = info?.approvalQueue || [];
    if (!queue.length) return api.sendMessage("✅ No pending members.", threadID, messageID);

    const approve = async targets => {
      const msg = await api.sendMessage(`⏳ Approving ${targets.length} member(s)...`, threadID);
      let ok = 0, fail = 0;

      for (const user of targets) {
        try {
          await api.addUserToGroup(user.requesterID, threadID);
          ok++;
        } catch {
          fail++;
        }
      }

      const result = `Done ${ok} member(s) ✅\nFailed ${fail} member(s) ❎`;

      try {
        await api.editMessage(result, msg.messageID);
      } catch {
        await api.sendMessage(result, threadID);
        try { await api.unsendMessage(msg.messageID); } catch {}
      }
    };

    if (args.length) {
      if (/^all$/i.test(args[0])) return approve(queue);

      const targets = [];
      for (const n of args) {
        if (!/^\d+$/.test(n) || n < 1 || n > queue.length)
          return api.sendMessage(`❌ Invalid number: ${n}`, threadID, messageID);
        targets.push(queue[n - 1]);
      }
      return approve(targets);
    }

    let names = {};
    try {
      names = await api.getUserInfo(queue.map(x => x.requesterID));
    } catch {}

    const list = queue.map((x, i) =>
      `${i + 1}. ${names?.[x.requesterID]?.name || "Unknown"} (${x.requesterID})`
    ).join("\n");

    return api.sendMessage(
      `🔔 PENDING MEMBERS (${queue.length})\n\n${list}\n\nReply with number(s) to approve.`,
      threadID,
      (err, m) => {
        if (!err) global.GoatBot.onReply.set(m.messageID, {
          commandName,
          author: senderID,
          queue
        });
      },
      messageID
    );
  },

  onReply: async ({ api, event, Reply }) => {
    if (event.senderID !== Reply.author) return;

    const input = event.body.trim();
    let targets;

    if (/^all$/i.test(input)) {
      targets = Reply.queue;
    } else {
      targets = [];
      for (const n of input.split(/\s+/)) {
        if (!/^\d+$/.test(n) || n < 1 || n > Reply.queue.length)
          return api.sendMessage(`❌ Invalid number: ${n}`, event.threadID, event.messageID);
        targets.push(Reply.queue[n - 1]);
      }
    }

    try { await api.unsendMessage(event.messageID); } catch {}
    global.GoatBot.onReply.delete(event.messageID);

    const msg = await api.sendMessage(
      `⏳ Approving ${targets.length} member(s)...`,
      event.threadID
    );

    let ok = 0, fail = 0;

    for (const user of targets) {
      try {
        await api.addUserToGroup(user.requesterID, event.threadID);
        ok++;
      } catch {
        fail++;
      }
    }

    const result = `Done ${ok} member(s) ✅\nFailed ${fail} member(s) ❎`;

    try {
      await api.editMessage(result, msg.messageID);
    } catch {
      await api.sendMessage(result, event.threadID);
      try { await api.unsendMessage(msg.messageID); } catch {}
    }
  }
};

View raw file