diff --git a/.github/workflows/npm-publish.yaml b/.github/workflows/npm-publish.yaml new file mode 100644 index 0000000..a77be50 --- /dev/null +++ b/.github/workflows/npm-publish.yaml @@ -0,0 +1,47 @@ +name: Node.js package + +on: + pull_request: + branches: + - master + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - run: npm ci + - run: npm test + + publish-npm: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + registry-url: https://registry.npmjs.org/ + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.npm_token}} + + publish-gpr: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + registry-url: https://npm.pkg.github.com/ + scope: '@your-github-username' + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore index fa6a87f..e86962e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ node_modules/ package-lock.json test/ -all.js pas fait/ \ No newline at end of file diff --git a/README.md b/README.md index c2011d1..8638ddf 100644 --- a/README.md +++ b/README.md @@ -17,30 +17,6 @@ A correct and understandable issue contains : You can also join me on my discord server. -# Changelog - -## v0.1.9 -- Added options for the wanted. - - The base image has been updated - - There is now a random price diplayed - - You can now configure a currency -- Added .thomas() - -## v0.1.11 -- Added .tatoo() -- Updated JSDoc - -## v1.1.12 -- Saved all examples to imgur - -## v1.1.13 -- Added example for .tatoo() -- Fixed the litle hole at the top of the users pic on .thomas() - -## v1.1.14 -- Updated .thomas() example - - # Download You can download it from npmjs. @@ -78,7 +54,7 @@ bot.on("message", async (message) => { // Get the avatarUrl of the user let avatar = message.author.displayAvatarURL({ dynamic: false, format: 'png' }); // Make the image - let img = await DIG.delete(avatar) + let img = await DIG.delete().getImage(avatar) // Add the image as an attachement let attach = new Discord.MessageAttachment(img, "delete.png");; message.channel.send(attach) @@ -91,102 +67,154 @@ bot.login("super_secret_token") # Available images -- .blur(``, ``); -![Blur](https://imgur.com/JqpNFTY.png) +## Filters -- .facepalm(``); +- .Blur().getImage(``, ``); -![Facepalm](https://imgur.com/cdPC3P1.png) +![Blur](https://imgur.com/JqpNFTY.png) -- .gay(``); +- .Gay().getImage(``); ![Gay](https://imgur.com/BDTrXzZ.png) -- .rip(``); +- .Greyscale().getImage(``); -![RIP](https://imgur.com/MgsRH8o.png) +![Greyscale](https://imgur.com/h3ahY7Z.png) -- .trash(``); +- .Invert().getImage(``); -![Trash](https://imgur.com/nwAHGgF.png) +![Invert](https://imgur.com/Rl0wGQM.png) -- .circle(``); +- .Sepia().getImage(``); -![Circle](https://imgur.com/0Zo8NYS.png) +![Sepia](https://imgur.com/OTbKVtj.png) -- .greyscale(``); -![Greyscale](https://imgur.com/h3ahY7Z.png) +## Gifs -- .kiss(``, ``); +- .Blink().getImage() -![Kiss](https://imgur.com/sSoCAeH.png) +![Blink](https://imgur.com/JjUXmRU.gif) -- .sepia(``); +- .Triggered().getImage(``); -![Sepia](https://imgur.com/OTbKVtj.png) +![Triggered](https://imgur.com/0QvyYQa.gif) -- .mms(``); -![MMS](https://imgur.com/nH3URHb.png) +## Montage -- .spank(``, ``); +- .Affect().getImage(``); -![Spank](https://imgur.com/VRvogo7.png) +![Affect](https://imgur.com/g4Gaehb.png) -- .color(``); +- .Batslap().getImage(``, ``); -> An hex color is needed, like "#FF0000" +![Batslap](https://imgur.com/oYMpa5A.png) -![Color](https://imgur.com/40tMwfe.png) +- .Beautiful().getImage(``); -- .triggered(``); +![Beautiful](https://imgur.com/HGZkmXo.png) + +- .Bed().getImage(``, ``); -![Triggered](https://imgur.com/0QvyYQa.png) +![Bed](https://imgur.com/b1idSnr.png) -- .hitler(``); +- .Delete().getImage(``); + +![Delete](https://imgur.com/6V1IYJp.png) + +- .Facepalm().getImage(``); + +![Facepalm](https://imgur.com/cdPC3P1.png) + +- .Hitler().getImage(``); ![Hitler](https://imgur.com/wK9puxH.png) -- .batslap(``, ``); +- .Jail().getImage(``); -![Batslap](https://imgur.com/oYMpa5A.png) +![Jail](https://imgur.com/QslACNo.png) -- .bed(``, ``); +- .Kiss().getImage(``, ``); -![Bed](https://imgur.com/b1idSnr.png) +![Kiss](https://imgur.com/sSoCAeH.png) -- .invert(``); +- .Mms().getImage(``); -![Invert](https://imgur.com/Rl0wGQM.png) +![MMS](https://imgur.com/nH3URHb.png) + +- .Rip().getImage(``); + +![RIP](https://imgur.com/MgsRH8o.png) + +- .Spank().getImage(``, ``); -- .wanted(``, ``); +![Spank](https://imgur.com/VRvogo7.png) + +- .Tatoo().getImage(``) + +![Tatoo](https://imgur.com/wJju4UJ.png) + +- .Thomas().getImage(``); + +![Thomas](https://imgur.com/7R37J2j.png) + +- .Trash().getImage(``); + +![Trash](https://imgur.com/nwAHGgF.png) + +- .Wanted().getImage(``, ``); > Currency ($, €, ...) ![Wanted](https://imgur.com/SFGRvSK.png) -- .beautiful(``); -![Beautiful](https://imgur.com/HGZkmXo.png) +## Utils -- .jail(``); +- .Circle().getImage(``); -![Jail](https://imgur.com/QslACNo.png) +![Circle](https://imgur.com/0Zo8NYS.png) -- .affect(``); +- .Color().getImage(``); -![Affect](https://imgur.com/g4Gaehb.png) +> An hex color is needed, like "#FF0000" -- .delete(``); +![Color](https://imgur.com/40tMwfe.png) -![Delete](https://imgur.com/6V1IYJp.png) +# Changelog -- .thomas(``); +## v1.0.0 +- Changed the full structure + - Sorted all files in folders + - Sorted all files in the README +- Fixed .wanted() text bug +- Added .blink() +- Added a timeout options for .triggered() +- Fixed the triggered example not animated +- Added some keywords +- Bumped jimp from ^0.12.1 to ^0.13.0 +- Added workflow to auto publish to npm and github packages on push -![Thomas](https://imgur.com/7R37J2j.png) -- .tatoo(``) +## v0.1.14 +- Updated .thomas() example + +## v0.1.13 +- Added example for .tatoo() +- Fixed the litle hole at the top of the users pic on .thomas() + +## v0.1.12 +- Saved all examples to imgur + +## v0.1.11 +- Added .tatoo() +- Updated JSDoc -![Tatoo](https://imgur.com/wJju4UJ.png) \ No newline at end of file +## v0.1.9 +- Added options for the wanted. + - The base image has been updated + - There is now a random price diplayed + - You can now configure a currency +- Added .thomas() \ No newline at end of file diff --git a/package.json b/package.json index 84d1dcd..f6f78fd 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "discord-image-generation", - "version": "0.1.14", + "version": "1.0.0", "description": "discord-image-generation is a powerfull module that allow you to generate awesome images.", "main": "src/index.js", "scripts": { - "test": "node test/index.js" + "test": "node src/index.js" }, "author": "Mr¤KayJayDee (https://github.com/Mr-KayJayDee)", "license": "MIT", @@ -21,11 +21,16 @@ "images", "generation", "gif", - "manipulation" + "manipulation", + "canvas", + "jimp", + "photo", + "picture", + "drawing" ], "dependencies": { "canvas": "^2.6.1", "gifencoder": "^2.0.1", - "jimp": "^0.12.1" + "jimp": "^0.13.0" } } diff --git a/src/index.js b/src/index.js index 9c69868..ac1b7c8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,2 +1,56 @@ -const DiscordImageGeneration = require("./module/DIG") -module.exports = Object.assign(DiscordImageGeneration) \ No newline at end of file +Blur = require('./module/filters/blur') +Gay = require('./module/filters/gay') +Greyscale = require('./module/filters/greyscale') +Invert = require('./module/filters/invert') +Sepia = require('./module/filters/sepia') + +Triggered = require('./module/gif/triggered') +Blink = require('./module/gif/blink') + +Affect = require('./module/montage/affect') +Batslap = require('./module/montage/batslap') +Beautiful = require('./module/montage/beautiful') +Bed = require('./module/montage/bed') +Delete = require('./module/montage/delete') +Facepalm = require('./module/montage/facepalm') +Hitler = require('./module/montage/hitler') +Jail = require('./module/montage/jail') +Kiss = require('./module/montage/kiss') +Mms = require('./module/montage/mms') +Rip = require('./module/montage/rip') +Spank = require('./module/montage/spank') +Tatoo = require('./module/montage/tatoo') +Thomas = require('./module/montage/thomas') +Trash = require('./module/montage/trash') +Wanted = require('./module/montage/wanted') + +Circle = require('./module/utils/circle') +Color = require('./module/utils/color') + +module.exports = { + Blur, + Gay, + Greyscale, + Invert, + Sepia, + Triggered, + Blink, + Affect, + Batslap, + Beautiful, + Bed, + Delete, + Facepalm, + Hitler, + Jail, + Kiss, + Mms, + Rip, + Spank, + Tatoo, + Thomas, + Trash, + Wanted, + Circle, + Color, +} \ No newline at end of file diff --git a/src/module/DIG.js b/src/module/DIG.js deleted file mode 100644 index 7a38662..0000000 --- a/src/module/DIG.js +++ /dev/null @@ -1,456 +0,0 @@ -const Canvas = require("canvas"); - -const jimp = require("jimp"); - -const GIFEncoder = require("gifencoder"); - -const configure = require('@jimp/custom') - -const circle = require('@jimp/plugin-circle') - -configure({ plugins: [circle] }, jimp); - -class DIG { - - /** - * Beautiful - * @param {image} image - */ - static async beautiful(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let base = await jimp.read(__dirname +"/assets/beautiful.png"); - base.resize(376, 400); - let img = await jimp.read(image); - img.resize(84, 95); - base.composite(img, 258, 28); - base.composite(img, 258, 229); - let raw; - base.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Facepalm - * @param {image} image - */ - static async facepalm(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let canvas = Canvas.createCanvas(632, 357); - let ctx = canvas.getContext("2d"); - ctx.fillStyle = "black"; - ctx.fillRect(0, 0, 632, 357); - let avatar = await Canvas.loadImage(image); - ctx.drawImage(avatar, 199, 112, 235, 235); - let layer = await Canvas.loadImage(__dirname +"/assets/facepalm.png"); - ctx.drawImage(layer, 0, 0, 632, 357); - return canvas.toBuffer(); - } - - /** - * Gay - * @param {image} image - */ - static async gay(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let bg = await Canvas.loadImage(__dirname +"/assets/gay.png"); - let img = await Canvas.loadImage(image); - const canvas = Canvas.createCanvas(480, 480); - const ctx = canvas.getContext("2d"); - ctx.drawImage(img, 0, 0, 480, 480); - ctx.drawImage(bg, 0, 0, 480, 480); - return canvas.toBuffer(); - } - - /** - * Kiss - * @param {image1} image1 - * @param {image2} image2 - */ - static async kiss(image1, image2) { - if (!image1) throw new Error("You must provide an image as a first argument."); - if (!image2) throw new Error("You must provide an image as a second argument."); - let base = await jimp.read(__dirname+"/assets/kiss.png"); - image1 = await jimp.read(image1); - image2 = await jimp.read(image2); - image1.circle(); - image2.circle(); - base.resize(768, 574); - image1.resize(200, 200); - image2.resize(200, 200); - base.composite(image1, 150, 25); - base.composite(image2, 350, 25); - let raw; - base.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Rip - * @param {image} image - */ - static async rip(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - const canvas = Canvas.createCanvas(244, 253); - const ctx = canvas.getContext("2d"); - const background = await Canvas.loadImage(__dirname +"/assets/rip.png"); - ctx.drawImage(background, 0, 0, canvas.width, canvas.height); - const avatar = await Canvas.loadImage(image); - ctx.drawImage(avatar, 63, 110, 90, 90); - return canvas.toBuffer(); - } - - /** - * Spank - * @param {image1} image1 - * @param {image2} image2 - */ - static async spank(image1, image2) { - if (!image1) throw new Error("You must provide an image as a first argument."); - if (!image2) throw new Error("You must provide an image as a second argument."); - let bg = await jimp.read(__dirname +"/assets/spank.png"); - image1 = await jimp.read(image1); - image2 = await jimp.read(image2); - image1.circle(); - image2.circle(); - bg.resize(500, 500); - image1.resize(140, 140); - image2.resize(120, 120); - bg.composite(image2, 350, 220); - bg.composite(image1, 225, 5); - let raw; - bg.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Batslap - * @param {image1} image1 - * @param {image2} image2 - */ - static async batslap(image1, image2) { - if (!image1) throw new Error("You must provide an image as a first argument."); - if (!image2) throw new Error("You must provide an image as a second argument."); - let base = await jimp.read(__dirname+"/assets/batslap.png"); - image1 = await jimp.read(image1); - image2 = await jimp.read(image2); - image1.circle(); - image2.circle(); - base.resize(1000, 500); - image1.resize(220, 220); - image2.resize(200, 200); - base.composite(image2, 580, 260); - base.composite(image1, 350, 70); - let raw; - base.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Affect - * @param {image} image - */ - static async affect(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let base = await jimp.read(__dirname + "/assets/affect.png"); - let img = await jimp.read(image); - img.resize(200, 157); - base.composite(img, 180, 383); - let raw; - base.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Blur - * @param {image} image - * @param {number} level - */ - static async blur(image, level = 5) { - if (!image) throw new Error("You must provide an image as a first argument."); - image = await jimp.read(image); - image.resize(480, 480) - image.blur(isNaN(level) ? 5 : parseInt(level)); - let raw; - image.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Geryscale - * @param {image} image - */ - static async greyscale(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - image = await jimp.read(image); - image.resize(480, 480) - image.greyscale(); - let raw; - image.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Sepia - * @param {image} image - */ - static async sepia(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - image = await jimp.read(image); - image.resize(480, 480) - image.sepia(); - let raw; - image.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Invert - * @param {image} image - */ - static async invert(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - image = await jimp.read(image); - image.resize(480, 480) - image.invert(); - let raw; - image.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Delete - * @param {image} image - */ - static async delete(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let bg = await jimp.read(__dirname + "/assets/delete.png"); - image = await jimp.read(image); - image.resize(195, 195); - bg.composite(image, 120, 135); - let raw; - bg.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Trash - * @param {image} image - */ - static async trash(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let bg = await jimp.read(__dirname +"/assets/trash.png"); - image = await jimp.read(image); - image.resize(309, 309); - image.blur(5); - bg.composite(image, 309, 0); - let raw; - bg.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Color - * @param {color} color - */ - static async color(color = "#FFFFFF") { - const canvas = Canvas.createCanvas(2048, 2048); - const ctx = canvas.getContext("2d"); - ctx.fillStyle = color; - ctx.fillRect(0, 0, canvas.width, canvas.height); - return canvas.toBuffer(); - } - - /** - * Hitler - * @param {image} image - */ - static async hitler(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let bg = await jimp.read(__dirname + "/assets/hitler.png"); - let img = await jimp.read(image); - img.resize(140, 140); - bg.composite(img, 46, 43); - let raw; - bg.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Bed - * @param {image1} image1 - * @param {image2} image2 - */ - static async bed(image1, image2) { - if (!image1) throw new Error("You must provide an image as a first argument."); - if (!image2) throw new Error("You must provide an image as a second argument."); - let bg = await jimp.read(__dirname +"/assets/bed.png"); - image1 = await jimp.read(image1); - image2 = await jimp.read(image2); - image1.circle(); - image2.circle(); - image1.resize(100, 100); - image2.resize(70, 70); - let image3 = image1.clone().resize(70, 70); - bg.composite(image1, 25, 100); - bg.composite(image1, 25, 300); - bg.composite(image3, 53, 450); - bg.composite(image2, 53, 575); - let raw; - bg.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Wanted - * @param {image} image - */ - static async wanted(image, currency) { - if (!image) throw new Error("You must provide an image as a first argument."); - if (!currency) currency = "$" - if (typeof currency != "string") throw new Error("You must provide a string for the currency.") - if (currency.length > 1) throw new Error("You must provide only one character for the currency.") - var price = Math.floor(Math.random() * 1887088) + 329889 - const canvas = Canvas.createCanvas(257, 383); - const ctx = canvas.getContext("2d"); - const avatar = await Canvas.loadImage(image); - const background = await Canvas.loadImage(__dirname +"/assets/wanted.png"); - ctx.drawImage(avatar, 25, 60, 210, 210); - ctx.drawImage(background, 0, 0, 257, 383); - ctx.font = 'Bold 35px Times New Roman' - ctx.fillStyle = "#513d34" - ctx.fillText(price.toLocaleString() + currency, 55, 310) - return canvas.toBuffer(); - } - - /** - * Triggered - * @param {image} image - */ - static async triggered(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - const base = await Canvas.loadImage(__dirname +"/assets/triggered.png"); - const img = await Canvas.loadImage(image); - const GIF = new GIFEncoder(256, 310) - GIF.start(); - GIF.setRepeat(0); - GIF.setDelay(15); - const canvas = Canvas.createCanvas(256, 310); - const ctx = canvas.getContext('2d'); - const BR = 20; - const LR = 10; - for (var i = 0; i < 9; i++) { - ctx.clearRect(0, 0, 256, 310); - ctx.drawImage(img, Math.floor(Math.random() * BR) - BR, Math.floor(Math.random() * BR) - BR, 256 + BR, 310 - 54 + BR); - ctx.fillStyle = '#FF000033'; - ctx.fillRect(0, 0, 256, 310); - ctx.drawImage(base, Math.floor(Math.random() * LR) - LR, 310 - 54 + Math.floor(Math.random() * LR) - LR, 256 + LR, 54 + LR); - GIF.addFrame(ctx); - }; - GIF.finish(); - return GIF.out.getData(); - } - - /** - * Circle - * @param {image} image - */ - static async circle(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - image = await jimp.read(image); - image.resize(480, 480); - image.circle(); - let raw; - image.getBuffer("image/png", (err, buffer) => { - raw = buffer; - }); - return raw; - } - - /** - * Jail - * @param {image} image - */ - static async jail(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let bg = await Canvas.loadImage(__dirname +"/assets/jail.png"); - let img = await Canvas.loadImage(image); - const canvas = Canvas.createCanvas(400, 400); - const ctx = canvas.getContext("2d"); - ctx.drawImage(img, 0, 0, 400, 400); - ctx.drawImage(bg, 0, 0, 400, 400); - return canvas.toBuffer(); - } - - /** - * MMS - * @param {image} image - */ - static async mms(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - let bg = await Canvas.loadImage(__dirname +"/assets/mms.png"); - let img = await Canvas.loadImage(image); - const canvas = Canvas.createCanvas(400, 400); - const ctx = canvas.getContext("2d"); - ctx.drawImage(img, 70, 20, 250, 250); - ctx.drawImage(bg, 0, 0, 400, 400); - return canvas.toBuffer(); - } - - /** - * Thomas - * @param {image} image - */ - static async thomas(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - const canvas = Canvas.createCanvas(841, 1058); - const ctx = canvas.getContext("2d"); - const avatar = await Canvas.loadImage(image); - const background = await Canvas.loadImage(__dirname +"/assets/thomas.png"); - ctx.drawImage(avatar, 220, 190, 400, 400); - ctx.drawImage(background, 0, 0, 841, 1058); - return canvas.toBuffer(); - } - - /** - * Tatoo - * @param {image} image - */ - static async tatoo(image) { - if (!image) throw new Error("You must provide an image as a first argument."); - const canvas = Canvas.createCanvas(750, 1089); - const ctx = canvas.getContext("2d"); - const avatar = await Canvas.loadImage(image); - const background = await Canvas.loadImage(__dirname +"/assets/tatoo.png"); - ctx.drawImage(avatar, 145, 575, 400, 400); - ctx.drawImage(background, 0, 0, 750, 1089); - return canvas.toBuffer(); - } -} - -module.exports = DIG; diff --git a/src/module/filters/blur.js b/src/module/filters/blur.js new file mode 100644 index 0000000..0b7e075 --- /dev/null +++ b/src/module/filters/blur.js @@ -0,0 +1,20 @@ +const jimp = require("jimp"); + +module.exports = class Blur { + /** + * Blur + * @param {image} image + * @param {level} level + */ + async getImage(image, level) { + if (!image) throw new Error(`You must provide an image.`); + image = await jimp.read(image); + image.resize(480, 480) + image.blur(isNaN(level) ? 5 : parseInt(level)); + let raw; + image.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/filters/gay.js b/src/module/filters/gay.js new file mode 100644 index 0000000..66c8ad1 --- /dev/null +++ b/src/module/filters/gay.js @@ -0,0 +1,18 @@ +const Canvas = require("canvas"); + +module.exports = class Gay { + /** + * Gay + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + let bg = await Canvas.loadImage(`../src/module/assets/gay.png`); + let img = await Canvas.loadImage(image); + const canvas = Canvas.createCanvas(480, 480); + const ctx = canvas.getContext(`2d`); + ctx.drawImage(img, 0, 0, 480, 480); + ctx.drawImage(bg, 0, 0, 480, 480); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/filters/greyscale.js b/src/module/filters/greyscale.js new file mode 100644 index 0000000..ffa7c7c --- /dev/null +++ b/src/module/filters/greyscale.js @@ -0,0 +1,19 @@ +const jimp = require("jimp"); + +module.exports = class Geryscale { + /** + * Greyscale + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + image = await jimp.read(image); + image.resize(480, 480) + image.greyscale(); + let raw; + image.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/filters/invert.js b/src/module/filters/invert.js new file mode 100644 index 0000000..645611e --- /dev/null +++ b/src/module/filters/invert.js @@ -0,0 +1,19 @@ +const jimp = require("jimp"); + +module.exports = class Invert { + /** + * Invert + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + image = await jimp.read(image); + image.resize(480, 480) + image.invert(); + let raw; + image.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/filters/sepia.js b/src/module/filters/sepia.js new file mode 100644 index 0000000..94a1d81 --- /dev/null +++ b/src/module/filters/sepia.js @@ -0,0 +1,19 @@ +const jimp = require("jimp"); + +module.exports = class Sepia { + /** + * Sepia + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + image = await jimp.read(image); + image.resize(480, 480) + image.sepia(); + let raw; + image.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/functions.js b/src/module/functions.js new file mode 100644 index 0000000..dbadc2d --- /dev/null +++ b/src/module/functions.js @@ -0,0 +1,18 @@ +module.exports = { + /** + * Crate a responsive on the text + * Code from https://discordjs.guide/popular-topics/canvas.html#adding-in-text + * @param {object} canvas the canvas object + * @param {string} text the text + * @param {number} defaultFontSize the default font size + * @param {number} width the default width + * @param {string} font the font + */ + applyText(canvas, text, defaultFontSize, width, font) { + const ctx = canvas.getContext("2d"); + do { + ctx.font = `${(defaultFontSize -= 1)-3}px ${font}`; + } while (ctx.measureText(text).width > width); + return ctx.font; + } +} \ No newline at end of file diff --git a/src/module/gif/blink.js b/src/module/gif/blink.js new file mode 100644 index 0000000..1775b24 --- /dev/null +++ b/src/module/gif/blink.js @@ -0,0 +1,38 @@ +const Canvas = require(`canvas`); + +const GIFEncoder = require(`gifencoder`); + +module.exports = class Blink { + /** + * Blink + * @param {image} image1 + * @param {image} image2 + * @param {number} timeout + * @param {number} height For later + * @param {number} width For later + */ + async getImage(image1, image2, timeout = 1000, height, width) { + if (!image1) throw new Error(`You must provide an image as a first argument.`); + if (!image2) throw new Error(`You must provide an image as a second argument.`); + if (isNaN(timeout)) throw new Error(`The timeout argument must be a number.`) + const img = await Canvas.loadImage(image1); + const base = await Canvas.loadImage(image2); + const GIF = new GIFEncoder(480, 480) + GIF.start(); + GIF.setRepeat(0); + GIF.setDelay(timeout); + GIF.setTransparent(); + const canvas = Canvas.createCanvas(480, 480); + const ctx = canvas.getContext('2d'); + ctx.clearRect(0, 0, 480, 480); + ctx.drawImage(img, 0, 0, 480, 480); + GIF.addFrame(ctx); + const ctx2 = canvas.getContext('2d'); + ctx2.clearRect(0, 0, 480, 480); + ctx2.drawImage(base, 0, 0, 480, 480); + GIF.addFrame(ctx2) + GIF.finish(); + console.log(GIF.out.getData()) + return GIF.out.getData(); + } +} \ No newline at end of file diff --git a/src/module/gif/triggered.js b/src/module/gif/triggered.js new file mode 100644 index 0000000..1a6bcb2 --- /dev/null +++ b/src/module/gif/triggered.js @@ -0,0 +1,35 @@ +const Canvas = require(`canvas`); + +const GIFEncoder = require(`gifencoder`); + +module.exports = class Triggered { + /** + * Triggered + * @param {image} image + * @param {number} timeout + */ + async getImage(image, timeout = 15) { + if (!image) throw new Error(`You must provide an image.`); + if (isNaN(timeout)) throw new Error(`The timeout argument must be a number.`) + const base = await Canvas.loadImage(`../src/module/assets/triggered.png`); + const img = await Canvas.loadImage(image); + const GIF = new GIFEncoder(256, 310) + GIF.start(); + GIF.setRepeat(0); + GIF.setDelay(timeout); + const canvas = Canvas.createCanvas(256, 310); + const ctx = canvas.getContext('2d'); + const BR = 20; + const LR = 10; + for (var i = 0; i < 9; i++) { + ctx.clearRect(0, 0, 256, 310); + ctx.drawImage(img, Math.floor(Math.random() * BR) - BR, Math.floor(Math.random() * BR) - BR, 256 + BR, 310 - 54 + BR); + ctx.fillStyle = '#FF000033'; + ctx.fillRect(0, 0, 256, 310); + ctx.drawImage(base, Math.floor(Math.random() * LR) - LR, 310 - 54 + Math.floor(Math.random() * LR) - LR, 256 + LR, 54 + LR); + GIF.addFrame(ctx); + }; + GIF.finish(); + return GIF.out.getData(); + } +} \ No newline at end of file diff --git a/src/module/montage/affect.js b/src/module/montage/affect.js new file mode 100644 index 0000000..436ff15 --- /dev/null +++ b/src/module/montage/affect.js @@ -0,0 +1,20 @@ +const jimp = require("jimp"); + +module.exports = class Affect { + /** + * Affect + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error("You must provide an image."); + let base = await jimp.read(`../src/module/assets/affect.png`); + let img = await jimp.read(image); + img.resize(200, 157); + base.composite(img, 180, 383); + let raw; + base.getBuffer("image/png", (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/batslap.js b/src/module/montage/batslap.js new file mode 100644 index 0000000..946682c --- /dev/null +++ b/src/module/montage/batslap.js @@ -0,0 +1,28 @@ +const jimp = require("jimp"); + +module.exports = class Batslap { + /** + * Batslap + * @param {image} image1 + * @param {image} image2 + */ + async getImage(image1, image2) { + if (!image1) throw new Error("You must provide an image as a first argument."); + if (!image2) throw new Error("You must provide an image as a second argument."); + let base = await jimp.read(`../src/module/assets/batslap.png`); + image1 = await jimp.read(image1); + image2 = await jimp.read(image2); + image1.circle(); + image2.circle(); + base.resize(1000, 500); + image1.resize(220, 220); + image2.resize(200, 200); + base.composite(image2, 580, 260); + base.composite(image1, 350, 70); + let raw; + base.getBuffer("image/png", (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/beautiful.js b/src/module/montage/beautiful.js new file mode 100644 index 0000000..6b5355f --- /dev/null +++ b/src/module/montage/beautiful.js @@ -0,0 +1,22 @@ +const jimp = require("jimp"); + +module.exports = class Beautiful { + /** + * Beautiful + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error("You must provide an image."); + let base = await jimp.read(`../src/module/assets/beautiful.png`); + base.resize(376, 400); + let img = await jimp.read(image); + img.resize(84, 95); + base.composite(img, 258, 28); + base.composite(img, 258, 229); + let raw; + base.getBuffer("image/png", (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/bed.js b/src/module/montage/bed.js new file mode 100644 index 0000000..a16186b --- /dev/null +++ b/src/module/montage/bed.js @@ -0,0 +1,30 @@ +const jimp = require("jimp"); + +module.exports = class Bed { + /** + * Bed + * @param {image} image1 + * @param {image} image2 + */ + async getImage(image1, image2) { + if (!image1) throw new Error(`You must provide an image as a first argument.`); + if (!image2) throw new Error(`You must provide an image as a second argument.`); + let bg = await jimp.read(`../src/module/assets/bed.png`); + image1 = await jimp.read(image1); + image2 = await jimp.read(image2); + image1.circle(); + image2.circle(); + image1.resize(100, 100); + image2.resize(70, 70); + let image3 = image1.clone().resize(70, 70); + bg.composite(image1, 25, 100); + bg.composite(image1, 25, 300); + bg.composite(image3, 53, 450); + bg.composite(image2, 53, 575); + let raw; + bg.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/delete.js b/src/module/montage/delete.js new file mode 100644 index 0000000..fb4fdc4 --- /dev/null +++ b/src/module/montage/delete.js @@ -0,0 +1,20 @@ +const jimp = require("jimp"); + +module.exports = class Delete { + /** + * Delete + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + let bg = await jimp.read(`../src/module/assets/delete.png`); + image = await jimp.read(image); + image.resize(195, 195); + bg.composite(image, 120, 135); + let raw; + bg.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/facepalm.js b/src/module/montage/facepalm.js new file mode 100644 index 0000000..93bb6fc --- /dev/null +++ b/src/module/montage/facepalm.js @@ -0,0 +1,20 @@ +const Canvas = require("canvas"); + +module.exports = class Facepalm { + /** + * Facepalm + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error("You must provide an image."); + let canvas = Canvas.createCanvas(632, 357); + let ctx = canvas.getContext("2d"); + ctx.fillStyle = "black"; + ctx.fillRect(0, 0, 632, 357); + let avatar = await Canvas.loadImage(image); + ctx.drawImage(avatar, 199, 112, 235, 235); + let layer = await Canvas.loadImage(`../src/module/assets/facepalm.png`); + ctx.drawImage(layer, 0, 0, 632, 357); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/montage/hitler.js b/src/module/montage/hitler.js new file mode 100644 index 0000000..1e4f901 --- /dev/null +++ b/src/module/montage/hitler.js @@ -0,0 +1,20 @@ +const jimp = require("jimp"); + +module.exports = class Hitler { + /** + * Hitler + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + let bg = await jimp.read(`../src/module/assets/hitler.png`); + let img = await jimp.read(image); + img.resize(140, 140); + bg.composite(img, 46, 43); + let raw; + bg.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/jail.js b/src/module/montage/jail.js new file mode 100644 index 0000000..541f047 --- /dev/null +++ b/src/module/montage/jail.js @@ -0,0 +1,18 @@ +const Canvas = require("canvas"); + +module.exports = class Jail { + /** + * Jail + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + let bg = await Canvas.loadImage(`../src/module/assets/jail.png`); + let img = await Canvas.loadImage(image); + const canvas = Canvas.createCanvas(400, 400); + const ctx = canvas.getContext(`2d`); + ctx.drawImage(img, 0, 0, 400, 400); + ctx.drawImage(bg, 0, 0, 400, 400); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/montage/kiss.js b/src/module/montage/kiss.js new file mode 100644 index 0000000..c86e729 --- /dev/null +++ b/src/module/montage/kiss.js @@ -0,0 +1,28 @@ +const jimp = require("jimp"); + +module.exports = class Kiss { + /** + * Kiss + * @param {image} image1 + * @param {image} image2 + */ + async getImage(image1, image2) { + if (!image1) throw new Error(`You must provide an image as a first argument.`); + if (!image2) throw new Error(`You must provide an image as a second argument.`); + let base = await jimp.read(`../src/module/assets/kiss.png`); + image1 = await jimp.read(image1); + image2 = await jimp.read(image2); + image1.circle(); + image2.circle(); + base.resize(768, 574); + image1.resize(200, 200); + image2.resize(200, 200); + base.composite(image1, 150, 25); + base.composite(image2, 350, 25); + let raw; + base.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/mms.js b/src/module/montage/mms.js new file mode 100644 index 0000000..55c0eae --- /dev/null +++ b/src/module/montage/mms.js @@ -0,0 +1,18 @@ +const Canvas = require("canvas"); + +module.exports = class Mms { + /** + * MMS + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + let bg = await Canvas.loadImage(`../src/module/assets/mms.png`); + let img = await Canvas.loadImage(image); + const canvas = Canvas.createCanvas(400, 400); + const ctx = canvas.getContext(`2d`); + ctx.drawImage(img, 60, 10, 270, 270); + ctx.drawImage(bg, 0, 0, 400, 400); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/montage/rip.js b/src/module/montage/rip.js new file mode 100644 index 0000000..c6c281b --- /dev/null +++ b/src/module/montage/rip.js @@ -0,0 +1,20 @@ +const Canvas = require("canvas"); +const jimp = require("jimp"); + +module.exports = class Rip { + /** + * Rip + * @param {image} image + */ + + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + const canvas = Canvas.createCanvas(244, 253); + const ctx = canvas.getContext(`2d`); + const background = await Canvas.loadImage(`../src/module/assets/rip.png`); + ctx.drawImage(background, 0, 0, canvas.width, canvas.height); + const avatar = await Canvas.loadImage(image); + ctx.drawImage(avatar, 63, 110, 90, 90); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/montage/spank.js b/src/module/montage/spank.js new file mode 100644 index 0000000..676233d --- /dev/null +++ b/src/module/montage/spank.js @@ -0,0 +1,28 @@ +const jimp = require("jimp"); + +module.exports = class Spank { + /** + * + * @param {image} image1 + * @param {image} image2 + */ + async getImage(image1, image2) { + if (!image1) throw new Error(`You must provide an image as a first argument.`); + if (!image2) throw new Error(`You must provide an image as a second argument.`); + let bg = await jimp.read(`../src/module/assets/spank.png`); + image1 = await jimp.read(image1); + image2 = await jimp.read(image2); + image1.circle(); + image2.circle(); + bg.resize(500, 500); + image1.resize(140, 140); + image2.resize(120, 120); + bg.composite(image2, 350, 220); + bg.composite(image1, 225, 5); + let raw; + bg.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/tatoo.js b/src/module/montage/tatoo.js new file mode 100644 index 0000000..426e2c3 --- /dev/null +++ b/src/module/montage/tatoo.js @@ -0,0 +1,18 @@ +const Canvas = require("canvas"); + +module.exports = class Tatoo { + /** + * Tatoo + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + const canvas = Canvas.createCanvas(750, 1089); + const ctx = canvas.getContext(`2d`); + const avatar = await Canvas.loadImage(image); + const background = await Canvas.loadImage(`../src/module/assets/tatoo.png`); + ctx.drawImage(avatar, 145, 575, 400, 400); + ctx.drawImage(background, 0, 0, 750, 1089); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/montage/thomas.js b/src/module/montage/thomas.js new file mode 100644 index 0000000..a50f75e --- /dev/null +++ b/src/module/montage/thomas.js @@ -0,0 +1,18 @@ +const Canvas = require("canvas"); + +module.exports = class Thomas { + /** + * Thomas + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + const canvas = Canvas.createCanvas(841, 1058); + const ctx = canvas.getContext(`2d`); + const avatar = await Canvas.loadImage(image); + const background = await Canvas.loadImage(`../src/module/assets/thomas.png`); + ctx.drawImage(avatar, 220, 190, 400, 400); + ctx.drawImage(background, 0, 0, 841, 1058); + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/montage/trash.js b/src/module/montage/trash.js new file mode 100644 index 0000000..c410fd0 --- /dev/null +++ b/src/module/montage/trash.js @@ -0,0 +1,21 @@ +const jimp = require("jimp"); + +module.exports = class Trash { + /** + * Trash + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + let bg = await jimp.read(`../src/module/assets/trash.png`); + image = await jimp.read(image); + image.resize(309, 309); + image.blur(5); + bg.composite(image, 309, 0); + let raw; + bg.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/montage/wanted.js b/src/module/montage/wanted.js new file mode 100644 index 0000000..9f17ca7 --- /dev/null +++ b/src/module/montage/wanted.js @@ -0,0 +1,27 @@ +const Canvas = require("canvas"); +const { + applyText +} = require(`../functions`); + +module.exports = class Wanted { + /** + * Wanted + * @param {image} image + */ + async getImage(image, currency = "$") { + if (!image) throw new Error(`You must provide an image.`); + if (typeof currency != `string`) throw new Error(`You must provide a string for the currency.`) + if (currency.length > 1) throw new Error(`You must provide only one character for the currency.`) + var price = Math.floor(Math.random() * 188708) + 329889 + const canvas = Canvas.createCanvas(257, 383); + const ctx = canvas.getContext(`2d`); + const avatar = await Canvas.loadImage(image); + const background = await Canvas.loadImage(`../src/module/assets/wanted.png`); + ctx.drawImage(avatar, 25, 60, 210, 210); + ctx.drawImage(background, 0, 0, 257, 383); + ctx.font = applyText(canvas, price.toLocaleString() + currency, 40, 200, "Times New Roman"); + ctx.fillStyle = `#513d34` + ctx.fillText(price.toLocaleString() + currency, 54, 320) + return canvas.toBuffer(); + } +} \ No newline at end of file diff --git a/src/module/utils/circle.js b/src/module/utils/circle.js new file mode 100644 index 0000000..7ba7d8c --- /dev/null +++ b/src/module/utils/circle.js @@ -0,0 +1,19 @@ +const jimp = require("jimp"); + +module.exports = class Circle { + /** + * Circle + * @param {image} image + */ + async getImage(image) { + if (!image) throw new Error(`You must provide an image.`); + image = await jimp.read(image); + image.resize(480, 480); + image.circle(); + let raw; + image.getBuffer(`image/png`, (err, buffer) => { + raw = buffer; + }); + return raw; + } +} \ No newline at end of file diff --git a/src/module/utils/color.js b/src/module/utils/color.js new file mode 100644 index 0000000..c250ac0 --- /dev/null +++ b/src/module/utils/color.js @@ -0,0 +1,15 @@ +const Canvas = require("canvas"); + +module.exports = class Color { + /** + * Color + * @param {string} color + */ + async getImage(color = `#FFFFFF`) { + const canvas = Canvas.createCanvas(2048, 2048); + const ctx = canvas.getContext(`2d`); + ctx.fillStyle = color; + ctx.fillRect(0, 0, canvas.width, canvas.height); + return canvas.toBuffer(); + } +} \ No newline at end of file