diff --git a/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts b/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts index 36fe3f85..63839f47 100644 --- a/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts +++ b/backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts @@ -6,6 +6,7 @@ import { humanizeDurationShort } from "../../../humanizeDurationShort"; import { findRecentSpam } from "./findRecentSpam"; import { getMatchingMessageRecentActions } from "./getMatchingMessageRecentActions"; import * as t from "io-ts"; +import { getMessageSpamIdentifier } from "./getSpamIdentifier"; const MessageSpamTriggerConfig = t.type({ amount: t.number, @@ -28,7 +29,9 @@ export function createMessageSpamTrigger(spamType: RecentActionType, prettyName: return; } - const recentSpam = findRecentSpam(pluginData, spamType, context.message.user_id); + const spamIdentifier = getMessageSpamIdentifier(context.message, triggerConfig.per_channel); + + const recentSpam = findRecentSpam(pluginData, spamType, spamIdentifier); if (recentSpam) { await pluginData.state.archives.addSavedMessagesToArchive( recentSpam.archiveId, @@ -46,9 +49,9 @@ export function createMessageSpamTrigger(spamType: RecentActionType, prettyName: pluginData, context.message, spamType, + spamIdentifier, triggerConfig.amount, within, - triggerConfig.per_channel, ); if (matchedSpam) { @@ -61,7 +64,7 @@ export function createMessageSpamTrigger(spamType: RecentActionType, prettyName: pluginData.state.recentSpam.push({ type: spamType, - userIds: [context.message.user_id], + identifiers: [spamIdentifier], archiveId, timestamp: Date.now(), }); diff --git a/backend/src/plugins/Automod/functions/findRecentSpam.ts b/backend/src/plugins/Automod/functions/findRecentSpam.ts index 1531574f..8a4b4979 100644 --- a/backend/src/plugins/Automod/functions/findRecentSpam.ts +++ b/backend/src/plugins/Automod/functions/findRecentSpam.ts @@ -2,8 +2,8 @@ import { PluginData } from "knub"; import { AutomodPluginType } from "../types"; import { RecentActionType } from "../constants"; -export function findRecentSpam(pluginData: PluginData, type: RecentActionType, userId?: string) { +export function findRecentSpam(pluginData: PluginData, type: RecentActionType, identifier?: string) { return pluginData.state.recentSpam.find(spam => { - return spam.type === type && (!userId || spam.userIds.includes(userId)); + return spam.type === type && (!identifier || spam.identifiers.includes(identifier)); }); } diff --git a/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts b/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts index 410aeaf2..3fbac2a6 100644 --- a/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts +++ b/backend/src/plugins/Automod/functions/getMatchingMessageRecentActions.ts @@ -9,19 +9,17 @@ export function getMatchingMessageRecentActions( pluginData: PluginData, message: SavedMessage, type: RecentActionType, + identifier: string, count: number, within: number, - perChannel: boolean, ) { const since = moment.utc(message.posted_at).valueOf() - within; const to = moment.utc(message.posted_at).valueOf(); - const identifier = perChannel ? `${message.channel_id}-${message.user_id}` : message.user_id; const recentActions = getMatchingRecentActions(pluginData, type, identifier, since, to); const totalCount = recentActions.reduce((total, action) => total + action.count, 0); if (totalCount >= count) { return { - identifier, recentActions, }; } diff --git a/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts b/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts index 70ed5472..b5638d04 100644 --- a/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts +++ b/backend/src/plugins/Automod/functions/getMatchingRecentActions.ts @@ -16,7 +16,8 @@ export function getMatchingRecentActions( action.type === type && (!identifier || action.identifier === identifier) && action.context.timestamp >= since && - action.context.timestamp <= to + action.context.timestamp <= to && + !action.context.actioned ); }); } diff --git a/backend/src/plugins/Automod/functions/getSpamIdentifier.ts b/backend/src/plugins/Automod/functions/getSpamIdentifier.ts new file mode 100644 index 00000000..084332a4 --- /dev/null +++ b/backend/src/plugins/Automod/functions/getSpamIdentifier.ts @@ -0,0 +1,5 @@ +import { SavedMessage } from "../../../data/entities/SavedMessage"; + +export function getMessageSpamIdentifier(message: SavedMessage, perChannel: boolean) { + return perChannel ? `${message.channel_id}-${message.user_id}` : message.user_id; +} diff --git a/backend/src/plugins/Automod/triggers/memberJoinSpam.ts b/backend/src/plugins/Automod/triggers/memberJoinSpam.ts index 29008775..2003a41c 100644 --- a/backend/src/plugins/Automod/triggers/memberJoinSpam.ts +++ b/backend/src/plugins/Automod/triggers/memberJoinSpam.ts @@ -36,7 +36,7 @@ export const MemberJoinSpamTrigger = automodTrigger()({ type: RecentActionType.MemberJoin, timestamp: Date.now(), archiveId: null, - userIds: [], + identifiers: [], }); return { diff --git a/backend/src/plugins/Automod/types.ts b/backend/src/plugins/Automod/types.ts index a017afe8..231e71f7 100644 --- a/backend/src/plugins/Automod/types.ts +++ b/backend/src/plugins/Automod/types.ts @@ -97,6 +97,6 @@ export interface RecentAction { export interface RecentSpam { archiveId: string; type: RecentActionType; - userIds: string[]; + identifiers: string[]; timestamp: number; }