← back to browse
goat command

post

No description

0
views
0
likes
0
installs

Aliases: prankpost

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

module.exports = {
 config: {
 name: "post",
 aliases: ["prankpost"],
 version: "1.0.0",
 author: "EryXenX",
 countDown: 5,
 role: 0,
 description: {
 en: "Fake Facebook post prank",
 bn: "ফেক ফেসবুক পোস্ট প্র্যাংক"
 },
 category: "fun",
 guide: { en: "{pn} <text> or {pn} @mention <text> or reply with {pn} <text>" }
 },

 langs: {
 en: { noText: "❌ | Write something to post!", error: "❌ | Failed to generate. Try again." },
 bn: { noText: "❌ | পোস্টে কিছু লিখো!", error: "❌ | তৈরি করতে সমস্যা হয়েছে।" },
 hi: { noText: "❌ | Post mein kuch likho!", error: "❌ | Banana fail hua." },
 tl: { noText: "❌ | Maglagay ng text sa post!", error: "❌ | Hindi nagawa." },
 ar: { noText: "❌ | اكتب شيئاً لنشره!", error: "❌ | فشل الإنشاء." }
 },

 onStart: async function ({ event, message, getLang, usersData, args }) {
 try {
 const mentionID = Object.keys(event.mentions)[0]
 || (event.messageReply ? event.messageReply.senderID : null);

 const posterID = mentionID || event.senderID;

 let postText = args.join(" ");
 if (mentionID) {
 const mentionTag = Object.values(event.mentions)[0];
 postText = postText.replace("@" + mentionTag, "").trim();
 }
 if (!postText) return message.reply(getLang("noText"));

 const posterName = await usersData.getName(posterID).catch(() => "Unknown");

 const ts = Date.now();
 const avatarPath = __dirname + "/cache/post_avt_" + ts + ".jpg";
 const outputPath = __dirname + "/cache/post_out_" + ts + ".jpg";

 const avatarRes = await axios.get("https://graph.facebook.com/" + posterID + "/picture?height=720&width=720&access_token=6628568379%7Cc1e620fa708a1d5696fb991c1bde5662", { responseType: "arraybuffer" });
 fs.writeFileSync(avatarPath, Buffer.from(avatarRes.data));
 const avatarImg = await loadImage(avatarPath);

 const W = 720;
 const padding = 28;
 const lineHeight = 38;
 const textStartY = 145;
 const textLines = wrapText(postText, 36);
 const textBlockHeight = textLines.length * lineHeight;
 const H = textStartY + textBlockHeight + 170;

 const canvas = createCanvas(W, H);
 const ctx = canvas.getContext("2d");

 ctx.fillStyle = "#ffffff";
 ctx.fillRect(0, 0, W, H);

 const avatarSize = 56;
 const avatarX = padding;
 const avatarY = padding;

 ctx.save();
 ctx.beginPath();
 ctx.arc(avatarX + avatarSize / 2, avatarY + avatarSize / 2, avatarSize / 2, 0, Math.PI * 2);
 ctx.closePath();
 ctx.clip();
 drawCoverImage(ctx, avatarImg, avatarX, avatarY, avatarSize, avatarSize);
 ctx.restore();

 ctx.fillStyle = "#050505";
 ctx.font = "bold 26px Sans";
 ctx.textAlign = "left";
 ctx.fillText(posterName, avatarX + avatarSize + 16, avatarY + 26);

 ctx.fillStyle = "#65676b";
 ctx.font = "20px Sans";
 ctx.fillText("Just now · 🌐", avatarX + avatarSize + 16, avatarY + 52);

 ctx.fillStyle = "#65676b";
 ctx.font = "bold 30px Sans";
 ctx.fillText("⋯", W - 60, avatarY + 36);

 let textY = textStartY;
 ctx.fillStyle = "#050505";
 ctx.font = "28px Sans";
 for (const line of textLines) {
 ctx.fillText(line, padding, textY);
 textY += lineHeight;
 }

 const statsY = textY + 6;
 ctx.strokeStyle = "#e4e6eb";
 ctx.lineWidth = 1;
 ctx.beginPath();
 ctx.moveTo(padding, statsY);
 ctx.lineTo(W - padding, statsY);
 ctx.stroke();

 const likeCount = randomCount();
 const commentCount = randomCount();
 const shareCount = randomCount();

 ctx.fillStyle = "#1877f2";
 ctx.beginPath();
 ctx.arc(padding + 12, statsY + 30, 12, 0, Math.PI * 2);
 ctx.fill();
 drawThumbIcon(ctx, padding + 12, statsY + 30, "#ffffff");

 ctx.fillStyle = "#65676b";
 ctx.font = "22px Sans";
 ctx.fillText(likeCount, padding + 32, statsY + 38);

 ctx.textAlign = "right";
 ctx.fillText(commentCount + " comments · " + shareCount + " shares", W - padding, statsY + 38);
 ctx.textAlign = "left";

 const statsLineY = statsY + 58;
 ctx.beginPath();
 ctx.moveTo(padding, statsLineY);
 ctx.lineTo(W - padding, statsLineY);
 ctx.stroke();

 ctx.fillStyle = "#65676b";
 ctx.font = "bold 24px Sans";
 const actionsY = statsLineY + 42;
 ctx.fillText("👍 Like", padding + 10, actionsY);
 ctx.fillText("💬 Comment", W / 2 - 60, actionsY);
 ctx.fillText("↗ Share", W - padding - 110, actionsY);

 fs.writeFileSync(outputPath, canvas.toBuffer("image/jpeg", { quality: 0.92 }));

 await message.reply({ attachment: fs.createReadStream(outputPath) });

 [avatarPath, outputPath].forEach(p => { try { fs.unlinkSync(p); } catch (_) {} });

 } catch (err) {
 console.error("Post Error:", err);
 message.reply(getLang("error"));
 }
 }
};

