goat
command
info
Owner info
0
views
0
likes
0
installs
Aliases: in4, ownerinfo
raw source
const os = require("os");
const { createCanvas, loadImage } = require("canvas");
const fs = require("fs");
const path = require("path");
const W = 490, H = 840;
const AVATAR1 = "https://i.imgur.com/5L1We9h.jpeg";
const FALLBACK_AVATAR = "https://i.ibb.co/MC6bT5V/default-avatar.png"; // fallback if error
function formatUptime(ms) {
const totalSeconds = Math.floor(ms / 1000);
const days = Math.floor(totalSeconds / (3600 * 24));
const hours = Math.floor((totalSeconds % (3600 * 24)) / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const seconds = totalSeconds % 60;
return `${days}d ${hours}h ${minutes}m ${seconds}s`;
}
async function drawDodecagonAvatar(ctx, url, x, y, size, ringColors) {
const sides = 12;
const radius = size / 2;
for (let i = 0; i < ringColors.length; i++) {
ctx.beginPath();
for (let j = 0; j < sides; j++) {
const angle = (Math.PI * 2 / sides) * j;
const rx = x + radius + Math.cos(angle) * (radius + i * 8);
const ry = y + radius + Math.sin(angle) * (radius + i * 8);
if (j === 0) ctx.moveTo(rx, ry);
else ctx.lineTo(rx, ry);
}
ctx.closePath();
ctx.strokeStyle = ringColors[i];
ctx.lineWidth = 4;
ctx.shadowColor = ringColors[i];
ctx.shadowBlur = 20;
ctx.stroke();
}
let img;
try { img = await loadImage(url); }
catch { img = await loadImage(FALLBACK_AVATAR); }
ctx.save();
ctx.beginPath();
for (let j = 0; j < sides; j++) {
const angle = (Math.PI * 2 / sides) * j;
const rx = x + radius + Math.cos(angle) * radius;
const ry = y + radius + Math.sin(angle) * radius;
if (j === 0) ctx.moveTo(rx, ry);
else ctx.lineTo(rx, ry);
}
ctx.closePath();
ctx.clip();
ctx.drawImage(img, x, y, size, size);
ctx.restore();
}
async function drawPage1(ctx) {
const gradient = ctx.createLinearGradient(0, 0, 0, H);
gradient.addColorStop(0, "#4b006e");
gradient.addColorStop(1, "#1a001f");
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, W, H);
const particles = [
{ x: 50, y: 120, r: 3 }, { x: 120, y: 230, r: 2.5 },
{ x: 300, y: 180, r: 3.5 }, { x: 400, y: 310, r: 2 },
{ x: 180, y: 360, r: 3 }, { x: 420, y: 430, r: 2.2 },
{ x: 80, y: 500, r: 3.2 }, { x: 350, y: 520, r: 2.7 },
{ x: 220, y: 600, r: 3.8 }, { x: 430, y: 670, r: 2.6 }
];
for (const p of particles) {
ctx.beginPath();
ctx.fillStyle = "rgba(255, 102, 204, 0.15)";
ctx.shadowColor = "rgba(255, 102, 204, 0.7)";
ctx.shadowBlur = 10;
ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2);
ctx.fill();
}
await drawDodecagonAvatar(ctx, AVATAR1, W / 2 - 90, 60, 180, [
"#ff99cc", "#ff33aa", "#cc0077"
]);
ctx.font = "bold 38px Arial";
ctx.textAlign = "center";
ctx.fillStyle = "#ff99cc";
ctx.shadowColor = "#ff33aa";
ctx.shadowBlur = 25;
ctx.fillText("JABED ", W / 2, 295); // slightly lower
ctx.font = "italic 20px Arial";
ctx.fillStyle = "#ff66cc";
ctx.shadowColor = "#cc3399";
ctx.shadowBlur = 15;
ctx.fillText("Owner Information", W / 2, 330);
ctx.shadowBlur = 0;
ctx.fillStyle = "rgba(255,255,255,0.06)";
ctx.fillRect(40, 360, W - 80, 360);
ctx.strokeStyle = "#cc3399";
ctx.lineWidth = 2;
ctx.shadowColor = "#ff66cc";
ctx.shadowBlur = 12;
ctx.strokeRect(40, 360, W - 80, 360);
ctx.font = "22px Arial";
ctx.fillStyle = "#f2ccff";
ctx.shadowColor = "#cc33aa";
ctx.shadowBlur = 12;
const lines = [
"Nickname: JABED ", "Age: 18+", "DOB: 10 Ssc 2007*",
"Gender: Male", "Religion: Islam", "Nationality: Bangladeshi",
"Location: COX'S BAZAR ", "Class: Hsc candidate",
`Time: ${new Date().toLocaleString("en-IN", { timeZone: "Asia/Dhaka" })}`
];
let y = 400;
for (const line of lines) {
ctx.fillText(line, W / 2, y);
y += 38;
}
ctx.font = "italic 18px Arial";
ctx.fillStyle = "#e673ff";
ctx.shadowColor = "#ff99ff";
ctx.shadowBlur = 25;
const obf = String.fromCharCode(169) + "JABED";
ctx.fillText(obf, W / 2, H - 35);
}
module.exports = {
config: {
name: "info",
aliases: ["in4", "ownerinfo"],
version: "1.0",
author: "JABED",
countDown: 5,
role: 0,
shortDescription: "Owner info",
category: "information"
},
onStart: async function ({ message }) {
const canvas = createCanvas(W, H);
const ctx = canvas.getContext("2d");
await drawPage1(ctx);
const buffer = canvas.toBuffer("image/png");
const dir = path.join(__dirname, "cache");
if (!fs.existsSync(dir)) fs.mkdirSync(dir);
const filePath = path.join(dir, `info_page.png`);
fs.writeFileSync(filePath, buffer);
return message.reply({ attachment: fs.createReadStream(filePath) });
}
};