From 628a002205162e775f1449b865d34fce0a2fd61d Mon Sep 17 00:00:00 2001 From: TheEssem Date: Thu, 9 Apr 2020 21:40:52 -0500 Subject: [PATCH] Added channel, allow using a mention on hackban and snowflake --- commands/channel.js | 35 +++++++++++++ commands/hackban.js | 7 +-- commands/snowflake.js | 4 +- events/guildCreate.js | 3 +- events/messageCreate.js | 22 ++------ events/ready.js | 110 ++++++++++++++++++++++++---------------- utils/database.js | 3 +- 7 files changed, 117 insertions(+), 67 deletions(-) create mode 100644 commands/channel.js diff --git a/commands/channel.js b/commands/channel.js new file mode 100644 index 0000000..335270e --- /dev/null +++ b/commands/channel.js @@ -0,0 +1,35 @@ +const db = require("../utils/database.js"); + +exports.run = async (message, args) => { + if (args.length === 0) return `${message.author.mention}, you need to provide whether I should be enabled or disabled in this channel!`; + if (args[0] !== "disable" && args[0] !== "enable") return `${message.author.mention}, that's not a valid option!`; + const guildDB = (await db.guilds.find({id: message.channel.guild.id}).exec())[0]; + if (args[0].toLowerCase() === "disable") { + if (args[1] && args[1].match(/^?$/) && args[1] >= 21154535154122752) { + const id = args[1].replace("@", "").replace("#", "").replace("!", "").replace("&", "").replace("<", "").replace(">", ""); + console.log(id); + if (guildDB.disabledChannels.includes(id)) return `${message.author.mention}, I'm already disabled in this channel!`; + guildDB.disabledChannels.push(id); + } else { + if (guildDB.disabledChannels.includes(message.channel.id)) return `${message.author.mention}, I'm already disabled in this channel!`; + guildDB.disabledChannels.push(message.channel.id); + } + await guildDB.save(); + return `${message.author.mention}, I have been disabled in this channel. To re-enable me, just run \`${guildDB.prefix}channel enable\`.`; + } else if (args[0].toLowerCase() === "enable") { + if (args[1] && args[1].match(/^?$/) && args[1] >= 21154535154122752) { + const id = args[1].replace("@", "").replace("#", "").replace("!", "").replace("&", "").replace("<", "").replace(">", ""); + if (!guildDB.disabledChannels.includes(id)) return `${message.author.mention}, I'm not disabled in that channel!`; + guildDB.disabledChannels = guildDB.disabledChannels.filter(item => item !== id); + } else { + if (!guildDB.disabledChannels.includes(message.channel.id)) return `${message.author.mention}, I'm not disabled in this channel!`; + guildDB.disabledChannels = guildDB.disabledChannels.filter(item => item !== message.channel.id ); + } + await guildDB.save(); + return `${message.author.mention}, I have been re-enabled in this channel.`; + } +}; + +exports.category = 1; +exports.help = "Enables/disables me in a channel"; +exports.params = "[enable/disable] {id}"; \ No newline at end of file diff --git a/commands/hackban.js b/commands/hackban.js index 217d397..dca1bc5 100644 --- a/commands/hackban.js +++ b/commands/hackban.js @@ -1,8 +1,9 @@ exports.run = async (message, args) => { - if (!args[0].match(/^\d+$/) && args[0] < 21154535154122752) return `${message.author.mention}, that's not a valid snowflake!`; + if (!args[0].match(/^?$/) && args[0] < 21154535154122752) return `${message.author.mention}, that's not a valid snowflake!`; try { - await message.channel.guild.banMember(args[0], 0, `hackban command used by @${message.author.username}#${message.author.discriminator}`); - return `Successfully banned user with ID \`${args[0]}\`.`; + const id = args[0].replace("@", "").replace("#", "").replace("!", "").replace("&", "").replace("<", "").replace(">", ""); + await message.channel.guild.banMember(id, 0, `Hackban command used by @${message.author.username}#${message.author.discriminator}`); + return `Successfully banned user with ID \`${id}\`.`; } catch (e) { throw e; //return `${message.author.mention}, I was unable to ban the member. Have you given me permissions?`; diff --git a/commands/snowflake.js b/commands/snowflake.js index 99c862b..83f85f8 100644 --- a/commands/snowflake.js +++ b/commands/snowflake.js @@ -1,7 +1,7 @@ exports.run = async (message, args) => { if (!args[0]) return `${message.author.mention}, you need to provide a snowflake ID!`; - if (!args[0].match(/^\d+$/) && args[0] < 21154535154122752) return `${message.author.mention}, that's not a valid snowflake!`; - return new Date((args[0] / 4194304) + 1420070400000).toUTCString(); + if (!args[0].match(/^?$/) && args[0] < 21154535154122752) return `${message.author.mention}, that's not a valid snowflake!`; + return new Date((args[0].replace("@", "").replace("#", "").replace("!", "").replace("&", "").replace("<", "").replace(">", "") / 4194304) + 1420070400000).toUTCString(); }; exports.aliases = ["timestamp", "snowstamp", "snow"]; diff --git a/events/guildCreate.js b/events/guildCreate.js index 79929f4..01c2e20 100644 --- a/events/guildCreate.js +++ b/events/guildCreate.js @@ -10,7 +10,8 @@ module.exports = async (guild) => { id: guild.id, tags: misc.tagDefaults, prefix: "&", - warns: {} + warns: {}, + disabledChannels: [] }); await guildDB.save(); }; diff --git a/events/messageCreate.js b/events/messageCreate.js index 91d16f5..c4c6a7f 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -14,27 +14,12 @@ module.exports = async (message) => { if (!message.channel.guild.members.get(client.user.id).permission.has("sendMessages") || !message.channel.permissionsOf(client.user.id).has("sendMessages")) return; // prefix can be a mention or a set of special characters + const guildDB = (await database.guilds.find({ id: message.channel.guild.id }).exec())[0]; const prefixMention = new RegExp(`^<@!?${client.user.id}> `); - const prefix = prefixMention.test(message.content) ? message.content.match(prefixMention)[0] : (await database.guilds.find({ id: message.channel.guild.id }).exec())[0].prefix; + const prefix = prefixMention.test(message.content) ? message.content.match(prefixMention)[0] : guildDB.prefix; // ignore other stuff if (message.content.startsWith(prefix) === false) return; - // && message.channel.id !== "573553254575898626" - - // funny stuff - /*if (message.channel.id === "573553254575898626" && message.channel.guild.id === "433408970955423765") { - const generalChannel = client.guilds.get("631290275456745502").channels.get("631290275888627713"); - if (message.attachments.length !== 0) { - const attachments = []; - for (const attachment of message.attachments) { - const res = await require("node-fetch")(attachment.url); - attachments.push({ file: await res.buffer(), name: attachment.filename }); - } - await client.createMessage(generalChannel.id, message.content, attachments); - } else { - await client.createMessage(generalChannel.id, message.content); - } - }*/ // separate commands and args const prefixRegex = new RegExp(`^(${misc.regexEscape(prefix)})`); @@ -42,6 +27,9 @@ module.exports = async (message) => { const args = content.split(/ +/g); const command = args.shift().toLowerCase(); + // don't run if message is in a disabled channel + if (guildDB.disabledChannels.includes(message.channel.id) && command != "channel") return; + // check if command exists const cmd = collections.commands.get(command) || collections.commands.get(collections.aliases.get(command)); if (!cmd) return; diff --git a/events/ready.js b/events/ready.js index ec53fda..a790392 100644 --- a/events/ready.js +++ b/events/ready.js @@ -5,29 +5,42 @@ const database = require("../utils/database.js"); const logger = require("../utils/logger.js"); const messages = require("../messages.json"); const misc = require("../utils/misc.js"); -const helpGenerator = process.env.OUTPUT !== "" ? require("../utils/help.js") : null; -const twitter = process.env.TWITTER === "true" ? require("../utils/twitter.js") : null; +const helpGenerator = + process.env.OUTPUT !== "" ? require("../utils/help.js") : null; +const twitter = + process.env.TWITTER === "true" ? require("../utils/twitter.js") : null; // run when ready module.exports = async () => { // make sure settings/tags exist for (const [id] of client.guilds) { - const guildDB = (await database.guilds.find({ - id: id - }).exec())[0]; + const guildDB = ( + await database.guilds + .find({ + id: id, + }) + .exec() + )[0]; if (!guildDB) { logger.log(`Registering guild database entry for guild ${id}...`); const newGuild = new database.guilds({ id: id, tags: misc.tagDefaults, prefix: "&", - warns: {} + warns: {}, + disabledChannels: [] }); await newGuild.save(); - } else if (guildDB && !guildDB.warns) { - logger.log(`Creating warn object for guild ${id}...`); - guildDB.set("warns", {}); - await guildDB.save(); + } else if (guildDB) { + if (!guildDB.warns) { + logger.log(`Creating warn object for guild ${id}...`); + guildDB.set("warns", {}); + await guildDB.save(); + } else if (!guildDB.disabledChannels) { + logger.log(`Creating disabled channels object for guild ${id}...`); + guildDB.set("disabledChannels", []); + await guildDB.save(); + } } } @@ -39,7 +52,7 @@ module.exports = async () => { // set activity (a.k.a. the gamer code) (async function activityChanger() { client.editStatus("dnd", { - name: `${misc.random(messages)} | @esmBot help` + name: `${misc.random(messages)} | @esmBot help`, }); setTimeout(activityChanger, 900000); })(); @@ -49,11 +62,20 @@ module.exports = async () => { gm.prototype.streamPromise = promisify(gm.prototype.stream); gm.prototype.sizePromise = promisify(gm.prototype.size); gm.prototype.identifyPromise = promisify(gm.prototype.identify); - //gm.prototype.bufferPromise = promisify(gm.prototype.toBuffer); gm.prototype.bufferPromise = function(format, delay, type) { return new Promise((resolve, reject) => { - if (format) { - this.in(delay ? "-delay" : "", delay ? delay.split("/").reverse().join("x") : "").out(type !== "sonic" ? "-layers" : "", type !== "sonic" ? "optimize" : "").out("-limit", "memory", "64MB").out("-limit", "map", "128MB").stream(format, (err, stdout, stderr) => { + this.in( + delay ? "-delay" : "", + delay ? delay.split("/").reverse().join("x") : "" + ) + .out( + type !== "sonic" ? "-layers" : "", + type !== "sonic" ? "OptimizeTransparency" : "" + ) + .out("-fuzz", "2%") + .out("-limit", "memory", "64MB") + .out("-limit", "map", "128MB") + .stream(format, (err, stdout, stderr) => { if (err) return reject(err); const chunks = []; stdout.on("data", (chunk) => { @@ -68,34 +90,20 @@ module.exports = async () => { reject(data.toString()); }); }); - } else { - this.in(delay ? "-delay" : "", delay ? delay.split("/").reverse().join("x") : "").out(type !== "sonic" ? "-layers" : "", type !== "sonic" ? "optimize" : "").out("-limit", "memory", "64MB").out("-limit", "map", "128MB").stream((err, stdout, stderr) => { - if (err) return reject(err); - const chunks = []; - stdout.on("data", (chunk) => { - chunks.push(chunk); - }); - // these are 'once' because they can and do fire multiple times for multiple errors, - // but this is a promise so you'll have to deal with them one at a time - stdout.once("end", () => { - resolve(Buffer.concat(chunks)); - }); - stderr.once("data", (data) => { - reject(data.toString()); - }); - }); - } }); - }; // tweet stuff if (twitter !== null && twitter.active === false) { const blocks = await twitter.client.blocks.ids(); const tweet = async () => { - const tweets = (await database.tweets.find({ - enabled: true - }).exec())[0]; + const tweets = ( + await database.tweets + .find({ + enabled: true, + }) + .exec() + )[0]; const tweetContent = await misc.getTweet(tweets); try { const info = await twitter.client.statuses.update(tweetContent); @@ -115,19 +123,32 @@ module.exports = async () => { twitter.active = true; const stream = twitter.client.statuses.filter(`@${process.env.HANDLE}`); stream.on("data", async (tweet) => { - if (tweet.user.screen_name !== "esmBot_" && !blocks.ids.includes(tweet.user.id_str)) { - const tweets = (await database.tweets.find({ - enabled: true - }).exec())[0]; + if ( + tweet.user.screen_name !== "esmBot_" && + !blocks.ids.includes(tweet.user.id_str) + ) { + const tweets = ( + await database.tweets + .find({ + enabled: true, + }) + .exec() + )[0]; let tweetContent; - if (tweet.text.includes("@this_vid") || tweet.text.includes("@DownloaderBot") || tweet.text.includes("@GetVideoBot") || tweet.text.includes("@DownloaderB0t") || tweet.text.includes("@thisvid_")) { + if ( + tweet.text.includes("@this_vid") || + tweet.text.includes("@DownloaderBot") || + tweet.text.includes("@GetVideoBot") || + tweet.text.includes("@DownloaderB0t") || + tweet.text.includes("@thisvid_") + ) { tweetContent = await misc.getTweet(tweet, true, true); } else { tweetContent = await misc.getTweet(tweets, true); } const payload = { status: `@${tweet.user.screen_name} ${tweetContent}`, - in_reply_to_status_id: tweet.id_str + in_reply_to_status_id: tweet.id_str, }; const info = await twitter.client.statuses.update(payload); logger.log(`Reply with id ${info.id_str} has been posted.`); @@ -136,5 +157,8 @@ module.exports = async () => { }); } - logger.log("info", `Successfully started ${client.user.username}#${client.user.discriminator} with ${client.users.size} users in ${client.guilds.size} servers.`); -}; \ No newline at end of file + logger.log( + "info", + `Successfully started ${client.user.username}#${client.user.discriminator} with ${client.users.size} users in ${client.guilds.size} servers.` + ); +}; diff --git a/utils/database.js b/utils/database.js index a43a537..ffb3ae2 100644 --- a/utils/database.js +++ b/utils/database.js @@ -5,7 +5,8 @@ const guildSchema = new mongoose.Schema({ id: String, tags: Map, prefix: String, - warns: Map + warns: Map, + disabledChannels: [String] }); const Guild = mongoose.model("Guild", guildSchema);