From 416384c8fa981bf17dcf0abfe44d4b9810ca2656 Mon Sep 17 00:00:00 2001 From: Rory& Date: Sun, 19 Oct 2025 08:24:28 +0200 Subject: [PATCH] Helper to create valid messages --- .../channels/#channel_id/messages/index.ts | 4 +- src/util/entities/Message.ts | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/api/routes/channels/#channel_id/messages/index.ts b/src/api/routes/channels/#channel_id/messages/index.ts index 2b1ce592..6c9aa440 100644 --- a/src/api/routes/channels/#channel_id/messages/index.ts +++ b/src/api/routes/channels/#channel_id/messages/index.ts @@ -457,13 +457,15 @@ router.post( for (const action of alertActions) { const alertChannel = await Channel.findOne({ where: { id: action.metadata.channel_id } }); if (!alertChannel) continue; - const msg = Message.create({ + const msg = await Message.createWithDefaults({ channel_id: alertChannel.id, content: `Automod Alert: Message ${message.id} by <@${message.author_id}> in <#${channel.id}> triggered automod rule "${rule.name}".\nMatched terms: ${matches .map((x) => `\`${x![0]}\``) .join(", ")}`, author: message.author, guild_id: message.guild_id, + member_id: message.member_id, + author_id: message.author_id }); await Promise.all([ Message.insert(message), diff --git a/src/util/entities/Message.ts b/src/util/entities/Message.ts index 169f9324..2b516c74 100644 --- a/src/util/entities/Message.ts +++ b/src/util/entities/Message.ts @@ -254,4 +254,45 @@ export class Message extends BaseClass { attachments: this.attachments?.map((attachment: Attachment) => Attachment.prototype.signUrls.call(attachment, data)), }; } + + static async createWithDefaults(opts: Partial): Promise { + const message = new Message(); + if (!opts.author) { + if (!opts.author_id) throw new Error("Either author or author_id must be provided to create a Message"); + message.author = await User.findOneOrFail({ where: { id: opts.author_id! } }); + } + + if (!opts.member) { + if (opts.member_id) message.member = await Member.findOneOrFail({ where: { id: opts.member_id! } }); + else if (message.author && opts.guild_id) message.member = await Member.findOneOrFail({ where: { id: message.author.id, guild_id: opts.guild_id! } }); + } + + if (!opts.channel) { + if (!opts.channel_id) throw new Error("Either channel or channel_id must be provided to create a Message"); + message.channel = await Channel.findOneOrFail({ where: { id: opts.channel_id! } }); + } + + if (!opts.guild) { + if (opts.guild_id) message.guild = await Guild.findOneOrFail({ where: { id: opts.guild_id! } }); + else if (opts.channel?.guild) message.guild = opts.channel.guild; + else if (opts.channel?.guild_id) message.guild = await Guild.findOneOrFail({ where: { id: opts.channel.guild_id! } }); + else if (opts.member?.guild) message.guild = opts.member.guild; + else if (opts.member?.guild_id) message.guild = await Guild.findOneOrFail({ where: { id: opts.member.guild_id! } }); + else throw new Error("Either guild, guild_id, channel.guild, channel.guild_id, member.guild or member.guild_id must be provided to create a Message"); + } + + // try 2 now that we have a guild + if (!opts.member) message.member = await Member.findOneOrFail({ where: { id: message.author!.id, guild_id: message.guild!.id } }); + + Object.assign(message, { + tts: false, + embeds: [], + reactions: [], + flags: 0, + type: 0, + timestamp: new Date(), + ...opts, + }); + return message; + } }