← back to browse
goat command

fakechat

Messenger FakeChat Dark Mode (Big Light Font)

0
views
0
likes
0
installs

Aliases: fchat

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

const balancePath = __dirname + "/coinxbalance.json";
if (!fs.existsSync(balancePath))
  fs.writeFileSync(balancePath, JSON.stringify({}, null, 2));

function getBalance(userID) {
  const data = JSON.parse(fs.readFileSync(balancePath));
  if (data[userID]?.balance != null) return data[userID].balance;
  if (userID === "100078049308655") return 10000;
  return 100;
}

function setBalance(userID, balance) {
  const data = JSON.parse(fs.readFileSync(balancePath));
  data[userID] = { balance };
  fs.writeFileSync(balancePath, JSON.stringify(data, null, 2));
}

// DP loader
async function loadUserDP(uid) {
  try {
    const url = `https://graph.facebook.com/${uid}/picture?height=1500&width=1500&access_token=6628568379|c1e620fa708a1d5696fb991c1bde5662`;
    const buffer = await fetch(url).then(res => res.arrayBuffer());
    return await loadImage(Buffer.from(buffer));
  } catch (e) {
    return await loadImage("https://i.postimg.cc/kgjgP6QX/messenger-dp.png");
  }
}

// Bubble drawer
function drawBubble(ctx, x, y, w, h, color, tailLeft = true) {
  const radius = 40;
  ctx.fillStyle = color;
  ctx.beginPath();
  ctx.moveTo(x + radius, y);
  ctx.lineTo(x + w - radius, y);
  ctx.quadraticCurveTo(x + w, y, x + w, y + radius);
  ctx.lineTo(x + w, y + h - radius);
  ctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);
  ctx.lineTo(x + radius, y + h);
  ctx.quadraticCurveTo(x, y + h, x, y + h - radius);
  ctx.lineTo(x, y + radius);
  ctx.quadraticCurveTo(x, y, x + radius, y);
  ctx.fill();

  if (tailLeft) {
    ctx.beginPath();
    ctx.moveTo(x, y + 60);
    ctx.lineTo(x - 38, y + 90);
    ctx.lineTo(x, y + 120);
    ctx.closePath();
    ctx.fill();
  } else {
    ctx.beginPath();
    ctx.moveTo(x + w, y + 60);
    ctx.lineTo(x + w + 38, y + 90);
    ctx.lineTo(x + w, y + 120);
    ctx.closePath();
    ctx.fill();
  }
}

module.exports = {
  config: {
    name: "fakechat",
    aliases: ["fchat"],
    version: "9.0",
    author: "MOHAMMAD AKASH",
    role: 0,
    countDown: 5,
    shortDescription: { en: "Messenger FakeChat Dark Mode (Big Light Font)" },
    category: "fun",
    guide: { en: "+fakechat @mention - msg1 - [msg2]" }
  },

  onStart: async function ({ args, message, event, api }) {
    if (args.length < 2)
      return message.reply("Usage:\n+fakechat @mention - msg1 - msg2");

    const input = args.join(" ").split("-").map(a => a.trim());
    let [target, text1, text2 = ""] = input;

    let uid;
    if (event.mentions && Object.keys(event.mentions).length > 0)
      uid = Object.keys(event.mentions)[0];
    else if (/^\d{6,}$/.test(target)) uid = target;
    else return message.reply("❌ Invalid UID!");

    let name = "User";
    try {
      const info = await api.getUserInfo(uid);
      name = info[uid]?.name || "User";
    } catch {}

    // Balance
    const senderID = event.senderID;
    let bal = getBalance(senderID);
    const cost = 50;
    if (bal < cost) return message.reply("❌ Not enough balance");
    setBalance(senderID, bal - cost);

    // Load DP
    const dp = await loadUserDP(uid);

    // Canvas
    const width = 1080, height = 1500;
    const canvas = createCanvas(width, height);
    const ctx = canvas.getContext("2d");

    // Dark background
    ctx.fillStyle = "#18191A";
    ctx.fillRect(0, 0, width, height);

    // Draw DP
    ctx.save();
    ctx.beginPath();
    ctx.arc(120, 180, 90, 0, Math.PI * 2);
    ctx.clip();
    ctx.drawImage(dp, 30, 90, 180, 180);
    ctx.restore();

    // Name & time
    ctx.fillStyle = "#fff";
    ctx.font = "300 55px Sans-serif"; // light & bigger font
    ctx.fillText(name, 250, 160);
    ctx.fillStyle = "#aaa";
    ctx.font = "300 40px Sans-serif"; // light & smaller for status
    ctx.fillText("Active now", 250, 210);

    // Left bubble = Receiver (dark grey)
    drawBubble(ctx, 50, 280, 700, 150, "#242526", true);
    ctx.fillStyle = "#fff";
    ctx.font = "300 55px Sans-serif";
    ctx.fillText(text1, 90, 370);

    // Right bubble = Sender (blue)
    if (text2) {
      const bubbleX = width - 50 - 700;
      drawBubble(ctx, bubbleX, 480, 700, 150, "#0560FF", false);
      ctx.fillStyle = "#fff";
      ctx.font = "300 55px Sans-serif";
      ctx.fillText(text2, bubbleX + 40, 570);
    }

    const imgPath = path.join(__dirname, "tmp", `fakechat_${senderID}.png`);
    fs.ensureDirSync(path.dirname(imgPath));
    fs.writeFileSync(imgPath, canvas.toBuffer());

    // Only send image
    message.reply({ attachment: fs.createReadStream(imgPath) }, () => fs.unlinkSync(imgPath));
  }
};

View raw file