diff --git a/backend/src/plugins/Automod/actions/addReactions.ts b/backend/src/plugins/Automod/actions/addReactions.ts new file mode 100644 index 000000000..72a627ce4 --- /dev/null +++ b/backend/src/plugins/Automod/actions/addReactions.ts @@ -0,0 +1,37 @@ +import { 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,