diff --git a/README.md b/README.md index ad3c558..d596d8f 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,12 @@ bot.login("super_secret_token") - ``new DIG.Mms().getImage(``);`` +![LisaPresentation](https://imgur.com/u5cPVVW) + +- ``new DIG.LisaPresentation().getImage(``);`` + +> Limited to 300char + ![MMS](https://imgur.com/nH3URHb.png) - ``new DIG.Rip().getImage(``);`` @@ -186,6 +192,9 @@ bot.login("super_secret_token") # Changelog +## v1.1.5 +- Added LisaPresentation + ## v1.1.2 - Fixed invalid path - Moved assets folder diff --git a/package.json b/package.json index 04954fd..7a52a7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord-image-generation", - "version": "1.1.4", + "version": "1.1.5", "description": "discord-image-generation is a powerfull module that allow you to generate awesome images.", "main": "src/index.js", "scripts": { diff --git a/src/assets/fonts/Noto-Emoji.ttf b/src/assets/fonts/Noto-Emoji.ttf new file mode 100644 index 0000000..19b7bad Binary files /dev/null and b/src/assets/fonts/Noto-Emoji.ttf differ diff --git a/src/assets/fonts/Noto-Regular.ttf b/src/assets/fonts/Noto-Regular.ttf new file mode 100644 index 0000000..0a01a06 Binary files /dev/null and b/src/assets/fonts/Noto-Regular.ttf differ diff --git a/src/assets/lisa-presentation.png b/src/assets/lisa-presentation.png new file mode 100644 index 0000000..2a76551 Binary files /dev/null and b/src/assets/lisa-presentation.png differ diff --git a/src/index.js b/src/index.js index ac1b7c8..a9d8d42 100644 --- a/src/index.js +++ b/src/index.js @@ -16,6 +16,7 @@ Facepalm = require('./module/montage/facepalm') Hitler = require('./module/montage/hitler') Jail = require('./module/montage/jail') Kiss = require('./module/montage/kiss') +LisaPresentation = require('./module/montage/lisa-presentation') Mms = require('./module/montage/mms') Rip = require('./module/montage/rip') Spank = require('./module/montage/spank') @@ -44,6 +45,7 @@ module.exports = { Hitler, Jail, Kiss, + LisaPresentation, Mms, Rip, Spank, diff --git a/src/module/montage/lisa-presentation.js b/src/module/montage/lisa-presentation.js new file mode 100644 index 0000000..d60baf8 --- /dev/null +++ b/src/module/montage/lisa-presentation.js @@ -0,0 +1,66 @@ +const { createCanvas, loadImage, registerFont } = require('canvas'); +registerFont(`${__dirname}/../../assets/fonts/Noto-Regular.ttf`, { family: 'Noto' }); +registerFont(`${__dirname}/../../assets/fonts/Noto-Emoji.ttf`, { family: 'Noto' }); +const path = require("path"); + +function wrapText(ctx, text, maxWidth) { + return new Promise(resolve => { + if (ctx.measureText(text).width < maxWidth) return resolve([text]); + if (ctx.measureText('W').width > maxWidth) return resolve(null); + const words = text.split(' '); + const lines = []; + let line = ''; + while (words.length > 0) { + let split = false; + while (ctx.measureText(words[0]).width >= maxWidth) { + const temp = words[0]; + words[0] = temp.slice(0, -1); + if (split) { + words[1] = `${temp.slice(-1)}${words[1]}`; + } + else { + split = true; + words.splice(1, 0, temp.slice(-1)); + } + } + if (ctx.measureText(`${line}${words[0]}`).width < maxWidth) { + line += `${words.shift()} `; + } + else { + lines.push(line.trim()); + line = ''; + } + if (words.length === 0) lines.push(line.trim()); + } + return resolve(lines); + }); +} + +module.exports = class LisaPresentation { + + async getImage(text) { + if (!text || text.length > 300) throw new Error(`You must provide a text of 300 characters or less.`) + + const base = await loadImage(path.join(`${__dirname}/../../assets/lisa-presentation.png`)); + const canvas = createCanvas(base.width, base.height); + const ctx = canvas.getContext('2d'); + ctx.drawImage(base, 0, 0); + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + ctx.font = '40px Noto'; + let fontSize = 40; + while (ctx.measureText(text).width > 1320) { + fontSize -= 1; + ctx.font = `${fontSize}px Noto`; + } + const lines = await wrapText(ctx, text, 330); + const topMost = 185 - (((fontSize * lines.length) / 2) + ((20 * (lines.length - 1)) / 2)); + for (let i = 0; i < lines.length; i++) { + const height = topMost + ((fontSize + 20) * i); + ctx.fillText(lines[i], base.width / 2, height); + } + + return canvas.toBuffer(); + } + +} \ No newline at end of file