← back to browse
goat command

punch

๐ŸฅŠ Generate a punch image for sender and tagged user

0
views
0
likes
0
installs

Aliases: pnch

raw source
const fs = require("fs-extra");
const path = require("path");
const { createCanvas, loadImage } = require("canvas");

module.exports = {
  config: {
    name: "punch",
    aliases: ["pnch"],
    version: "1.5",
    author: "Toshiro Editz",
    countDown: 5,
    role: 0,
    description: "๐ŸฅŠ Generate a punch image for sender and tagged user",
    category: "fun",
    guide: {
      en: "{pn} @tag or reply โ€” Generate a punch image"
    }
  },

  langs: {
    en: {
      noTag: "Please tag someone or reply to their message ๐ŸฅŠ",
      fail: "โŒ | Couldn't generate punch image, please try again later."
    }
  },

  onStart: async function ({ event, message, usersData, getLang }) {
    const kickerID = event.senderID;
    let kickedID = Object.keys(event.mentions || {})[0];
    if (!kickedID && event.messageReply?.senderID) kickedID = event.messageReply.senderID;
    if (!kickedID) return message.reply(getLang("noTag"));

    try {
      // Get names
      const [kickerName, kickedName] = await Promise.all([
        usersData.getName(kickerID).catch(() => "Unknown"),
        usersData.getName(kickedID).catch(() => "Unknown")
      ]);

      // Get avatars
      const [kickerAvatarUrl, kickedAvatarUrl] = await Promise.all([
        usersData.getAvatarUrl(kickerID),
        usersData.getAvatarUrl(kickedID)
      ]);

      // Load images
      const [kickerAvatar, kickedAvatar, baseImage] = await Promise.all([
        loadImage(kickerAvatarUrl),
        loadImage(kickedAvatarUrl),
        loadImage("https://raw.githubusercontent.com/X-nil143/XGbal/refs/heads/main/Messenger_creation_25995716493353919.jpeg") // Reliable base image
      ]);

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

      // Draw background
      ctx.drawImage(baseImage, 0, 0, baseImage.width, baseImage.height);

      // Draw circular avatars
      function drawCircleAvatar(avatar, x, y, size) {
        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(avatar, x, y, size, size);
        ctx.restore();
      }

      // Avatar positions
      drawCircleAvatar(kickerAvatar, 1000, 50, 338); // sender
      drawCircleAvatar(kickedAvatar, 80, 572, 338); // tagged / reply

      // Save image
      const savePath = path.join(__dirname, "tmp");
      await fs.ensureDir(savePath);
      const imgPath = path.join(savePath, `${kickerID}_${kickedID}_punch.png`);
      await fs.writeFile(imgPath, canvas.toBuffer("image/png"));

      const text = `๐ŸฅŠ ${kickerName} just punched ${kickedName}!`;
      await message.reply({
        body: text,
        attachment: fs.createReadStream(imgPath)
      });

      // Delete temp file after 5 seconds
      setTimeout(() => {
        if (fs.existsSync(imgPath)) fs.unlinkSync(imgPath);
      }, 5000);

    } catch (err) {
      console.error("โŒ Punch command error:", err);
      return message.reply(getLang("fail"));
    }
  }
};

View raw file