// code from goatstore // api: https://store.agi.bd const fs = require("fs"); const path = require("path"); const DB_DIR = path.join(__dirname, "../database"); const DB_FILE = path.join(DB_DIR, "antipro.json"); function loadDB() { try { if (!fs.existsSync(DB_DIR)) { fs.mkdirSync(DB_DIR, { recursive: true }); } if (!fs.existsSync(DB_FILE)) { fs.writeFileSync(DB_FILE, "{}"); } const raw = fs.readFileSync(DB_FILE, "utf8"); if (!raw.trim()) return {}; const data = JSON.parse(raw); return data && typeof data === "object" ? data : {}; } catch { return {}; } } function saveDB(data) { try { if (!fs.existsSync(DB_DIR)) { fs.mkdirSync(DB_DIR, { recursive: true }); } fs.writeFileSync( DB_FILE, JSON.stringify(data, null, 2) ); return true; } catch { return false; } } function createGroup() { return { name: false, image: false, nickname: false, emoji: false, theme: false, admin: false, join: false, leave: false, link: false, spam: false, word: false, unsend: false, savedName: "", savedImage: "", savedNicknames: {}, savedAdmins: [], badWords: [], spamCount: {} }; } function getGroup(data, tid) { if (!data[tid] || typeof data[tid] !== "object") { data[tid] = createGroup(); } const g = data[tid]; const switches = [ "name", "image", "nickname", "emoji", "theme", "admin", "join", "leave", "link", "spam", "word", "unsend" ]; for (const key of switches) { if (typeof g[key] !== "boolean") { g[key] = false; } } if (typeof g.savedName !== "string") { g.savedName = ""; } if (typeof g.savedImage !== "string") { g.savedImage = ""; } if ( !g.savedNicknames || typeof g.savedNicknames !== "object" ) { g.savedNicknames = {}; } if (!Array.isArray(g.savedAdmins)) { g.savedAdmins = []; } if (!Array.isArray(g.badWords)) { g.badWords = []; } if (!g.spamCount || typeof g.spamCount !== "object") { g.spamCount = {}; } return g; } function onOff(value) { return value ? "🟢 ON" : "šŸ”“ OFF"; } function saved(value) { return value ? "Saved āœ…" : "Not available"; } function isLink(text) { if (!text) return false; return /(https?:\/\/|www\.|facebook\.com|fb\.com|youtu\.be|youtube\.com|t\.me|telegram\.me)/i.test( text ); } module.exports = { config: { name: "antipro", version: "1.0.0", author: "Zihad", countDown: 3, role: 1, shortDescription: "Goat Anti Pro", longDescription: "Advanced group protection system for GoatBot-Pro.", category: "group", guide: { en: "{pn}\n" + "{pn} 1-12\n" + "{pn} all on\n" + "{pn} all off\n" + "{pn} data add\n" + "{pn} word add \n" + "{pn} word del " } }, onStart: async function ({ api, event, args, message }) { const tid = event.threadID; if (!tid) return; const data = loadDB(); const group = getGroup(data, tid); /* * ========================== * SAVE GROUP DATA * ========================== */ if ( args[0] === "data" && args[1] === "add" ) { try { const info = await api.getThreadInfo(tid); if (!info) { return message.reply( "āŒ Could not get group information." ); } group.savedName = typeof info.threadName === "string" ? info.threadName : ""; group.savedImage = typeof info.imageSrc === "string" ? info.imageSrc : ""; if ( info.nicknames && typeof info.nicknames === "object" ) { group.savedNicknames = info.nicknames; } else { group.savedNicknames = {}; } if (Array.isArray(info.adminIDs)) { group.savedAdmins = info.adminIDs; } else { group.savedAdmins = []; } saveDB(data); return message.reply( "╭───── š—šš—¢š—”š—§ š—”š—”š—§š—œ š—£š—„š—¢ ─────╮\n\n" + "āœ… Group data saved!\n\n" + "šŸ“› Name : " + saved(!!group.savedName) + "\n" + "šŸ–¼ļø Picture : " + saved(!!group.savedImage) + "\n" + "šŸ‘¤ Nickname : " + saved( Object.keys(group.savedNicknames).length > 0 ) + "\n" + "šŸ‘‘ Admin list : " + saved(group.savedAdmins.length > 0) + "\n\n" + "šŸ˜€ Emoji : Protection mode\n" + "šŸŽØ Theme : Protection mode\n" + "🚫 Join : Protection mode\n" + "🚪 Leave : Detection mode\n\n" + "Use:\n" + "antipro 1-12\n\n" + "╰──────────────────────────╯" ); } catch (e) { return message.reply( "āŒ Failed to save data.\n\n" + String(e.message || e) ); } } /* * ========================== * ADD BAD WORD * ========================== */ if ( args[0] === "word" && args[1] === "add" ) { const word = args.slice(2).join(" ").trim(); if (!word) { return message.reply( "āŒ Example:\nantipro word add badword" ); } if (!group.badWords.includes(word.toLowerCase())) { group.badWords.push(word.toLowerCase()); } saveDB(data); return message.reply( "āœ… Anti Word added:\n" + word ); } /* * ========================== * DELETE BAD WORD * ========================== */ if ( args[0] === "word" && args[1] === "del" ) { const word = args.slice(2).join(" ").trim(); if (!word) { return message.reply( "āŒ Example:\nantipro word del badword" ); } group.badWords = group.badWords.filter( x => x !== word.toLowerCase() ); saveDB(data); return message.reply( "āœ… Anti Word removed:\n" + word ); } /* * ========================== * ALL ON * ========================== */ if ( args[0] === "all" && args[1] === "on" ) { const modes = [ "name", "image", "nickname", "emoji", "theme", "admin", "join", "leave", "link", "spam", "word", "unsend" ]; for (const mode of modes) { group[mode] = true; } saveDB(data); return message.reply( "šŸ›”ļø š—šš—¢š—”š—§ š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "āœ… All Anti modes are ON." ); } /* * ========================== * ALL OFF * ========================== */ if ( args[0] === "all" && args[1] === "off" ) { const modes = [ "name", "image", "nickname", "emoji", "theme", "admin", "join", "leave", "link", "spam", "word", "unsend" ]; for (const mode of modes) { group[mode] = false; } saveDB(data); return message.reply( "šŸ›”ļø š—šš—¢š—”š—§ š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "šŸ”“ All Anti modes are OFF." ); } /* * ========================== * MENU * ========================== */ if (!args[0]) { return message.reply( "╭───── š—šš—¢š—”š—§ š—”š—”š—§š—œ š—£š—„š—¢ ─────╮\n\n" + "1. šŸ“› Name " + onOff(group.name) + "\n" + "2. šŸ–¼ļø Image " + onOff(group.image) + "\n" + "3. šŸ‘¤ Nickname " + onOff(group.nickname) + "\n" + "4. šŸ˜€ Emoji " + onOff(group.emoji) + "\n" + "5. šŸŽØ Theme " + onOff(group.theme) + "\n" + "6. šŸ‘‘ Admin/QTV " + onOff(group.admin) + "\n" + "7. 🚫 Anti Join " + onOff(group.join) + "\n" + "8. 🚪 Anti Leave " + onOff(group.leave) + "\n" + "9. šŸ”— Anti Link " + onOff(group.link) + "\n" + "10. šŸ›‘ Anti Spam " + onOff(group.spam) + "\n" + "11. 🤬 Anti Word " + onOff(group.word) + "\n" + "12. šŸ—‘ļø Anti Unsend " + onOff(group.unsend) + "\n\n" + "━━━━━━━━━━━━━━━━━━\n" + "antipro all on\n" + "antipro all off\n" + "antipro data add\n" + "antipro 13 → Status\n\n" + "╰────────────────────────╯" ); } /* * ========================== * STATUS * ========================== */ if (parseInt(args[0]) === 13) { return message.reply( "╭── š—”š—”š—§š—œ š—£š—„š—¢ š—¦š—§š—”š—§š—Øš—¦ ──╮\n\n" + "šŸ“› Name : " + onOff(group.name) + "\n" + "šŸ–¼ļø Image : " + onOff(group.image) + "\n" + "šŸ‘¤ Nickname : " + onOff(group.nickname) + "\n" + "šŸ˜€ Emoji : " + onOff(group.emoji) + "\n" + "šŸŽØ Theme : " + onOff(group.theme) + "\n" + "šŸ‘‘ Admin/QTV : " + onOff(group.admin) + "\n" + "🚫 Join : " + onOff(group.join) + "\n" + "🚪 Leave : " + onOff(group.leave) + "\n" + "šŸ”— Link : " + onOff(group.link) + "\n" + "šŸ›‘ Spam : " + onOff(group.spam) + "\n" + "🤬 Word : " + onOff(group.word) + "\n" + "šŸ—‘ļø Unsend : " + onOff(group.unsend) + "\n\n" + "🚫 Bad Words: " + group.badWords.length + "\n\n╰────────────────────────╯" ); } /* * ========================== * TOGGLE * ========================== */ const n = parseInt(args[0]); if (n >= 1 && n <= 12) { const modes = [ "name", "image", "nickname", "emoji", "theme", "admin", "join", "leave", "link", "spam", "word", "unsend" ]; const mode = modes[n - 1]; group[mode] = !group[mode]; saveDB(data); return message.reply( "šŸ›”ļø š—šš—¢š—”š—§ š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "Mode: " + mode + "\n" + "Status: " + onOff(group[mode]) ); } return message.reply( "āŒ Invalid option.\n\n" + "Use: antipro" ); }, /* * ========================== * EVENTS * ========================== */ onEvent: async function ({ api, event, message }) { const tid = event.threadID; if (!tid) return; const data = loadDB(); if (!data[tid]) return; const group = getGroup(data, tid); /* * NAME LOCK */ if ( event.logMessageType === "log:thread-name" ) { if (!group.name) return; if (!group.savedName) return; try { await api.setTitle( group.savedName, tid ); return message.reply( "šŸ›”ļø š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "āš ļø Group name changed!\n" + "ā†©ļø Previous name restored." ); } catch { return; } } /* * IMAGE */ if ( event.logMessageType === "log:thread-image" ) { if (!group.image) return; return message.reply( "šŸ›”ļø š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "āš ļø Group image changed!\n" + "šŸ”’ Anti Image is ON." ); } /* * ADMIN / QTV */ if ( event.logMessageType === "log:thread-admins" ) { if (!group.admin) return; return message.reply( "šŸ›”ļø š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "āš ļø Admin list changed!\n" + "šŸ‘‘ QTV protection is ON." ); } /* * JOIN */ if ( event.logMessageType === "log:subscribe" ) { if (!group.join) return; return message.reply( "šŸ›”ļø š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "āš ļø New member detected!\n" + "🚫 Anti Join is ON." ); } /* * LEAVE */ if ( event.logMessageType === "log:unsubscribe" ) { if (!group.leave) return; return message.reply( "šŸ›”ļø š—”š—”š—§š—œ š—£š—„š—¢\n\n" + "āš ļø Member leave detected!\n" + "🚪 Anti Leave is ON." ); } }, /* * ========================== * MESSAGE PROTECTION * ========================== */ onChat: async function ({ api, event, message }) { const tid = event.threadID; if (!tid) return; const data = loadDB(); if (!data[tid]) return; const group = getGroup(data, tid); const text = typeof event.body === "string" ? event.body : ""; if (!text) return; /* * ANTI LINK */ if ( group.link && isLink(text) ) { try { if (event.messageID) { await api.unsendMessage( event.messageID ); } } catch {} return message.reply( "šŸ”—šŸš« Anti Link\n\n" + "Link detected and removed." ); } /* * ANTI WORD */ if ( group.word && group.badWords.length ) { const lower = text.toLowerCase(); const found = group.badWords.some( word => word && lower.includes(word) ); if (found) { try { if (event.messageID) { await api.unsendMessage( event.messageID ); } } catch {} return message.reply( "🤬🚫 Anti Word\n\n" + "Forbidden word detected." ); } } /* * ANTI SPAM */ if (group.spam) { const uid = event.senderID || "unknown"; const now = Date.now(); if (!group.spamCount[uid]) { group.spamCount[uid] = []; } group.spamCount[uid] = group.spamCount[uid].filter( t => now - t < 8000 ); group.spamCount[uid].push(now); if ( group.spamCount[uid].length >= 6 ) { group.spamCount[uid] = []; saveDB(data); return message.reply( "šŸ›‘šŸš« Anti Spam\n\n" + "Spam activity detected." ); } saveDB(data); } } };