// code from goatstore // api: https://store.agi.bd module.exports = { config: { name: "tag", version: "1.0.2", author: "MJ HAMIM", countDown: 3, role: 0, shortDescription: { en: "Tag members by name, reply, count or everyone" }, longDescription: { en: "Tag members with delay, repeat count (up to 100 limit) and everyone mode" }, category: "box chat", guide: { en: "{p}tag [name] [msg]\n{p}tag all [msg]\nReply + {p}tag [count] [msg]\n{p}tag @mention [count] [msg]" } }, onStart: async ({ api, event, usersData, threadsData, args }) => { const { threadID, messageID, messageReply, mentions: eventMentions } = event; try { const threadData = await threadsData.get(threadID); const members = threadData.members .filter(member => member.inGroup) .map(member => ({ name: member.name, id: member.userID })); let tagUsers = []; let text = ""; let repeatCount = 1; let isSequentialTag = false; const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); const MAX_LIMIT = 100; // 1. Tag by Mention with Count if (Object.keys(eventMentions).length > 0) { const mentionIDs = Object.keys(eventMentions); const targetID = mentionIDs[0]; const targetName = eventMentions[targetID].replace(/^@/, ""); tagUsers.push({ name: targetName, id: targetID }); // Remove mention string from args const cleanArgs = args.filter(arg => !arg.includes(targetName) && !arg.startsWith("@")); if (cleanArgs[0] && !isNaN(cleanArgs[0])) { repeatCount = parseInt(cleanArgs[0]); text = cleanArgs.slice(1).join(" "); } else { text = cleanArgs.join(" "); } } // 2. Reply to User with Count else if (messageReply) { const uid = messageReply.senderID; const name = await usersData.getName(uid); tagUsers.push({ name, id: uid }); if (args[0] && !isNaN(args[0])) { repeatCount = parseInt(args[0]); text = args.slice(1).join(" "); } else { text = args.join(" "); } } // 3. Tag All / Everyone else if ( args[0] && ["all", "everyone", "cdi"].includes(args[0].toLowerCase()) ) { tagUsers = members; text = args.slice(1).join(" "); isSequentialTag = true; } // 4. Tag by Name Search else { if (!args[0]) { return api.sendMessage( "⚠️ | Reply, @mention, name athaba 'all' use korun.", threadID, messageID ); } const searchName = args[0].toLowerCase(); text = args.slice(1).join(" "); tagUsers = members.filter(member => member.name.toLowerCase().includes(searchName) ); if (tagUsers.length === 0) { return api.sendMessage( "❌ | User Not Found.", threadID, messageID ); } if (tagUsers.length > 1) { isSequentialTag = true; } } // Cap count to MAX_LIMIT (100) if (repeatCount > MAX_LIMIT) { repeatCount = MAX_LIMIT; } // Repeat mode for single user mention/reply with count if (!isSequentialTag && tagUsers.length === 1 && repeatCount > 1) { const user = tagUsers[0]; const mentions = [{ tag: user.name, id: user.id }]; for (let i = 0; i < repeatCount; i++) { const body = text ? `╭─ Tag Notice (${i + 1}/${repeatCount})\n• ${user.name}\n├──────────\n💬 ${text}\n╰──────────` : `╭─ Tag Notice (${i + 1}/${repeatCount})\n• ${user.name}\n╰──────────`; await api.sendMessage({ body, mentions }, threadID); if (i < repeatCount - 1) { await delay(2000); } } return; } // Sequential tag for tag all / multi-user results if (isSequentialTag && tagUsers.length > 1) { if (tagUsers.length > MAX_LIMIT) { tagUsers = tagUsers.slice(0, MAX_LIMIT); } for (let i = 0; i < tagUsers.length; i++) { const user = tagUsers[i]; const mentions = [{ tag: user.name, id: user.id }]; const body = text ? `╭─ Tag Notice (${i + 1}/${tagUsers.length})\n• ${user.name}\n├──────────\n💬 ${text}\n╰──────────` : `╭─ Tag Notice (${i + 1}/${tagUsers.length})\n• ${user.name}\n╰──────────`; await api.sendMessage({ body, mentions }, threadID); if (i < tagUsers.length - 1) { await delay(2000); } } } else { // Single normal tag (no loop) const mentions = tagUsers.map(user => ({ tag: user.name, id: user.id })); const namesText = tagUsers .map(user => `• ${user.name}`) .join("\n"); const body = text ? `╭─ Tag Notice\n${namesText}\n├──────────\n💬 ${text}\n╰──────────` : `╭─ Tag Notice\n${namesText}\n╰──────────`; return api.sendMessage( { body, mentions }, threadID, messageReply ? messageReply.messageID : messageID ); } } catch (error) { return api.sendMessage( `❌ | Error: ${error.message}`, threadID, messageID ); } } };