← back to browse
goat command

gushi

๐ŸฅŠ Punch someone

0
views
0
likes
0
installs

Aliases: punch

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

module.exports = {
  config: {
    name: "gushi",
    aliases: ["punch"],
    version: "2.0",
    author: "Converted by ariyan",
    countDown: 5,
    role: 0,
    shortDescription: "๐ŸฅŠ Punch someone",
    longDescription: "Tag or reply to someone to generate a punch image",
    category: "fun",
    guide: "{pn} @tag or reply"
  },

  onStart: async function ({ event, message, usersData }) {
    const { senderID, mentions, messageReply } = event;

    const puncherID = senderID;
    let targetID = Object.keys(mentions || {})[0];

    if (!targetID && messageReply?.senderID) {
      targetID = messageReply.senderID;
    }

    if (!targetID) {
      return message.reply("๐ŸฅŠ | Please tag someone or reply to their message.");
    }

    try {
      // Get names
      const puncherName = await usersData.getName(puncherID).catch(() => "Someone");
      const targetName = await usersData.getName(targetID).catch(() => "Someone");

      // Get avatars
      const puncherAvatarUrl = await usersData.getAvatarUrl(puncherID);
      const targetAvatarUrl = await usersData.getAvatarUrl(targetID);

      // Load images
      const [puncherAvatar, targetAvatar, baseImage] = await Promise.all([
        loadImage(puncherAvatarUrl),
        loadImage(targetAvatarUrl),
        loadImage("https://raw.githubusercontent.com/X-nil143/XGbal/refs/heads/main/Messenger_creation_25995716493353919.jpeg")
      ]);

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

      ctx.drawImage(baseImage, 0, 0, baseImage.width, baseImage.height);

      // Function to draw circle avatar
      function drawCircleAvatar(avatar, x, y, size) {
        ctx.save();
        ctx.beginPath();
        ctx.arc(x + size / 2, y + size / 2, size / 2, 0, Math.PI * 2);
        ctx.closePath();
        ctx.clip();
        ctx.drawImage(avatar, x, y, size, size);
        ctx.restore();
      }

      // Avatar positions
      drawCircleAvatar(puncherAvatar, 1000, 50, 338);
      drawCircleAvatar(targetAvatar, 80, 572, 338);

      // Save temp file
      const tmpDir = path.join(__dirname, "tmp");
      await fs.ensureDir(tmpDir);

      const filePath = path.join(tmpDir, `punch_${puncherID}_${targetID}.png`);
      await fs.writeFile(filePath, canvas.toBuffer("image/png"));

      await message.reply({
        body: `๐ŸฅŠ ${puncherName} just punched ${targetName}! ๐Ÿ˜†`,
        attachment: fs.createReadStream(filePath)
      });

      // Auto delete
      setTimeout(() => {
        if (fs.existsSync(filePath)) fs.unlinkSync(filePath);
      }, 5000);

    } catch (err) {
      console.error("Punch command error:", err);
      return message.reply("โŒ | Couldn't generate punch image. Try again later.");
    }
  }
};

View raw file