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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�~;bbSJpLrFHjxg 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 { + 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 399f822..4501faf 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 c12ee9e..f672f93 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 d5c27af..b748c75 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,