diff --git a/backend/src/plugins/Automod/actions/availableActions.ts b/backend/src/plugins/Automod/actions/availableActions.ts index c37f3a39..91d9fb4c 100644 --- a/backend/src/plugins/Automod/actions/availableActions.ts +++ b/backend/src/plugins/Automod/actions/availableActions.ts @@ -7,6 +7,7 @@ import { ArchiveThreadAction } from "./archiveThread"; import { BanAction } from "./ban"; import { ChangeNicknameAction } from "./changeNickname"; import { CleanAction } from "./clean"; +import { CrosspostMessageAction } from "./crosspostMessage"; import { KickAction } from "./kick"; import { LogAction } from "./log"; import { MuteAction } from "./mute"; @@ -36,6 +37,7 @@ export const availableActions: Record> = { set_slowmode: SetSlowmodeAction, start_thread: StartThreadAction, archive_thread: ArchiveThreadAction, + crosspost_message: CrosspostMessageAction, }; export const AvailableActions = t.type({ @@ -56,4 +58,5 @@ export const AvailableActions = t.type({ set_slowmode: SetSlowmodeAction.configType, start_thread: StartThreadAction.configType, archive_thread: ArchiveThreadAction.configType, + crosspost_message: CrosspostMessageAction.configType, }); diff --git a/backend/src/plugins/Automod/actions/crosspostMessage.ts b/backend/src/plugins/Automod/actions/crosspostMessage.ts new file mode 100644 index 00000000..9217da83 --- /dev/null +++ b/backend/src/plugins/Automod/actions/crosspostMessage.ts @@ -0,0 +1,26 @@ +import * as t from "io-ts"; +import { ChannelTypeStrings } from "../../../types"; +import { noop } from "../../../utils"; +import { automodAction } from "../helpers"; + +export const CrosspostMessageAction = automodAction({ + configType: t.type({}), + defaultConfig: {}, + + async apply({ pluginData, contexts }) { + const messages = contexts + .filter(c => c.message?.id) + .map(c => { + const channel = pluginData.guild.channels.cache.get(c.message!.channel_id); + if (channel?.type === ChannelTypeStrings.NEWS && channel.isText()) { + // .isText() to fix the typings + return channel.messages.fetch(c.message!.id); + } + return null; + }); + + for await (const msg of messages) { + if (msg?.crosspostable) await msg?.crosspost().catch(noop); + } + }, +});