← back to browse
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;
          }

View raw file