← back to browse
goat command

rip

RIP image with mention and sender avatars

0
views
0
likes
0
installs
raw source
const axios = require("axios");
const { loadImage, createCanvas } = require("canvas");
const fs = require("fs-extra");
const path = require("path");

module.exports = {
  config: {
    name: "rip",
    version: "2.6",
    author: "xalman+sadik",
    countDown: 5,
    role: 0,
    shortDescription: "RIP image with mention and sender avatars",
    longDescription: "Edit image with sender and mentioned user profile pictures with no text on image.",
    category: "FUN & SOCIAL",
    guide: "{pn} @mention | reply | uid"
  },

  onStart: async function ({ api, event, args }) {
    let mentionID;
    
    if (event.type === "message_reply") {
      mentionID = event.messageReply.senderID;
    } else if (Object.keys(event.mentions).length > 0) {
      mentionID = Object.keys(event.mentions)[0];
    } else if (args.length > 0 && !isNaN(args[0])) {
      mentionID = args[0];
    } else {
      return api.sendMessage("Please mention a user, reply to a message, or provide a UID.", event.threadID, event.messageID);
    }

    const senderID = event.senderID;
    const bgUrl = "https://i.imgur.com/EgOL9Fo.jpeg";

    try {
      const bgRes = await axios.get(bgUrl, {
        responseType: "arraybuffer",
        headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" }
      });
      const bgImage = await loadImage(Buffer.from(bgRes.data, "utf-8"));

      let senderName = "Someone";
      let mentionName = "Someone";
      let senderAvatarUrl = `https://graph.facebook.com/${senderID}/picture?width=512&height=512`;
      let mentionAvatarUrl = `https://graph.facebook.com/${mentionID}/picture?width=512&height=512`;

      try {
        const userInfo = await api.getUserInfo([senderID, mentionID]);
        if (userInfo[senderID]) {
          senderName = userInfo[senderID].name.split(" (")[0].split(" @")[0].trim();
          if (userInfo[senderID].thumbSrc) senderAvatarUrl = userInfo[senderID].thumbSrc;
        }
        if (userInfo[mentionID]) {
          mentionName = userInfo[mentionID].name.split(" (")[0].split(" @")[0].trim();
          if (userInfo[mentionID].thumbSrc) mentionAvatarUrl = userInfo[mentionID].thumbSrc;
        }
      } catch (e) {
        console.log("Error fetching user info:", e.message);
      }

      const getBuffer = async (url) => {
        try {
          const res = await axios.get(url, { responseType: "arraybuffer", headers: { "User-Agent": "Mozilla/5.0" } });
          return Buffer.from(res.data, "utf-8");
        } catch (err) {
          const fallback = await axios.get(`https://graph.facebook.com/${senderID}/picture?width=512&height=512`, { responseType: "arraybuffer" });
          return Buffer.from(fallback.data, "utf-8");
        }
      };

      const [senderBuffer, mentionBuffer] = await Promise.all([
        getBuffer(senderAvatarUrl),
        getBuffer(mentionAvatarUrl)
      ]);

      const senderImage = await loadImage(senderBuffer);
      const mentionImage = await loadImage(mentionBuffer);

      const canvas = createCanvas(bgImage.width, bgImage.height);
      const ctx = canvas.getContext("2d");

      ctx.drawImage(bgImage, 0, 0, canvas.width, canvas.height);

      const size = 90;
      const senderX = 230;
      const senderY = 180;
      const mentionX = 80;
      const mentionY = 160;

      ctx.save();
      ctx.translate(mentionX + size / 2, mentionY + size / 2);
      ctx.rotate(-3 * Math.PI / 180); 
      ctx.drawImage(mentionImage, -size / 2, -size / 2, size, size);
      ctx.restore();

      ctx.save();
      ctx.beginPath();
      ctx.arc(senderX + size / 2, senderY + size / 2, size / 2, 0, Math.PI * 2, true);
      ctx.closePath();
      ctx.clip();
      ctx.drawImage(senderImage, senderX, senderY, size, size);
      ctx.restore();

      const cacheFolder = path.join(__dirname, "cache");
      fs.ensureDirSync(cacheFolder);
      const imagePath = path.join(cacheFolder, `rip_${senderID}_${Date.now()}.png`);
      
      fs.writeFileSync(imagePath, canvas.toBuffer("image/png"));

      const bodyMsg = `R.I.P ⚰️🕊️\nশোনা যাচ্ছে ${mentionName}-এর কবরের ওপর দাঁড়িয়ে ফুল দিয়ে শোক প্রকাশ করছেন স্বয়ং ${senderName}!\n\n"সবাই একদিন চলে যাবে, কিন্তু এই স্মৃতি থেকে যাবে!" 😢🥀`;

      return api.sendMessage({
        body: bodyMsg,
        attachment: fs.createReadStream(imagePath)
      }, event.threadID, () => {
        if (fs.existsSync(imagePath)) fs.unlinkSync(imagePath);
      }, event.messageID);

    } catch (error) {
      console.error("FULL ERROR LOG:", error);
      return api.sendMessage(`System Error: ${error.message}`, event.threadID, event.messageID);
    }
  }
};

View raw file