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