← back to browse
goat command

married

married canvas card

0
views
0
likes
0
installs
raw source
// Married command - Canvas powered
const fs = require("fs-extra");
const path = require("path");
const axios = require("axios");
const { createCanvas, loadImage } = require("canvas");
const { getMentionIdsRobust } = require("../../includes/mentionResolver");

module.exports.config = {
  name: "married",
  version: "3.2.0",
  role: 0,
  author: "π“†©π‘…π‘œπ’·π’Ύπ“ƒπ“†ͺ π’œπ“π’Ύ",
  description: "married canvas card",
  category: "img",
  usages: "[@mention]",
  countDown: 5,
};

async function circleAvatar(img, size) {
  const canvas = createCanvas(size, size);
  const ctx = canvas.getContext("2d");
  ctx.beginPath();
  ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2, true);
  ctx.closePath();
  ctx.clip();
  ctx.drawImage(img, 0, 0, size, size);
  return canvas;
}

async function makeImage({ one, two }) {
  const cacheDir = path.join(__dirname, "cache", "canvas");
  await fs.ensureDir(cacheDir);

  const bgPath = path.join(cacheDir, "married.png");
  if (!fs.existsSync(bgPath)) {
    const res = await axios.get("https://i.imgur.com/txnRTKf.png", { responseType: "arraybuffer" });
    fs.writeFileSync(bgPath, Buffer.from(res.data));
  }

  const outPath = path.join(cacheDir, "batman" + one + "_" + two + ".png");

  const [bgImg, avt1Res, avt2Res] = await Promise.all([
    loadImage(bgPath),
    axios.get("https://graph.facebook.com/" + one + "/picture?width=512&height=512&access_token=6628568379%7Cc1e620fa708a1d5696fb991c1bde5662", { responseType: "arraybuffer" }),
    axios.get("https://graph.facebook.com/" + two + "/picture?width=512&height=512&access_token=6628568379%7Cc1e620fa708a1d5696fb991c1bde5662", { responseType: "arraybuffer" })
  ]);

  const [avt1Img, avt2Img] = await Promise.all([
    loadImage(Buffer.from(avt1Res.data)),
    loadImage(Buffer.from(avt2Res.data))
  ]);

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

  ctx.drawImage(bgImg, 0, 0);

  const cAvt1 = await circleAvatar(avt1Img, 170);
  const cAvt2 = await circleAvatar(avt2Img, 170);

  ctx.drawImage(cAvt1, 1520, 210, 170, 170);
  ctx.drawImage(cAvt2, 980, 300, 170, 170);

  fs.writeFileSync(outPath, canvas.toBuffer("image/png"));
  return outPath;
}

module.exports.onStart = async function ({ event, api, args }) {
  const { threadID, messageID, senderID } = event;
  const mention = await getMentionIdsRobust(api, event);
  if (!mention || !mention[0]) {
    return api.sendMessage("Please mention 1 person.", threadID, messageID);
  }
  const one = senderID;
  const two = mention[0];
  try {
    const imgPath = await makeImage({ one, two });
    return api.sendMessage(
      { body: "", attachment: fs.createReadStream(imgPath) },
      threadID,
      () => fs.unlinkSync(imgPath),
      messageID
    );
  } catch (err) {
    return api.sendMessage("Failed to generate married image: " + err.message, threadID, messageID);
  }
};

View raw file