mrmBot-Matrix/utils/imagedetect.js

79 lines
3 KiB
JavaScript
Raw Normal View History

2019-09-13 20:02:41 +00:00
const fetch = require("node-fetch");
const fileType = require("file-type");
const writeFile = require("util").promisify(require("fs").writeFile);
const urlRegex = /(?:\w+:)?\/\/(\S+)/;
2019-09-13 20:02:41 +00:00
// this checks if the file is, in fact, an image
const typeCheck = async (image, gifv = false) => {
2019-09-13 20:02:41 +00:00
// download the file to a buffer
const imageRequest = await fetch(image);
const imageBuffer = await imageRequest.buffer();
try {
// get the file type
2020-01-19 15:40:40 +00:00
const imageType = await fileType.fromBuffer(imageBuffer);
2019-09-13 20:02:41 +00:00
// check if the file is a jpeg, png, or webp
const formats = ["image/jpeg", "image/png", "image/webp", "image/gif"];
if (gifv) formats.push("video/mp4");
if (imageType && formats.includes(imageType.mime)) {
2019-09-13 20:02:41 +00:00
// if it is, then return the url with the file type
const path = `/tmp/${Math.random().toString(36).substring(2, 15)}.${imageType.ext}`;
await writeFile(path, imageBuffer);
2019-09-13 20:02:41 +00:00
return {
type: imageType.ext,
data: imageBuffer,
outputType: imageType.ext === "mp4" ? "gif" : imageType.ext,
path: path
2019-09-13 20:02:41 +00:00
};
} else {
// if not, then return false
return false;
2019-09-13 20:02:41 +00:00
}
} catch (error) {
throw error;
2019-09-13 20:02:41 +00:00
}
};
// this checks for the latest message containing an image and returns the url of the image
module.exports = async (cmdMessage) => {
// we start by getting the messages
const messages = await cmdMessage.channel.getMessages();
// iterate over each message
for (const message of messages) {
// check the attachments first
if (message.embeds.length !== 0) {
// embeds can have 2 possible entries with images, we check the thumbnail first
if (message.embeds[0].type === "gifv") {
const type = await typeCheck(message.embeds[0].video.url, true);
if (type === false) continue;
return type;
} else if (message.embeds[0].thumbnail) {
const type = await typeCheck(message.embeds[0].thumbnail.url);
if (type === false) continue;
return type;
// if there isn't a thumbnail check the image area
} else if (message.embeds[0].image) {
const type = await typeCheck(message.embeds[0].image.url);
if (type === false) continue;
return type;
}
} else if (message.attachments.length !== 0) {
2019-09-13 20:02:41 +00:00
// get type of file
const type = await typeCheck(message.attachments[0].url);
// move to the next message if the file isn't an image
if (type === false) continue;
2019-09-13 20:02:41 +00:00
// if the file is an image then return it
return type;
// if there's nothing in the attachments check the urls in the message if there are any
} else if (urlRegex.test(message.content)) {
// get url
const url = message.content.match(urlRegex);
// get type of file
const type = await typeCheck(url[0]);
// move to the next message if the file isn't an image
if (type === false) continue;
// if the file is an image then return it
return type;
// if there's no urls then check the embeds
2019-09-13 20:02:41 +00:00
}
}
};