diff --git a/assets/pages/help.pug b/assets/pages/help.pug deleted file mode 100644 index 98d35fb..0000000 --- a/assets/pages/help.pug +++ /dev/null @@ -1,98 +0,0 @@ -head - title esmBot Command List - meta(name='viewport' content='width=device-width, initial-scale=1') - meta(name='description' content='The command list for esmBot') - meta(property='og:title' content='esmBot Command List') - meta(property='og:site_name' content='esmBot') - meta(property='og:url' content='https://projectlounge.pw/esmBot/help.html') - meta(property='og:description' content='This is the command list for esmBot.') - meta(property='og:type' content='object') - meta(property='og:image' content='https://raw.githubusercontent.com/TheEssem/esmBot/master/esmbot.png') - meta(charset='UTF-8') - link(rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/2.10.0/github-markdown.min.css') - style. - .markdown-body { - box-sizing: border-box; - min-width: 200px; - max-width: 980px; - margin: 0 auto; - padding: 45px; - } - @media (max-width: 767px) { - .markdown-body { - padding: 15px; - } - } -body - article#markdown.markdown-body - h1#img-srchttpsrawgithubusercontentcomtheessemesmbotmasteresmbotpng-width64-esmbot-dev-command-list - img(src='https://raw.githubusercontent.com/TheEssem/esmBot/master/esmbot.png' width='64') - | esmBot Command List - if dev - p - strong - | You are currently using esmBot Dev! Things may change at any time without warning and there will be bugs. Many bugs. If you find one, - a(href='https://github.com/TheEssem/esmBot/issues') report it here - | or in the esmBot Support server. - p - code [] - | means an argument is required, - code {} - | means an argument is optional. - p - | Default prefix is - code & - | . - blockquote - p - | Tip: You can get more info about a command by using - code help [command] - | . - h2#table-of-contents Table of Contents - ul - li - a(href='#general') - strong General - li - a(href='#moderation') - strong Moderation - li - a(href='#tags') - strong Tags - li - a(href='#fun') - strong Fun - li - a(href='#images') - strong Image Editing - li - a(href='#soundboard') - strong Soundboard - h2(id='general') 💻 General - each command in commands.general - ul - li!= command - h2(id='moderation') 🔨 Moderation - each command in commands.moderation - ul - li!= command - h2(id='tags') 🏷️ Tags - blockquote - p Every command in this category is a subcommand of the tag command. - each command in commands.tags - ul - li!= command - h2(id='fun') 👌 Fun - each command in commands.fun - ul - li!= command - h2(id='images') 🖼️ Image Editing - blockquote - p These commands support the PNG, JPEG, and WEBP formats. - each command in commands.images - ul - li!= command - h2(id='soundboard') 🔊 Soundboard - each command in commands.soundboard - ul - li!= command \ No newline at end of file diff --git a/commands/meme.js b/commands/meme.js index 4501faf..f82dd27 100644 --- a/commands/meme.js +++ b/commands/meme.js @@ -1,30 +1,33 @@ -const { spawn } = require("child_process"); +const gm = require("gm").subClass({ + imageMagick: true +}); +const gmToBuffer = require("../utils/gmbuffer.js"); exports.run = async (message, args) => { message.channel.sendTyping(); const image = await require("../utils/imagedetect.js")(message); if (image === undefined) return `${message.author.mention}, you need to provide an image to generate a meme!`; - if (image.type === "gif") return `${message.author.mention}, this command doesn't work with GIFs!`; if (args.length === 0) return `${message.author.mention}, you need to provide some text to generate a meme!`; const [topText, bottomText] = args.join(" ").split(",").map(elem => elem.trim()); - const child = spawn("./utils/meme.sh", [topText.toUpperCase().replace(/\\/g, "\\\\"), bottomText ? bottomText.toUpperCase().replace(/\\/g, "\\\\") : ""]); - child.stdin.write(image.data); - child.stdin.end(); - const chunks = []; - child.stdout.on("data", (data) => { - chunks.push(data); - }); - child.once("error", (error) => { + const file = `/tmp/${Math.random().toString(36).substring(2, 15)}.${image.type}`; + const file2 = `/tmp/${Math.random().toString(36).substring(2, 15)}.png`; + const file3 = `/tmp/${Math.random().toString(36).substring(2, 15)}.png`; + gm(image.data).resize(600, 600).noProfile().write(file, (error) => { if (error) throw error; - }); - child.stderr.once("data", (error) => { - if (error) throw new Error(error.toString()); - }); - child.stdout.once("close", () => { - const data = Buffer.concat(chunks); - return message.channel.createMessage("", { - file: data, - name: "meme.png" + gm(file).size((error, size) => { + if (error) throw error; + gm().out("-size", size.width).background("none").gravity("Center").out("(", "(").font("Impact").out("-pointsize", 40).out(`pango:${topText.toUpperCase()}`).out(")", "(", "+clone").out("-channel", "A").out("-morphology", "EdgeOut", "Octagon", "+channel", "+level-colors", "black", ")").compose("DstOver").out(")", "-composite").write(file2, (error) => { + if (error) throw error; + gm().out("-size", size.width).background("none").gravity("Center").out("(", "(").font("Impact").out("-pointsize", 40).out(`pango:${bottomText ? bottomText.toUpperCase() : " "}`).out(")", "(", "+clone").out("-channel", "A").out("-morphology", "EdgeOut", "Octagon", "+channel", "+level-colors", "black", ")").compose("DstOver").out(")", "-composite").write(file3, async (error) => { + if (error) throw error; + const data = gm(file).coalesce().out("null:").gravity("North").out(file2).out("-layers", "composite").out("null:").gravity("South").out(file3).out("-layers", "composite").out("-layers", "optimize"); + const resultBuffer = await gmToBuffer(data); + return message.channel.createMessage("", { + file: resultBuffer, + name: `meme.${image.type}` + }); + }); + }); }); }); }; diff --git a/utils/meme.sh b/utils/meme.sh index d939ba5..e1cd078 100755 --- a/utils/meme.sh +++ b/utils/meme.sh @@ -1,12 +1,24 @@ +file=$(mktemp /tmp/XXXXXXXXXXXXXXXXXXXXXX.png) newfile=$(mktemp /tmp/XXXXXXXXXXXXXXXXXXXXXX.png) -convert - -resize 600x600 +profile "*" $newfile -SIZE=$(identify -format "%[fx:w]x%[fx:h]" $newfile) -convert $newfile \ - -gravity north \ - \( -size $SIZE -background none -font "./assets/ImpactMix.ttf" -pointsize 50 -stroke black -strokewidth 3 caption:"$1" \) -composite \ - \( -size $SIZE -background none -font "./assets/ImpactMix.ttf" -pointsize 50 -fill white -stroke none caption:"$1" \) -composite \ - -gravity south \ - \( -size $SIZE -background none -font "./assets/ImpactMix.ttf" -pointsize 50 -stroke black -strokewidth 3 caption:"$2" \) -composite \ - \( -size $SIZE -background none -font "./assets/ImpactMix.ttf" -pointsize 50 -fill white -stroke none caption:"$2" \) -composite\ - - +newfile2=$(mktemp /tmp/XXXXXXXXXXXXXXXXXXXXXX.png) +convert - -resize 600x600 +profile "*" $file +SIZE=$(identify -format "%[fx:w]" $file) +convert \ + -size $SIZE -background none -gravity center \ + \( \( -font Impact -pointsize 40 pango:"$1" \) \ + \( +clone -channel A -morphology EdgeOut Octagon +channel +level-colors black \) -compose DstOver \) -composite \ + $newfile +if ! [ -z "$2" ] +then +convert \ + -size $SIZE -background none -gravity center \ + \( \( -font Impact -pointsize 40 pango:"$2" \) \ + \( +clone -channel A -morphology EdgeOut Octagon +channel +level-colors black \) -compose DstOver \) -composite \ + $newfile2 +convert $file -coalesce null: -gravity north $newfile -layers composite null: -gravity south $newfile2 -layers composite -layers optimize - +exit 0 +fi +convert $file -coalesce null: -gravity north $newfile -layers composite -layers optimize - +rm $file rm $newfile +rm $newfile2 \ No newline at end of file