From f1fd4f218368dd53e77380855168a544982919cb Mon Sep 17 00:00:00 2001 From: Alexander Harding Date: Tue, 7 Jul 2026 21:31:16 -0400 Subject: [PATCH] Updated configuration options Made swapping the monitoring mode, and messages more robust so that they can be swapped to meet any use-case the bot may be used for. --- src/index.ts | 61 +++++++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/index.ts b/src/index.ts index fb81d93..cd47946 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { config as dotenvconfig } from "dotenv"; dotenvconfig(); -import { Client, Events, GatewayIntentBits, TextChannel, PermissionsBitField } from "discord.js"; +import { Client, Events, GatewayIntentBits, TextChannel, PermissionsBitField, Message } from "discord.js"; const intents = [ GatewayIntentBits.Guilds, @@ -19,41 +19,48 @@ client.once(Events.ClientReady, c => { console.log(`Successfully logged in as ${c.user.username}`); }); -interface UserPingData { - lastPing: Date; - pingsTotal: number; +interface UserFlagData { + lastFlag: Date; + totalFlags: number; flaggedMessages: [string, string][]; } -const userPinged = new Map(); +const userFlags = new Map(); const ONE_HOUR = 60 * 60 * 1000; -const MAX_PINGS = 3; -const MUTE_DURATION = ONE_HOUR * 8; +const MAX_FLAGS = 3; +const MUTE_DURATION = ONE_HOUR * 8; // If this is changed to a different unit - Swap the unit in mute message +const hasFlaggedContent = (message: Message) => (message.attachments?.size ?? 0) > 0; + +const messages = { + "MUTE_REASON": () => "Spamming", + "MESSAGE": (message: Message) => `<@${message.author.id}> You have sent a large number of mentions in a short time. You have been muted for ${MUTE_DURATION} hours.`, + "ADMIN_DM": (message: Message) => `⚠️ Excessive mentions detected from ${message.author.username} (<@${message.author.id}>)` +} client.on(Events.MessageCreate, async message => { try { if (message.author.bot || whitelist.includes(message.author.id)) return; - const userData = userPinged.get(message.author.id) || { - lastPing: new Date(), - pingsTotal: 0, + const userData = userFlags.get(message.author.id) || { + lastFlag: new Date(), + totalFlags: 0, flaggedMessages: [], }; // Reset if more than 1 hour has passed - if (Date.now() - userData.lastPing.getTime() > ONE_HOUR) { - userPinged.set(message.author.id, { - lastPing: new Date(), - pingsTotal: 0, + if (Date.now() - userData.lastFlag.getTime() > ONE_HOUR) { + userFlags.set(message.author.id, { + lastFlag: new Date(), + totalFlags: 0, flaggedMessages: [], }); return; } - if (message.mentions.roles.size > 0 || message.mentions.users.size > 0) { - const newPings = userData.pingsTotal + 1; + if (hasFlaggedContent(message)) { + const newFlags = userData.totalFlags + 1; - if (newPings > MAX_PINGS) { + if (newFlags > MAX_FLAGS) { // Check if bot has permission to timeout members const member = await message.guild?.members.fetch(message.author.id); const botMember = await message.guild?.members.fetchMe(); @@ -69,20 +76,20 @@ client.on(Events.MessageCreate, async message => { if (canModerate) { try { - await member.timeout(MUTE_DURATION, "Excessive mentions"); + await member.timeout(MUTE_DURATION, messages.MUTE_REASON()); await message.channel.send( - `<@${message.author.id}> You have sent a large number of mentions in a short time. You have been muted for 8 hours.` + messages.MESSAGE(message) ); } catch (timeoutError) { console.error("Failed to timeout user:", timeoutError); await message.channel.send( - `<@${message.author.id}> You have sent a large number of mentions in a short time. Please slow down! (Auto-mute failed - check bot permissions)` + messages.MESSAGE(message) ); } } else { // Bot can't timeout, just warn await message.channel.send( - `<@${message.author.id}> You have sent a large number of mentions in a short time. Please slow down! (Bot lacks permission to mute)` + messages.MESSAGE(message) ); } } @@ -93,7 +100,7 @@ client.on(Events.MessageCreate, async message => { if (admin) { const dm = await admin.createDM(true); await dm.send( - `⚠️ Excessive mentions detected from ${message.author.username} (<@${message.author.id}>)` + messages.ADMIN_DM(message) ); await dm.send({ content: `\`${message.content}\``, @@ -138,13 +145,13 @@ client.on(Events.MessageCreate, async message => { } // Clean up user data - userPinged.delete(message.author.id); + userFlags.delete(message.author.id); } else { - // Track the ping + // Track the flags userData.flaggedMessages.push([message.channel.id, message.id]); - userData.pingsTotal = newPings; - userData.lastPing = new Date(); - userPinged.set(message.author.id, userData); + userData.totalFlags = newFlags; + userData.lastFlag = new Date(); + userFlags.set(message.author.id, userData); } } } catch (error) {