function wrapText(text, maxCharsPerLine) {
 const words = text.split(" ");
 const lines = [];
 let current = "";
 for (let word of words) {
 while (word.length > maxCharsPerLine) {
 if (current) {
 lines.push(current.trim());
 current = "";
 }
 lines.push(word.slice(0, maxCharsPerLine));
 word = word.slice(maxCharsPerLine);
 }
 if ((current + " " + word).trim().length > maxCharsPerLine) {
 lines.push(current.trim());
 current = word;
 } else {
 current += " " + word;
 }
 }
 if (current.trim()) lines.push(current.trim());
 return lines;
}

function randomCount() {
 const pools = [
 () => (Math.random() * 9 + 1).toFixed(1) + "K",
 () => (Math.random() * 90 + 10).toFixed(1) + "K",
 () => Math.floor(Math.random() * 900 + 100).toString(),
 () => (Math.random() * 9 + 1).toFixed(0) + "0K"
 ];
 const pick = pools[Math.floor(Math.random() * pools.length)];
 return pick();
}

function drawCoverImage(ctx, img, x, y, w, h) {
 const scale = Math.max(w / img.width, h / img.height);
 const dw = img.width * scale;
 const dh = img.height * scale;
 const dx = x + (w - dw) / 2;
 const dy = y + (h - dh) / 2;
 ctx.drawImage(img, dx, dy, dw, dh);
}

function drawThumbIcon(ctx, cx, cy, color) {
 ctx.save();
 ctx.translate(cx, cy);
 ctx.scale(0.55, 0.55);
 ctx.fillStyle = color;
 ctx.beginPath();
 ctx.moveTo(-9, -2);
 ctx.lineTo(-9, 11);
 ctx.lineTo(-4, 11);
 ctx.lineTo(-4, -2);
 ctx.closePath();
 ctx.fill();
 ctx.beginPath();
 ctx.moveTo(-3, -2);
 ctx.lineTo(-3, 11);
 ctx.lineTo(7, 11);
 ctx.bezierCurveTo(9, 11, 10, 10, 10, 8);
 ctx.lineTo(12, 0);
 ctx.bezierCurveTo(12.5, -2, 11, -4, 9, -4);
 ctx.lineTo(2, -4);
 ctx.lineTo(3, -10);
 ctx.bezierCurveTo(3.3, -12.5, 1, -14, -0.5, -12.5);
 ctx.lineTo(-3, -7);
 ctx.closePath();
 ctx.fill();
 ctx.restore();
}

View raw file