const axios = require("axios"); /* ========================================================= BABY AI - GOATBOT API: https://noobs-api.top/dipto/baby2 ========================================================= */ module.exports.config = { name: "baby", version: "3.1.0", role: 0, author: "SUJON - BOSS", countDown: 0, category: "AI", shortDescription: "Baby AI auto reply", longDescription: "Baby AI using Dipto API", guide: { en: "{pn} [text]" }, aliases: [ "bby", "xan", "bbz", "jan", "বেবি" ] }; /* ========================================================= API ========================================================= */ const BASE_URL = "https://noobs-api.top"; /* ========================================================= DUPLICATE LOCK ========================================================= */ const processedMessages = new Set(); function isAlreadyProcessed(event) { const id = event?.messageID; if (!id) return false; if (processedMessages.has(id)) { return true; } processedMessages.add(id); setTimeout(() => { processedMessages.delete(id); }, 30000); return false; } /* ========================================================= TYPING ========================================================= */ async function typing(api, threadID, status) { try { if (typeof api.sendTypingIndicator === "function") { await api.sendTypingIndicator(threadID, status); } } catch (e) { console.log("⚠️ Typing error:", e.message); } } /* ========================================================= API REQUEST ========================================================= */ async function getReply(text, senderID) { try { const res = await axios.get( `${BASE_URL}/dipto/baby2`, { params: { text: text, senderID: senderID }, timeout: 15000 } ); console.log("🤖 BABY API:", res.data); return { reply: res.data?.reply || "😶 আমি কিছু বলতে পারছি না…", react: res.data?.react || "" }; } catch (e) { console.log( "❌ BABY API ERROR:", e.response?.data || e.message ); return { reply: "❌ এখন কথা বলতে পারছি না…", react: "" }; } } /* ========================================================= SAVE REPLY ========================================================= */ function saveReply(info, event) { try { if ( global.GoatBot && global.GoatBot.onReply && info?.messageID ) { global.GoatBot.onReply.set( info.messageID, { commandName: module.exports.config.name, messageID: info.messageID, author: event.senderID, type: "baby" } ); console.log( "✅ Baby reply handler saved:", info.messageID ); } } catch (e) { console.log( "⚠️ Save reply error:", e.message ); } } /* ========================================================= SEND BABY REPLY ========================================================= */ async function sendBabyReply(api, event, result) { return new Promise((resolve, reject) => { api.sendMessage( result.reply, event.threadID, async (err, info) => { if (err) { console.log( "❌ Send error:", err ); return reject(err); } /* ================= REACTION ================= */ if ( result.react && event.messageID && typeof api.setMessageReaction === "function" ) { try { await api.setMessageReaction( result.react, event.messageID, () => {}, true ); } catch (e) { console.log( "⚠️ Reaction error:", e.message ); } } /* ================= SAVE REPLY ================= */ saveReply(info, event); resolve(info); }, event.messageID ); }); } /* ========================================================= GREETING ========================================================= */ const greetingReplies = [ "হ্যা জান বলো 🤌💋", "কী চাই তোমার 😒", "তুমি কি আমাকে মিস করো 🥺", "এই যে আমি আছি 💖", "বারবার ডাকছো কেন 😏" ]; /* ========================================================= SEND GREETING ========================================================= */ async function sendGreeting(api, event) { const reply = greetingReplies[ Math.floor( Math.random() * greetingReplies.length ) ]; await typing( api, event.threadID, true ); await new Promise( resolve => setTimeout(resolve, 3000) ); await typing( api, event.threadID, false ); return new Promise((resolve, reject) => { api.sendMessage( reply, event.threadID, (err, info) => { if (err) { console.log( "❌ Greeting error:", err ); return reject(err); } saveReply(info, event); resolve(info); } ); }); } /* ========================================================= TRIGGERS ========================================================= */ const triggers = [ "baby", "bby", "xan", "bbz", "jan", "বেবি" ]; const triggerRegex = /^(baby|bby|xan|bbz|jan|বেবি)(?:\s+|$)/i; /* ========================================================= COMMAND ========================================================= */ module.exports.onStart = async function ({ api, event, args }) { /* * যদি একই message অন্য handler ইতিমধ্যে process করে, * তাহলে আবার reply করবে না। */ if (isAlreadyProcessed(event)) { return; } const q = args .join(" ") .trim(); if (!q) { return api.sendMessage( "💖 আমাকে কিছু বলো জান…", event.threadID, event.messageID ); } await typing( api, event.threadID, true ); await new Promise( resolve => setTimeout(resolve, 2000) ); await typing( api, event.threadID, false ); const result = await getReply( q, event.senderID ); return sendBabyReply( api, event, result ); }; /* ========================================================= REPLY HANDLER ========================================================= */ module.exports.onReply = async function ({ api, event, Reply }) { if (!event.body) return; const text = event.body.trim(); if (!text) return; /* * IMPORTANT: * এখানে duplicate lock ব্যবহার করা হয়নি। * কারণ onChat যেন reply event আটকাতে না পারে। */ console.log( "💬 Baby reply received:", text ); await typing( api, event.threadID, true ); await new Promise( resolve => setTimeout(resolve, 2000) ); await typing( api, event.threadID, false ); const result = await getReply( text, event.senderID ); return sendBabyReply( api, event, result ); }; /* ========================================================= AUTO CHAT ========================================================= */ module.exports.onChat = async function ({ api, event }) { if (!event.body) return; const text = event.body.trim(); if (!text) return; const lowerText = text.toLowerCase(); /* ======================================================= ONLY BABY / BBY / XAN ======================================================= */ if ( triggers.includes(lowerText) ) { /* * শুধু trigger message-এই duplicate lock। * অন্য সাধারণ message-এ lock করা যাবে না। */ if (isAlreadyProcessed(event)) { return; } return sendGreeting( api, event ); } /* ======================================================= BABY + TEXT ======================================================= */ if (!triggerRegex.test(text)) { return; } /* * এই message duplicate কিনা check */ if (isAlreadyProcessed(event)) { return; } const q = text .replace(triggerRegex, "") .trim(); if (!q) { return sendGreeting( api, event ); } await typing( api, event.threadID, true ); await new Promise( resolve => setTimeout(resolve, 3000) ); await typing( api, event.threadID, false ); const result = await getReply( q, event.senderID ); return sendBabyReply( api, event, result ); };