From 4fb8eb498977ab4ec71957b3508d6fd8db2a5ed1 Mon Sep 17 00:00:00 2001 From: TheEssem Date: Tue, 7 Jan 2020 19:17:04 -0600 Subject: [PATCH] Added support for GIFs in image commands, added caption --- assets/caption.otf | Bin 0 -> 26412 bytes commands/caption.js | 35 +++++++++++++++++++++++++++++++++++ commands/meme.js | 1 + utils/help.js | 4 ++-- utils/imagedetect.js | 2 +- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 assets/caption.otf create mode 100644 commands/caption.js diff --git a/assets/caption.otf b/assets/caption.otf new file mode 100644 index 0000000000000000000000000000000000000000..5dab3cd2963fa67d95e4ea5f8eab2aef5e80df18 GIT binary patch literal 26412 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 Rmw|!d{}j+&Gf;h4C;)f5UlRZT literal 0 HcmV?d00001 diff --git a/commands/caption.js b/commands/caption.js new file mode 100644 index 00000000..976983d6 --- /dev/null +++ b/commands/caption.js @@ -0,0 +1,35 @@ +const fs = require("fs"); +const gm = require("gm").subClass({ + imageMagick: true +}); +const gmToBuffer = require("../utils/gmbuffer.js"); + +exports.run = async (message, args) => { + const image = await require("../utils/imagedetect.js")(message); + if (image === undefined) return `${message.author.mention}, you need to provide an image/GIF to add a caption!`; + const path = `/tmp/${Math.random().toString(36).substring(2, 15)}.${image.type}`; + const processMessage = await message.channel.createMessage(" Processing... This might take a while"); + require("util").promisify(fs.writeFile)(path, image.data); + gm(image.data).size(async (error, size) => { + if (error) throw error; + const command = gm().out("-size", `${size.width}x`).background("white").fill("black").font("./assets/caption.otf", size.width / 10).gravity("Center").out(`caption:${args.join(" ")}`); + const output = await gmToBuffer(command, "png"); + gm(output).size(async (error, size2) => { + if (error) throw error; + gm(output).gravity("Center").trim().out("+repage").extent(size.width, size2.height + (size.width / 10)).stream(async (error, output2) => { + if (error) throw error; + const command3 = gm(output2).out("-alpha", "set").background("none").out("(").out(path).out("-coalesce").out(")").out("-set", "page", "%[fx:u.w]x%[fx:u.h+v.h]+%[fx:t?(u.w-v.w)/2:0]+%[fx:t?u.h:0]").out("-coalesce").out("null:").out("-insert", 1).out("-layers", "composite").out("-loop", "0"); + const outputFinal = await gmToBuffer(command3, image.type); + await processMessage.delete(); + return message.channel.createMessage("", { + file: outputFinal, + name: `caption.${image.type}` + }); + }); + }); + }); +}; + +exports.aliases = ["gifc", "gcaption", "ifcaption", "ifunnycaption"]; +exports.category = 5; +exports.help = "Adds a caption to an image/GIF"; \ No newline at end of file diff --git a/commands/meme.js b/commands/meme.js index 399f8221..4501faf2 100644 --- a/commands/meme.js +++ b/commands/meme.js @@ -4,6 +4,7 @@ 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, "\\\\") : ""]); diff --git a/utils/help.js b/utils/help.js index c12ee9ee..f672f935 100644 --- a/utils/help.js +++ b/utils/help.js @@ -7,7 +7,7 @@ ${process.env.NODE_ENV === "development" ? "\n**You are currently using esmBot D Default prefix is \`&\`. -> Tip: Use Ctrl+F to find the command you want! +> Tip: You can get more info about a command by using \`help [command]\`. ## Table of Contents + [**General**](#💻-general) @@ -25,7 +25,7 @@ module.exports = async (output) => { moderation: ["## 🔨 Moderation"], tags: ["## 🏷️ Tags"], fun: ["## 👌 Fun"], - images: ["## 🖼️ Image Editing", "> These commands support the PNG, JPEG, and WEBP formats."], + images: ["## 🖼️ Image Editing", "> These commands support the PNG, JPEG, WEBP, and GIF formats. (GIF support is currently experimental)"], soundboard: ["## 🔊 Soundboard"] }; for (const command of commands) { diff --git a/utils/imagedetect.js b/utils/imagedetect.js index d5c27afe..b748c758 100644 --- a/utils/imagedetect.js +++ b/utils/imagedetect.js @@ -11,7 +11,7 @@ const typeCheck = async (image) => { // get the file type const imageType = fileType(imageBuffer); // check if the file is a jpeg, png, or webp - if (imageType && ["image/jpeg", "image/png", "image/webp"].includes(imageType.mime)) { + if (imageType && ["image/jpeg", "image/png", "image/webp", "image/gif"].includes(imageType.mime)) { // if it is, then return the url with the file type return { type: imageType.ext, -- 2.51.2