Added initial support for detecting videos, prevent music messages from showing on soundboard commands, fixed(?) permission checking

This commit is contained in:
TheEssem 2021-04-19 09:31:39 -05:00
parent 8aa0cc2163
commit c67499af9d
6 changed files with 26 additions and 22 deletions

View file

@ -4,7 +4,8 @@ const Command = require("../../classes/command.js");
class ChannelCommand extends Command { class ChannelCommand extends Command {
async run() { async run() {
if (!this.message.channel.guild) return `${this.message.author.mention}, this command only works in servers!`; if (!this.message.channel.guild) return `${this.message.author.mention}, this command only works in servers!`;
if (!this.message.member.permissions.has("administrator") && this.message.member.id !== process.env.OWNER) return `${this.message.author.mention}, you need to be an administrator to enable/disable me!`; console.log(this.message.member.permission);
if (!this.message.member.permission.has("administrator") && this.message.member.id !== process.env.OWNER) return `${this.message.author.mention}, you need to be an administrator to enable/disable me!`;
if (this.args.length === 0) return `${this.message.author.mention}, you need to provide whether I should be enabled or disabled in this channel!`; if (this.args.length === 0) return `${this.message.author.mention}, you need to provide whether I should be enabled or disabled in this channel!`;
if (this.args[0] !== "disable" && this.args[0] !== "enable") return `${this.message.author.mention}, that's not a valid option!`; if (this.args[0] !== "disable" && this.args[0] !== "enable") return `${this.message.author.mention}, that's not a valid option!`;

View file

@ -6,7 +6,7 @@ class PrefixCommand extends Command {
if (!this.message.channel.guild) return `${this.message.author.mention}, this command only works in servers!`; if (!this.message.channel.guild) return `${this.message.author.mention}, this command only works in servers!`;
const guild = await database.getGuild(this.message.channel.guild.id); const guild = await database.getGuild(this.message.channel.guild.id);
if (this.args.length !== 0) { if (this.args.length !== 0) {
if (!this.message.member.permissions.has("administrator") && this.message.member.id !== process.env.OWNER) return `${this.message.author.mention}, you need to be an administrator to change the bot prefix!`; if (!this.message.member.permission.has("administrator") && this.message.member.id !== process.env.OWNER) return `${this.message.author.mention}, you need to be an administrator to change the bot prefix!`;
await database.setPrefix(this.args[0], this.message.channel.guild); await database.setPrefix(this.args[0], this.message.channel.guild);
return `The prefix has been changed to ${this.args[0]}.`; return `The prefix has been changed to ${this.args[0]}.`;
} else { } else {

View file

@ -25,13 +25,13 @@ class TagsCommand extends Command {
case "remove": case "remove":
if (this.args[1] === undefined) return `${this.message.author.mention}, you need to provide the name of the tag you want to delete!`; if (this.args[1] === undefined) return `${this.message.author.mention}, you need to provide the name of the tag you want to delete!`;
if (!tags[this.args[1].toLowerCase()]) return `${this.message.author.mention}, this tag doesn't exist!`; if (!tags[this.args[1].toLowerCase()]) return `${this.message.author.mention}, this tag doesn't exist!`;
if (tags[this.args[1].toLowerCase()].author !== this.message.author.id && !this.message.member.permissions.has("manageMessages") && this.message.author.id !== process.env.OWNER) return `${this.message.author.mention}, you don't own this tag!`; if (tags[this.args[1].toLowerCase()].author !== this.message.author.id && !this.message.member.permission.has("manageMessages") && this.message.author.id !== process.env.OWNER) return `${this.message.author.mention}, you don't own this tag!`;
await database.removeTag(this.args[1].toLowerCase(), this.message.channel.guild); await database.removeTag(this.args[1].toLowerCase(), this.message.channel.guild);
return `${this.message.author.mention}, the tag \`${this.args[1].toLowerCase()}\` has been deleted!`; return `${this.message.author.mention}, the tag \`${this.args[1].toLowerCase()}\` has been deleted!`;
case "edit": case "edit":
if (this.args[1] === undefined) return `${this.message.author.mention}, you need to provide the name of the tag you want to edit!`; if (this.args[1] === undefined) return `${this.message.author.mention}, you need to provide the name of the tag you want to edit!`;
if (!tags[this.args[1].toLowerCase()]) return `${this.message.author.mention}, this tag doesn't exist!`; if (!tags[this.args[1].toLowerCase()]) return `${this.message.author.mention}, this tag doesn't exist!`;
if (tags[this.args[1].toLowerCase()].author !== this.message.author.id && !this.message.member.permissions.has("manageMessages") && this.message.author.id !== process.env.OWNER) return `${this.message.author.mention}, you don't own this tag!`; if (tags[this.args[1].toLowerCase()].author !== this.message.author.id && !this.message.member.permission.has("manageMessages") && this.message.author.id !== process.env.OWNER) return `${this.message.author.mention}, you don't own this tag!`;
await this.setTag(this.args.slice(2).join(" "), this.args[1].toLowerCase(), this.message, guild); await this.setTag(this.args.slice(2).join(" "), this.args[1].toLowerCase(), this.message, guild);
return `${this.message.author.mention}, the tag \`${this.args[1].toLowerCase()}\` has been edited!`; return `${this.message.author.mention}, the tag \`${this.args[1].toLowerCase()}\` has been edited!`;
case "own": case "own":
@ -72,7 +72,7 @@ class TagsCommand extends Command {
return tags[random(Object.keys(tags))].content; return tags[random(Object.keys(tags))].content;
case "enable": case "enable":
case "disable": case "disable":
if (!this.message.member.permissions.has("manageMessages") && this.message.author.id !== process.env.OWNER) return `${this.message.author.mention}, you don't have permission to disable tags!`; if (!this.message.member.permission.has("manageMessages") && this.message.author.id !== process.env.OWNER) return `${this.message.author.mention}, you don't have permission to disable tags!`;
var toggleResult = await database.toggleTags(this.message.channel.guild); var toggleResult = await database.toggleTags(this.message.channel.guild);
return `${this.message.author.mention}, tags for this guild have been ${toggleResult ? "disabled" : "enabled"}. To ${toggleResult ? "enable" : "disable"} them again, run ${guild.prefix}tags ${toggleResult ? "enable" : "disable"}.`; return `${this.message.author.mention}, tags for this guild have been ${toggleResult ? "disabled" : "enabled"}. To ${toggleResult ? "enable" : "disable"} them again, run ${guild.prefix}tags ${toggleResult ? "enable" : "disable"}.`;
default: default:

View file

@ -4,7 +4,7 @@ const { random } = require("../utils/misc.js");
module.exports = async (client, member, oldChannel) => { module.exports = async (client, member, oldChannel) => {
const connection = soundPlayer.players.get(oldChannel.guild.id); const connection = soundPlayer.players.get(oldChannel.guild.id);
if (connection && oldChannel.id === connection.voiceChannel.id) { if (connection && connection.type === "music" && oldChannel.id === connection.voiceChannel.id) {
if (oldChannel.voiceMembers.filter((i) => i.id !== client.user.id).length === 0) { if (oldChannel.voiceMembers.filter((i) => i.id !== client.user.id).length === 0) {
const waitMessage = await client.createMessage(connection.originalChannel.id, "🔊 Waiting 10 seconds for someone to return..."); const waitMessage = await client.createMessage(connection.originalChannel.id, "🔊 Waiting 10 seconds for someone to return...");
const awaitRejoin = new AwaitRejoin(oldChannel, true); const awaitRejoin = new AwaitRejoin(oldChannel, true);

View file

@ -8,7 +8,7 @@ const path = require("path");
const { EventEmitter } = require("events"); const { EventEmitter } = require("events");
const logger = require("./logger.js"); const logger = require("./logger.js");
const formats = ["image/jpeg", "image/png", "image/webp", "image/gif"]; const formats = ["image/jpeg", "image/png", "image/webp", "image/gif", "video/mp4", "video/webm", "video/mov"];
const jobs = {}; const jobs = {};

View file

@ -1,5 +1,4 @@
const fetch = require("node-fetch"); const fetch = require("node-fetch");
const url = require("url");
const { getType } = require("./image.js"); const { getType } = require("./image.js");
const execPromise = require("util").promisify(require("child_process").exec); const execPromise = require("util").promisify(require("child_process").exec);
@ -23,17 +22,18 @@ const gfycatURLs = [
"giant.gfycat.com" "giant.gfycat.com"
]; ];
const formats = ["image/jpeg", "image/png", "image/webp", "image/gif"]; const imageFormats = ["image/jpeg", "image/png", "image/webp", "image/gif"];
const videoFormats = ["video/mp4", "video/webm", "video/mov"];
// gets the proper image paths // gets the proper image paths
const getImage = async (image, image2, gifv = false) => { const getImage = async (image, image2, video, gifv = false) => {
try { try {
const payload = { const payload = {
url: image2, url: image2,
path: image path: image
}; };
if (gifv) { if (gifv) {
const host = url.parse(image2).host; const host = new URL(image2).host;
if (tenorURLs.includes(host)) { if (tenorURLs.includes(host)) {
if (process.env.TENOR !== "") { if (process.env.TENOR !== "") {
const data = await fetch(`https://api.tenor.com/v1/gifs?ids=${image2.split("-").pop()}&key=${process.env.TENOR}`); const data = await fetch(`https://api.tenor.com/v1/gifs?ids=${image2.split("-").pop()}&key=${process.env.TENOR}`);
@ -51,9 +51,12 @@ const getImage = async (image, image2, gifv = false) => {
payload.path = `https://thumbs.gfycat.com/${image.split("/").pop().split(".mp4")[0]}-size_restricted.gif`; payload.path = `https://thumbs.gfycat.com/${image.split("/").pop().split(".mp4")[0]}-size_restricted.gif`;
} }
payload.type = "image/gif"; payload.type = "image/gif";
} else if (video) {
payload.type = await getType(payload.path);
if (!payload.type || !videoFormats.includes(payload.type)) return;
} else { } else {
payload.type = await getType(payload.path); payload.type = await getType(payload.path);
if (!payload.type || !formats.includes(payload.type)) return; if (!payload.type || !imageFormats.includes(payload.type)) return;
} }
return payload; return payload;
} catch (error) { } catch (error) {
@ -65,42 +68,42 @@ const getImage = async (image, image2, gifv = false) => {
} }
}; };
const checkImages = async (message) => { const checkImages = async (message, video) => {
let type; let type;
// first check the embeds // first check the embeds
if (message.embeds.length !== 0) { if (message.embeds.length !== 0) {
// embeds can vary in types, we check for tenor gifs first // embeds can vary in types, we check for tenor gifs first
if (message.embeds[0].type === "gifv") { if (message.embeds[0].type === "gifv") {
type = await getImage(message.embeds[0].video.url, message.embeds[0].url, true); type = await getImage(message.embeds[0].video.url, message.embeds[0].url, video, true);
// then we check for other image types // then we check for other image types
} else if ((message.embeds[0].type === "video" || message.embeds[0].type === "image") && message.embeds[0].thumbnail) { } else if ((message.embeds[0].type === "video" || message.embeds[0].type === "image") && message.embeds[0].thumbnail) {
type = await getImage(message.embeds[0].thumbnail.proxy_url, message.embeds[0].thumbnail.url); type = await getImage(message.embeds[0].thumbnail.proxy_url, message.embeds[0].thumbnail.url, video);
// finally we check both possible image fields for "generic" embeds // finally we check both possible image fields for "generic" embeds
} else if (message.embeds[0].type === "rich") { } else if (message.embeds[0].type === "rich") {
if (message.embeds[0].thumbnail) { if (message.embeds[0].thumbnail) {
type = await getImage(message.embeds[0].thumbnail.proxy_url, message.embeds[0].thumbnail.url); type = await getImage(message.embeds[0].thumbnail.proxy_url, message.embeds[0].thumbnail.url, video);
} else if (message.embeds[0].image) { } else if (message.embeds[0].image) {
type = await getImage(message.embeds[0].image.proxy_url, message.embeds[0].image.url); type = await getImage(message.embeds[0].image.proxy_url, message.embeds[0].image.url, video);
} }
} }
// then check the attachments // then check the attachments
} else if (message.attachments.length !== 0 && message.attachments[0].width) { } else if (message.attachments.length !== 0 && message.attachments[0].width) {
type = await getImage(message.attachments[0].proxy_url, message.attachments[0].url); type = await getImage(message.attachments[0].proxy_url, message.attachments[0].url, video);
} }
// if the file is an image then return it // if the file is an image then return it
return type ? type : false; return type ? type : false;
}; };
// this checks for the latest message containing an image and returns the url of the image // this checks for the latest message containing an image and returns the url of the image
module.exports = async (client, cmdMessage) => { module.exports = async (client, cmdMessage, video = false) => {
// we start by checking the current message for images // we start by checking the current message for images
const result = await checkImages(cmdMessage); const result = await checkImages(cmdMessage, video);
if (result !== false) return result; if (result !== false) return result;
// if there aren't any in the current message then check if there's a reply // if there aren't any in the current message then check if there's a reply
if (cmdMessage.messageReference) { if (cmdMessage.messageReference) {
const replyMessage = await client.getMessage(cmdMessage.messageReference.channelID, cmdMessage.messageReference.messageID); const replyMessage = await client.getMessage(cmdMessage.messageReference.channelID, cmdMessage.messageReference.messageID);
if (replyMessage) { if (replyMessage) {
const replyResult = await checkImages(replyMessage); const replyResult = await checkImages(replyMessage, video);
if (replyResult !== false) return replyResult; if (replyResult !== false) return replyResult;
} }
} }
@ -108,7 +111,7 @@ module.exports = async (client, cmdMessage) => {
const messages = await cmdMessage.channel.getMessages(); const messages = await cmdMessage.channel.getMessages();
// iterate over each message // iterate over each message
for (const message of messages) { for (const message of messages) {
const result = await checkImages(message); const result = await checkImages(message, video);
if (result === false) { if (result === false) {
continue; continue;
} else { } else {