aboutsummaryrefslogtreecommitdiff
path: root/src/listeners/message
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-07-29 21:16:30 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-07-29 21:16:30 -0400
commit1c6d451ffd63f9805b978e8565807e8a6b528681 (patch)
tree97ae6b3746b42ed21eb0fc3a3888bbfca36a1806 /src/listeners/message
parent7990abdb511eeec2a114b124a3628b10bfefc342 (diff)
downloadtanzanite-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.ts25
-rw-r--r--src/listeners/message/automodCreate.ts2
-rw-r--r--src/listeners/message/automodUpdate.ts2
-rw-r--r--src/listeners/message/blacklistedFile.ts159
-rw-r--r--src/listeners/message/booster.ts20
-rw-r--r--src/listeners/message/directMessage.ts44
-rw-r--r--src/listeners/message/verbose.ts20
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}>>.`
+ );
+ }
+}