diff options
author | IRONM00N <64110067+IRONM00N@users.noreply.github.com> | 2021-07-29 21:16:30 -0400 |
---|---|---|
committer | IRONM00N <64110067+IRONM00N@users.noreply.github.com> | 2021-07-29 21:16:30 -0400 |
commit | 1c6d451ffd63f9805b978e8565807e8a6b528681 (patch) | |
tree | 97ae6b3746b42ed21eb0fc3a3888bbfca36a1806 /src/listeners/message | |
parent | 7990abdb511eeec2a114b124a3628b10bfefc342 (diff) | |
download | tanzanite-1c6d451ffd63f9805b978e8565807e8a6b528681.tar.gz tanzanite-1c6d451ffd63f9805b978e8565807e8a6b528681.tar.bz2 tanzanite-1c6d451ffd63f9805b978e8565807e8a6b528681.zip |
added a rudimentary automod, fixed a bunch of stuff, added some more listeners
Diffstat (limited to 'src/listeners/message')
-rw-r--r-- | src/listeners/message/autoPublisher.ts | 25 | ||||
-rw-r--r-- | src/listeners/message/automodCreate.ts | 2 | ||||
-rw-r--r-- | src/listeners/message/automodUpdate.ts | 2 | ||||
-rw-r--r-- | src/listeners/message/blacklistedFile.ts | 159 | ||||
-rw-r--r-- | src/listeners/message/booster.ts | 20 | ||||
-rw-r--r-- | src/listeners/message/directMessage.ts | 44 | ||||
-rw-r--r-- | src/listeners/message/verbose.ts | 20 |
7 files changed, 270 insertions, 2 deletions
diff --git a/src/listeners/message/autoPublisher.ts b/src/listeners/message/autoPublisher.ts new file mode 100644 index 0000000..3941371 --- /dev/null +++ b/src/listeners/message/autoPublisher.ts @@ -0,0 +1,25 @@ +import { BushListener } from '../../lib'; +import { BushClientEvents } from '../../lib/extensions/discord.js/BushClientEvents'; + +export default class autoPublisherListener extends BushListener { + public constructor() { + super('autoPublisher', { + emitter: 'client', + event: 'messageCreate', + category: 'message' + }); + } + + public async exec(...[message]: BushClientEvents['messageCreate']): Promise<void> { + if (!message.guild) return; + const autoPublishChannels = await message.guild.getSetting('autoPublishChannels'); + if (autoPublishChannels) { + if (message.channel.type === 'GUILD_NEWS' && autoPublishChannels.some((x) => message.channel.id.includes(x))) { + const success = await message.crosspost().catch(() => false); + if (!success) + void client.console.warn('AutoPublisher', `Failed to publish <<${message.id}>> in <<${message.guild.name}>>.`); + void client.logger.log('AutoPublisher', `Published message <<${message.id}>> in <<${message.guild.name}>>.`); + } + } + } +} diff --git a/src/listeners/message/automodCreate.ts b/src/listeners/message/automodCreate.ts index b8057c5..b6718fc 100644 --- a/src/listeners/message/automodCreate.ts +++ b/src/listeners/message/automodCreate.ts @@ -10,7 +10,7 @@ export default class AutomodMessageCreateListener extends BushListener { }); } - async exec(...[message]: ClientEvents['messageCreate']): Promise<void> { + async exec(...[message]: ClientEvents['messageCreate']): Promise<unknown> { return await util.automod(message as BushMessage); } } diff --git a/src/listeners/message/automodUpdate.ts b/src/listeners/message/automodUpdate.ts index 9d17ef0..e455a3d 100644 --- a/src/listeners/message/automodUpdate.ts +++ b/src/listeners/message/automodUpdate.ts @@ -10,7 +10,7 @@ export default class AutomodMessageUpdateListener extends BushListener { }); } - async exec(...[message]: ClientEvents['messageUpdate']): Promise<void> { + async exec(...[message]: ClientEvents['messageUpdate']): Promise<unknown> { const fullMessage = message.partial ? await message.fetch() : (message as Message); return await util.automod(fullMessage as BushMessage); } diff --git a/src/listeners/message/blacklistedFile.ts b/src/listeners/message/blacklistedFile.ts new file mode 100644 index 0000000..93ed7b7 --- /dev/null +++ b/src/listeners/message/blacklistedFile.ts @@ -0,0 +1,159 @@ +import crypto from 'crypto'; +import got from 'got'; +import { BushListener } from '../../lib'; +import { BushClientEvents } from '../../lib/extensions/discord.js/BushClientEvents'; + +export default class BlacklistedFileListener extends BushListener { + private blacklistedFiles: { hash: string[]; name: string; description: string }[] = [ + { + hash: ['a0f5e30426234bc9d09306ffc9474422'], + name: 'Play twice audio', + description: 'weird audio files' + }, + { + hash: ['43e55abbcea67d9e6d7abfff944a8d0b'], + name: 'Flashy loud jumpscare', + description: 'flashy, loud gifs' + }, + { + hash: [ + '7a0831239e8c8368e96fb4cacd61b5f2', + '3bdb44bf3702f15d118f04fa63b927a9', + 'b6e45619a68c0e20749edb2412590b15', + 'bb8a27047518a8a7e420509af0e9e0ed', + 'f8076cd51e1ddab4ceded26a764af160', + '1757f0442b5e337bba0340f7b116e6f7', + 'f59185531f0dfa9bdd323b86f796c3bd', + '2825d3d82af65de210e638911e49b3a2', + '5256c3c18b367552e55e463a60af7760' + ], + name: 'Discord crash video/gif', + description: 'media that crashes discord' + }, + { + hash: ['1fd6b3f255946236fd55d3e4bef01c5f', '157d374ec41adeef9601fd87e23f4bf5'], + name: 'Repost lobster video', + description: 'images encouraging spam' + }, + { + hash: ['10ad124fc47cd9b7de2ec629bc945bf2'], + name: 'Jarvis message top user troll thingy', + description: 'gifs encouraging spam' + }, + { + hash: ['312cda77d3e1f5fa00f482aed3b36f6f'], + name: 'Discord token stealer', + description: 'discord token stealers' + }, + { + hash: ['f37f772246db9d690dee0f581682dfb7'], + name: 'Weird nsfw dog vid', + description: 'weird nsfw videos' + }, + { + hash: ['5a5bfdf02a0224d3468499d099ec4eee'], + name: 'Virus (or at least flags antiviruses)', + description: 'viruses' + } + ]; + + constructor() { + super('blacklistedFile', { + emitter: 'client', + event: 'messageCreate', + category: 'message' + }); + } + + public async exec(...[message]: BushClientEvents['messageCreate']): Promise<void> { + const guildWhitelist = [ + client.consts.mappings.guilds.bush, + client.consts.mappings.guilds.tree, + client.consts.mappings.guilds.space_ship + ]; + if (!guildWhitelist.includes(message.guild?.id)) return; + const embedAttachments = message.embeds.filter((e) => ['image', 'video', 'gifv'].includes(e.type)); + const foundEmojis = [...message.content.matchAll(/<(?<animated>a?):\w+:(?<id>\d+)>/g)]; + if (message.attachments.size + embedAttachments.length + foundEmojis.length < 1) return; + const foundFiles = [] as { + name: string; + hash: string[]; + description: string; + }[]; + for (const attachment of message.attachments) { + try { + const req = await got.get(attachment[1].proxyURL); + const rawHash = crypto.createHash('md5'); + rawHash.update(req.rawBody.toString('binary')); + const hash = rawHash.digest('hex'); + const blacklistData = this.blacklistedFiles.find((h) => h.hash.some((h) => h === hash)); + if (blacklistData !== undefined) { + foundFiles.push(blacklistData); + } + } catch { + continue; + } + } + for (const attachment of embedAttachments) { + try { + const req = await got.get(attachment.url); + const rawHash = crypto.createHash('md5'); + rawHash.update(req.rawBody.toString('binary')); + const hash = rawHash.digest('hex'); + const blacklistData = this.blacklistedFiles.find((h) => h.hash.some((h) => h === hash)); + if (blacklistData !== undefined) { + foundFiles.push(blacklistData); + } + } catch { + continue; + } + } + for (const attachment of foundEmojis) { + try { + const req = await got.get( + `https://cdn.discordapp.com/emojis/${attachment.groups.id}.${attachment.groups.animated === 'a' ? 'gif' : 'png'}` + ); + const rawHash = crypto.createHash('md5'); + rawHash.update(req.rawBody.toString('binary')); + const hash = rawHash.digest('hex'); + const blacklistData = this.blacklistedFiles.find((h) => h.hash.some((h) => h === hash)); + if (blacklistData !== undefined) { + foundFiles.push(blacklistData); + } + } catch { + continue; + } + } + if (foundFiles.length > 0) { + try { + for (let i = 0; i < foundFiles.length; i++) { + if (foundFiles[i].name === 'Discord crash video' && !this.client.ownerID.includes(message.author.id)) { + await message.member.roles.add('748912426581229690'); + } + } + await message.delete(); + + await message.util.send( + `<@!${message.author.id}>, please do not send ${foundFiles.map((f) => f.description).join(' or ')}.` + ); + if (message.channel.type === 'DM') return; + void this.client.console.info( + 'BlacklistedFile', + `Deleted <<${foundFiles.map((f) => f.description).join(' and ')}>> sent by <<${message.author.tag}>> in ${ + message.channel.name + }.` + ); + } catch (e) { + void message.util.send( + `<@!${message.author.id}>, please do not send ${foundFiles.map((f) => f.description).join(' or ')}.` + ); + void this.client.console.warn( + 'BlacklistedFile', + `Failed to delete <<${foundFiles.map((f) => f.description).join(' and ')}>> sent by <<${message.author.tag}>> in <<${ + message.channel.type === 'DM' ? `${message.channel.recipient.tag}'s DMs` : message.channel.name + }>>.` + ); + } + } + } +} diff --git a/src/listeners/message/booster.ts b/src/listeners/message/booster.ts new file mode 100644 index 0000000..a042ad1 --- /dev/null +++ b/src/listeners/message/booster.ts @@ -0,0 +1,20 @@ +import { BushListener } from '../../lib'; +import { BushClientEvents } from '../../lib/extensions/discord.js/BushClientEvents'; + +export default class BoosterMessageListener extends BushListener { + public constructor() { + super('boosterMessage', { + emitter: 'client', + event: 'messageCreate', + category: 'message' + }); + } + + public async exec(...[message]: BushClientEvents['messageCreate']): Promise<unknown> { + if (message.type === 'USER_PREMIUM_GUILD_SUBSCRIPTION' && message.guild.id === this.client.consts.mappings.guilds.bush) { + return await message.react('<:nitroboost:785160348885975062>').catch(() => { + void this.client.console.warn('BoosterMessage', `Failed to react to <<${message.id}>>.`); + }); + } + } +} diff --git a/src/listeners/message/directMessage.ts b/src/listeners/message/directMessage.ts new file mode 100644 index 0000000..3dc84ab --- /dev/null +++ b/src/listeners/message/directMessage.ts @@ -0,0 +1,44 @@ +import { MessageEmbed } from 'discord.js'; +import { BushListener } from '../../lib'; +import { BushClientEvents } from '../../lib/extensions/discord.js/BushClientEvents'; + +export default class DirectMessageListener extends BushListener { + public constructor() { + super('directMessage', { + emitter: 'client', + event: 'messageCreate', + category: 'message' + }); + } + + public async exec(...[message]: BushClientEvents['messageCreate']): Promise<void> { + if (message.channel.type === 'DM') { + if (!(message.author.id == this.client.user.id) && message.author.bot) return; + const dmLogEmbed = new MessageEmbed().setTimestamp().setFooter(`User ID • ${message.author.id}`); + + if (message.author.id != this.client.user.id) { + dmLogEmbed + .setAuthor(`From: ${message.author.username}`, `${message.author.displayAvatarURL({ dynamic: true })}`) + .setDescription(`**DM:**\n${message}`) + .setColor(this.client.util.colors.blue); + } else { + dmLogEmbed + .setAuthor( + `To: ${message.channel.recipient.username}`, + `${message.channel.recipient.displayAvatarURL({ dynamic: true })}` + ) + .setDescription(`**DM:**\n${message}`) + .setColor(this.client.util.colors.red) + .setTimestamp() + .setFooter(`ID • ${message.author.id}`); + } + if (message.attachments.filter((a) => typeof a.size == 'number').size == 1) { + dmLogEmbed.setImage(message.attachments.filter((a) => typeof a.size == 'number').first().proxyURL); + } else if (message.attachments.size > 0) { + dmLogEmbed.addField('Attachments', message.attachments.map((a) => a.proxyURL).join('\n')); + } + const dmChannel = await util.getConfigChannel('dm'); + await dmChannel.send({ embeds: [dmLogEmbed] }); + } + } +} diff --git a/src/listeners/message/verbose.ts b/src/listeners/message/verbose.ts new file mode 100644 index 0000000..45bf1de --- /dev/null +++ b/src/listeners/message/verbose.ts @@ -0,0 +1,20 @@ +import { BushListener } from '../../lib'; +import { BushClientEvents } from '../../lib/extensions/discord.js/BushClientEvents'; + +export default class MessageVerboseListener extends BushListener { + public constructor() { + super('messageVerbose', { + emitter: 'client', + event: 'messageCreate', + category: 'message' + }); + } + + public exec(...[message]: BushClientEvents['messageCreate']): Promise<void> { + if (message.channel?.type === 'DM') return; + void this.client.console.verbose( + 'Message', + `A message was sent by <<${message.author.tag}>> in <<${message.channel.name}>> in <<${message.guild.name}>>.` + ); + } +} |