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"));
}
}
};