goat
command
murgi
Turn someone into a chicken
0
views
0
likes
0
installs
Aliases: chicken, poultry, cluck
raw source
const { get } = require("axios");
const { createCanvas, loadImage } = require("canvas");
const { existsSync, mkdirSync, writeFileSync, unlinkSync, readFileSync } = require("fs-extra");
const { join } = require("path");
let cachedTemplate = null;
module.exports = {
config: {
name: "murgi",
aliases: ["chicken", "poultry", "cluck"],
version: "3.2",
author: "Anik Islam Sadik",
countDown: 5,
role: 0,
shortDescription: { en: "Turn someone into a chicken" },
longDescription: { en: "Overlay user avatar on a chicken template" },
category: "FUN & SOCIAL",
guide: { en: "{pn} @mention / reply / UID" }
},
onStart: async function ({ api, event, args }) {
const { threadID, messageID, senderID, messageReply, mentions, type } = event;
let targetID = null;
if (messageReply) {
targetID = messageReply.senderID;
} else if (Object.keys(mentions).length > 0) {
targetID = Object.keys(mentions)[0];
} else if (args.length > 0 && /^\d+$/.test(args[0])) {
targetID = args[0];
} else {
targetID = senderID;
}
if (!targetID) {
return api.sendMessage("❌ No target found.", threadID, messageID);
}
let userInfo;
try {
userInfo = await api.getUserInfo(targetID);
} catch (e) {
console.error("Error fetching user info:", e);
return api.sendMessage("❌ Failed to fetch user info.", threadID, messageID);
}
const user = userInfo[targetID];
if (!user) {
return api.sendMessage("❌ User not found.", threadID, messageID);
}
const name = user.name || "Unknown";
api.setMessageReaction("🐣", messageID, () => {}, true);
const tempMsg = await api.sendMessage(`⏳ দাঁড়া ${name} কে মুরগি বানাচ্ছি... 🐔`, threadID);
try {
const imageStream = await generateChickenImage(targetID);
await api.unsendMessage(tempMsg.messageID);
const reply = `🐔 এই নে মুরগি বানিয়ে দিলাম ${name}!`;
await api.sendMessage(
{
body: reply,
attachment: imageStream,
mentions: [{ tag: name, id: targetID }]
},
threadID,
() => {
if (imageStream.path && existsSync(imageStream.path)) {
unlinkSync(imageStream.path);
}
},
messageID
);
api.setMessageReaction("✅", messageID, () => {}, true);
} catch (err) {
console.error("Chicken generation error:", err);
api.setMessageReaction("❌", messageID, () => {}, true);
return api.sendMessage(`❌ মুরগি বানাতে সমস্যা হয়েছে! Error: ${err.message || err}`, threadID, messageID);
}
}
};
async function getTemplateImage() {
if (cachedTemplate) return cachedTemplate;
const CACHE = join(__dirname, "cache");
if (!existsSync(CACHE)) mkdirSync(CACHE, { recursive: true });
const templatePath = join(CACHE, "chicken_template.png");
if (existsSync(templatePath)) {
const buffer = readFileSync(templatePath);
cachedTemplate = await loadImage(buffer);
return cachedTemplate;
}
const templateUrl = "https://i.imgur.com/eitR3yP.jpeg";
let lastError = null;
for (let attempt = 1; attempt <= 3; attempt++) {
try {
const response = await get(templateUrl, {
responseType: "arraybuffer",
timeout: 15000,
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
});
const buffer = Buffer.from(response.data);
writeFileSync(templatePath, buffer);
cachedTemplate = await loadImage(buffer);
return cachedTemplate;
} catch (err) {
lastError = err;
console.error(`Template download attempt ${attempt} failed:`, err.message);
if (err.response && err.response.status === 429) {
const wait = attempt * 2000;
await new Promise(r => setTimeout(r, wait));
} else {
break;
}
}
}
throw new Error(`Failed to download template after 3 attempts: ${lastError.message}`);
}
async function generateChickenImage(targetId) {
const CACHE = join(__dirname, "cache");
if (!existsSync(CACHE)) mkdirSync(CACHE, { recursive: true });
const avatarUrl = `https://graph.facebook.com/${targetId}/picture?width=512&height=512&access_token=6628568379%7Cc1e620fa708a1d5696fb991c1bde5662`;
let avatarBuf;
try {
const response = await get(avatarUrl, {
responseType: "arraybuffer",
timeout: 15000
});
avatarBuf = response.data;
} catch (err) {
throw new Error("Failed to download avatar: " + err.message);
}
const [avatarImg, templateImg] = await Promise.all([
loadImage(avatarBuf),
getTemplateImage()
]);
const canvas = createCanvas(templateImg.width, templateImg.height);
const ctx = canvas.getContext("2d");
ctx.drawImage(templateImg, 0, 0);
const x = 410, y = 60, size = 80;
ctx.save();
ctx.beginPath();
ctx.arc(x + size/2, y + size/2, size/2, 0, Math.PI * 2, true);
ctx.closePath();
ctx.clip();
ctx.drawImage(avatarImg, x, y, size, size);
ctx.restore();
const outPath = join(CACHE, `chicken_${targetId}.png`);
writeFileSync(outPath, canvas.toBuffer());
const stream = require("fs").createReadStream(outPath);
stream.path = outPath;
return stream;
}