diff --git a/src/api/routes/channels/#channel_id/messages/index.ts b/src/api/routes/channels/#channel_id/messages/index.ts
index 2b1ce5921..6c9aa4403 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 169f93247..2b516c74c 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<Message>): Promise<Message> {
+ 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;
+ }
}
|