From 0eed39c09d8cd658d0c6502d59a13ae43d024762 Mon Sep 17 00:00:00 2001 From: seeyebe Date: Sun, 7 Dec 2025 23:08:57 +0200 Subject: [PATCH 1/2] feat: add AddReactionsAction automod action --- .../plugins/Automod/actions/addReactions.ts | 37 +++++++++++++++++++ .../Automod/actions/availableActions.ts | 2 + 2 files changed, 39 insertions(+) create mode 100644 backend/src/plugins/Automod/actions/addReactions.ts diff --git a/backend/src/plugins/Automod/actions/addReactions.ts b/backend/src/plugins/Automod/actions/addReactions.ts new file mode 100644 index 000000000..6326c36bc --- /dev/null +++ b/backend/src/plugins/Automod/actions/addReactions.ts @@ -0,0 +1,37 @@ +import { GuildTextBasedChannel, Snowflake } from "discord.js"; +import { z } from "zod"; +import { noop } from "../../../utils.js"; +import { automodAction } from "../helpers.js"; + +const configSchema = z.array(z.string()) + +export const AddReactionsAction = automodAction({ + configSchema, + + async apply({ pluginData, contexts, actionConfig }) { + const messageIdsByChannel = new Map>(); + + for (const context of contexts) { + if (context.message) { + if (!messageIdsByChannel.has(context.message.channel_id)) { + messageIdsByChannel.set(context.message.channel_id, new Set()); + } + messageIdsByChannel.get(context.message.channel_id)!.add(context.message.id); + } + } + + for (const [channelId, messageIds] of messageIdsByChannel.entries()) { + const channel = pluginData.guild.channels.cache.get(channelId as Snowflake) + if (!channel?.isTextBased?.()) continue; + + for (const messageId of messageIds) { + const msg = await channel.messages.fetch(messageId).catch(noop); + if (!msg) continue; + + for (const emoji of actionConfig) { + await msg.react(emoji).catch(noop); + } + } + } + }, +}); diff --git a/backend/src/plugins/Automod/actions/availableActions.ts b/backend/src/plugins/Automod/actions/availableActions.ts index e499a42d4..c1161a1e7 100644 --- a/backend/src/plugins/Automod/actions/availableActions.ts +++ b/backend/src/plugins/Automod/actions/availableActions.ts @@ -1,4 +1,5 @@ import { AutomodActionBlueprint } from "../helpers.js"; +import { AddReactionsAction } from "./addReactions.js"; import { AddRolesAction } from "./addRoles.js"; import { AddToCounterAction } from "./addToCounter.js"; import { AlertAction } from "./alert.js"; @@ -29,6 +30,7 @@ export const availableActions = { change_nickname: ChangeNicknameAction, log: LogAction, add_roles: AddRolesAction, + add_reactions: AddReactionsAction, remove_roles: RemoveRolesAction, set_antiraid_level: SetAntiraidLevelAction, reply: ReplyAction, From 1f1d924576342ed60c8c8312c20d990b0e4901ec Mon Sep 17 00:00:00 2001 From: seeyebe <85168740+seeyebe@users.noreply.github.com> Date: Mon, 8 Dec 2025 00:34:29 +0200 Subject: [PATCH 2/2] fix: remove unused import --- backend/src/plugins/Automod/actions/addReactions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/addReactions.ts b/backend/src/plugins/Automod/actions/addReactions.ts index 6326c36bc..72a627ce4 100644 --- a/backend/src/plugins/Automod/actions/addReactions.ts +++ b/backend/src/plugins/Automod/actions/addReactions.ts @@ -1,4 +1,4 @@ -import { GuildTextBasedChannel, Snowflake } from "discord.js"; +import { Snowflake } from "discord.js"; import { z } from "zod"; import { noop } from "../../../utils.js"; import { automodAction } from "../helpers.js";