// code from goatstore // api: https://store.agi.bd const fs = require("fs-extra"); const axios = require("axios"); const canvas = require("canvas"); const path = require("path"); module.exports = { config: { name: "fokir", version: "1.1.0", author: "Mehedi", countDown: 0, role: 0, shortDescription: "Fokir template meme", longDescription: "Create a funny beggar meme using profile pictures", category: "image", guide: "{pn} [@mention / reply]" }, onStart: async function ({ api, event, message, usersData }) { const COOLDOWN_MS = 60 * 1000; const BOSS_NOTICE = "乛 মেহেদী বসকে RIP করা জাবে না রে পাগলা"; const CAPTION = "নে 🐸 ফকির ভিক্ষা নে🤣🫵"; const TEMPLATE_URL = "https://i.imgur.com/dpBuLK3.jpeg"; const REF = { w: 1254, h: 1254 }; const SENDER_POS = { cx: 368, cy: 140, r: 78 }; const TARGET_POS = { cx: 1115, cy: 578, r: 78 }; // নিজের বট অ্যাডমিনের সঠিক Facebook UID বসাও। const ADMIN_IDS = ["YOUR_ADMIN_UID"]; const senderID = String(event.senderID); const threadID = event.threadID; const messageID = event.messageID; // Mention > Reply > নিজের প্রোফাইল const targetUserId = String( Object.keys(event.mentions || {})[0] || (event.messageReply && event.messageReply.senderID) || senderID ); // অ্যাডমিনকে টার্গেট করা যাবে না if (ADMIN_IDS.includes(targetUserId)) { return message.reply(BOSS_NOTICE); } // প্রতি ইউজারের জন্য আলাদা কুলডাউন if (!global.fokirCooldown) { global.fokirCooldown = new Map(); } const cooldown = global.fokirCooldown; const isAdmin = ADMIN_IDS.includes(senderID); if (!isAdmin) { const last = cooldown.get(senderID) || 0; const remaining = COOLDOWN_MS - (Date.now() - last); if (remaining > 0) { return message.reply( `⏳ ${Math.ceil(remaining / 1000)} সেকেন্ড পরে আবার চেষ্টা কর।` ); } cooldown.set(senderID, Date.now()); } const cacheDir = path.join(__dirname, "cache"); const outputPath = path.join( cacheDir, `fokir_${Date.now()}_${senderID}.jpg` ); try { await fs.ensureDir(cacheDir); // টেমপ্লেট লোড const templateRes = await axios.get(TEMPLATE_URL, { responseType: "arraybuffer", timeout: 20000, headers: { "User-Agent": "Mozilla/5.0" } }); const template = await canvas.loadImage( Buffer.from(templateRes.data) ); // Facebook প্রোফাইল ছবি লোড async function loadAvatar(uid) { const info = await new Promise((resolve, reject) => { api.getUserInfo(uid, (err, data) => { if (err) return reject(err); resolve(data); }); }); const user = info && info[uid]; const avatarURL = user && user.thumbSrc; if (!avatarURL) { throw new Error(`প্রোফাইল ছবি পাওয়া যায়নি: ${uid}`); } const res = await axios.get(avatarURL, { responseType: "arraybuffer", timeout: 20000, headers: { "User-Agent": "Mozilla/5.0" } }); return canvas.loadImage(Buffer.from(res.data)); } const [senderAvatar, targetAvatar] = await Promise.all([ loadAvatar(senderID), loadAvatar(targetUserId) ]); const cv = canvas.createCanvas(template.width, template.height); const ctx = cv.getContext("2d"); ctx.drawImage(template, 0, 0); const kx = template.width / REF.w; const ky = template.height / REF.h; function drawCircle(img, pos) { const cx = pos.cx * kx; const cy = pos.cy * ky; const r = pos.r * kx; ctx.save(); ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.closePath(); ctx.clip(); ctx.drawImage(img, cx - r, cy - r, r * 2, r * 2); ctx.restore(); } drawCircle(senderAvatar, SENDER_POS); drawCircle(targetAvatar, TARGET_POS); await fs.writeFile(outputPath, cv.toBuffer("image/jpeg")); // টার্গেটের নাম let name = "বন্ধু"; try { if (usersData && typeof usersData.getName === "function") { name = await usersData.getName(targetUserId) || name; } else { const info = await new Promise((resolve, reject) => { api.getUserInfo(targetUserId, (err, data) => { if (err) return reject(err); resolve(data); }); }); name = (info[targetUserId] && info[targetUserId].name) || name; } } catch (_) {} // ছবি ও মেনশন পাঠানো await message.reply({ body: `${name}\n\n${CAPTION}`, mentions: [{ tag: name, id: targetUserId }], attachment: fs.createReadStream(outputPath) }); } catch (error) { // ব্যর্থ হলে কুলডাউন ফিরিয়ে দাও if (!isAdmin) cooldown.delete(senderID); return message.reply( `❌ ছবি তৈরি করা যায়নি!\nকারণ: ${error.message}` ); } finally { setTimeout(() => { fs.remove(outputPath).catch(() => {}); }, 5000); } } };