UNPKG

@delirius/welcard

Version:

WelCard is a lightweight and futuristic welcome card libary designed for WhatsApp Bots.

178 lines (150 loc) 4.47 kB
const devmod = false; const canvas = require("@napi-rs/canvas"); const { colorFetch } = require("../functions/colorFetch"); canvas.GlobalFonts.registerFromPath( `${ devmod ? "" : "node_modules/@delirius/welcard/" }res/fonts/circularstd-black.otf`, "circular-std", ); canvas.GlobalFonts.registerFromPath( `${ devmod ? "" : "node_modules/@delirius/welcard/" }res/fonts/notosans-jp-black.ttf`, "noto-sans-jp", ); canvas.GlobalFonts.registerFromPath( `${ devmod ? "" : "node_modules/@delirius/welcard/" }res/fonts/notosans-black.ttf`, "noto-sans", ); canvas.GlobalFonts.registerFromPath( `${ devmod ? "" : "node_modules/@delirius/welcard/" }res/fonts/notoemoji-bold.ttf`, "noto-emoji", ); canvas.GlobalFonts.registerFromPath( `${ devmod ? "" : "node_modules/@delirius/welcard/" }res/fonts/notosans-kr-black.ttf`, "noto-sans-kr", ); class welCard { constructor() { this.name = null; this.author = null; this.color = null; this.brightness = null; this.thumbnail = null; this.server = null; } setName(name) { this.name = name; return this; } setAuthor(author) { this.author = author; return this; } setColor(color) { this.color = color; return this; } setBrightness(brightness) { this.brightness = brightness; return this; } setThumbnail(thumbnail) { this.thumbnail = thumbnail; return this; } setServer(server) { this.server = server; return this; } async build() { if (!this.name) { throw new Error("Missing name parameter"); } if (!this.author) { throw new Error("Missing author parameter"); } let thumbnailURL = this.thumbnail || `${devmod ? "" : "node_modules/@delirius/welcard/"}res/noimage.jpg`; const validatedColor = await colorFetch( this.color || "ff0000", parseInt(this.brightness) || 0, thumbnailURL, ); const img = await canvas.loadImage( `${devmod ? "" : "node_modules/@delirius/welcard/"}res/background.png`, ); const thumbnailCanvas = canvas.createCanvas(564, 564); const thumbnailCtx = thumbnailCanvas.getContext("2d"); let thumbnailImage; thumbnailImage = await canvas.loadImage(thumbnailURL, { requestOptions: { headers: { "User-Agent": "Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com)", }, }, }); const thumbnailSize = Math.min(thumbnailImage.width, thumbnailImage.height); const thumbnailX = (thumbnailImage.width - thumbnailSize) / 2; const thumbnailY = (thumbnailImage.height - thumbnailSize) / 2; thumbnailCtx.beginPath(); const cornerRadius2 = 45; thumbnailCtx.moveTo(0 + cornerRadius2, 0); thumbnailCtx.arcTo( thumbnailCanvas.width, 0, thumbnailCanvas.width, thumbnailCanvas.height, cornerRadius2, ); thumbnailCtx.arcTo( thumbnailCanvas.width, thumbnailCanvas.height, 0, thumbnailCanvas.height, cornerRadius2, ); thumbnailCtx.arcTo(0, thumbnailCanvas.height, 0, 0, cornerRadius2); thumbnailCtx.arcTo(0, 0, thumbnailCanvas.width, 0, cornerRadius2); thumbnailCtx.closePath(); thumbnailCtx.clip(); thumbnailCtx.drawImage( thumbnailImage, thumbnailX, thumbnailY, thumbnailSize, thumbnailSize, 0, 0, thumbnailCanvas.width, thumbnailCanvas.height, ); if (this.name.length > 15) this.name = `${this.name.slice(0, 15)}...`; if (this.author.length > 15) this.author = `${this.author.slice(0, 15)}...`; if (this.server.length > 15) this.author = `${this.author.slice(0, 15)}...`; const image = canvas.createCanvas(1280, 450); const ctx = image.getContext("2d"); ctx.drawImage(img, 0, 0, 1280, 450); ctx.fillStyle = `#${validatedColor}`; ctx.font = `75px circular-std, noto-emoji, noto-sans-jp, noto-sans, noto-sans-kr`; ctx.fillText(this.name, 70, 120); ctx.fillStyle = "#b8b8b8"; ctx.font = `50px circular-std, noto-emoji, noto-sans-jp, noto-sans, noto-sans-kr`; ctx.fillText(this.author, 75, 190); ctx.fillStyle = "#b8b8b8"; ctx.font = `30px circular-std, noto-emoji, noto-sans-jp, noto-sans, noto-sans-kr`; ctx.fillText(this.server, 75, 380); ctx.drawImage(thumbnailCanvas, 837, 8, 435, 435); return image.toBuffer("image/png"); } } module.exports = { welCard };