Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions backend/src/data/DefaultLogMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@
"ROLE_UPDATE": "{timestamp} 🖊 Role **{newRole.name}** (`{newRole.id}`) was edited. Changes:\n{differenceString}",

"MESSAGE_EDIT": "{timestamp} ✏ {userMention(user)} edited their message (`{after.id}`) in {channelMention(channel)}:\n**Before:**{messageSummary(before)}**After:**{messageSummary(after)}",
"MESSAGE_DELETE": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"MESSAGE_DELETE": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"MESSAGE_DELETE_BULK": "{timestamp} 🗑 **{count}** messages by {authorIds} deleted in {channelMention(channel)} ({archiveUrl})",
"MESSAGE_DELETE_BARE": "{timestamp} 🗑 Message (`{messageId}`) deleted in {channelMention(channel)} (no more info available)",
"MESSAGE_DELETE_AUTO": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"MESSAGE_DELETE_AUTO": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",

"VOICE_CHANNEL_JOIN": "{timestamp} 🎙 🔵 {userMention(member)} joined {channelMention(channel)}",
"VOICE_CHANNEL_MOVE": "{timestamp} 🎙 ↔ {userMention(member)} moved from {channelMention(oldChannel)} to {channelMention(newChannel)}",
Expand Down
8 changes: 8 additions & 0 deletions backend/src/data/GuildSavedMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,14 @@ export class GuildSavedMessages extends BaseGuildRepository<SavedMessage> {
}));
}

if (msg.reference && (msg.reference.messageId || msg.reference.channelId || msg.reference.guildId)) {
data.reference = {
messageId: msg.reference.messageId ?? null,
channelId: msg.reference.channelId ?? null,
guildId: msg.reference.guildId ?? null,
};
}

return data;
}

Expand Down
5 changes: 5 additions & 0 deletions backend/src/data/entities/SavedMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ export interface ISavedMessageData {
embeds?: ISavedMessageEmbedData[];
stickers?: ISavedMessageStickerData[];
timestamp: number;
reference?: {
messageId?: Snowflake | null;
channelId?: Snowflake | null;
guildId?: Snowflake | null;
};
}

@Entity("messages")
Expand Down
7 changes: 6 additions & 1 deletion backend/src/plugins/Logs/logFunctions/logMessageDelete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@ import {
import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js";
import { LogsPluginType } from "../types.js";
import { log } from "../util/log.js";
import { getMessageReplyLogInfo } from "../util/getMessageReplyLogInfo.js";

export interface LogMessageDeleteData {
user: User | UnknownUser;
channel: GuildTextBasedChannel;
message: SavedMessage;
}

export function logMessageDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteData) {
export async function logMessageDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteData) {
// Replace attachment URLs with media URLs
if (data.message.data.attachments) {
for (const attachment of data.message.data.attachments as ISavedMessageAttachmentData[]) {
Expand All @@ -33,6 +34,8 @@ export function logMessageDelete(pluginData: GuildPluginData<LogsPluginType>, da
const config = pluginData.config.get();
const timestampFormat = config.timestamp_format ?? undefined;

const { replyInfo, reply } = await getMessageReplyLogInfo(pluginData, data.message);

return log(
pluginData,
LogType.MESSAGE_DELETE,
Expand All @@ -44,6 +47,8 @@ export function logMessageDelete(pluginData: GuildPluginData<LogsPluginType>, da
.getPlugin(TimeAndDatePlugin)
.inGuildTz(moment.utc(data.message.data.timestamp, "x"))
.format(timestampFormat),
replyInfo,
reply,
}),
{
userId: data.user.id,
Expand Down
17 changes: 14 additions & 3 deletions backend/src/plugins/Logs/logFunctions/logMessageDeleteAuto.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { GuildBasedChannel, User } from "discord.js";
import { GuildPluginData } from "vety";
import { LogType } from "../../../data/LogType.js";
import { SavedMessage } from "../../../data/entities/SavedMessage.js";
import { ISavedMessageAttachmentData, SavedMessage } from "../../../data/entities/SavedMessage.js";
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter.js";
import { UnknownUser } from "../../../utils.js";
import { UnknownUser, useMediaUrls } from "../../../utils.js";
import { resolveChannelIds } from "../../../utils/resolveChannelIds.js";
import {
channelToTemplateSafeChannel,
Expand All @@ -12,6 +12,7 @@ import {
} from "../../../utils/templateSafeObjects.js";
import { LogsPluginType } from "../types.js";
import { log } from "../util/log.js";
import { getMessageReplyLogInfo } from "../util/getMessageReplyLogInfo.js";

export interface LogMessageDeleteAutoData {
message: SavedMessage;
Expand All @@ -20,7 +21,15 @@ export interface LogMessageDeleteAutoData {
messageDate: string;
}

export function logMessageDeleteAuto(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteAutoData) {
export async function logMessageDeleteAuto(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteAutoData) {
if (data.message.data.attachments) {
for (const attachment of data.message.data.attachments as ISavedMessageAttachmentData[]) {
attachment.url = useMediaUrls(attachment.url);
}
}

const { replyInfo, reply } = await getMessageReplyLogInfo(pluginData, data.message);

return log(
pluginData,
LogType.MESSAGE_DELETE_AUTO,
Expand All @@ -29,6 +38,8 @@ export function logMessageDeleteAuto(pluginData: GuildPluginData<LogsPluginType>
user: userToTemplateSafeUser(data.user),
channel: channelToTemplateSafeChannel(data.channel),
messageDate: data.messageDate,
replyInfo,
reply,
}),
{
userId: data.user.id,
Expand Down
4 changes: 4 additions & 0 deletions backend/src/plugins/Logs/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,8 @@ export const LogTypeData = z.object({
channel: z.instanceof(TemplateSafeChannel),
messageDate: z.string(),
message: z.instanceof(TemplateSafeSavedMessage),
replyInfo: z.string(),
reply: z.instanceof(TemplateSafeValueContainer).nullable(),
}),

[LogType.MESSAGE_DELETE_BULK]: z.object({
Expand Down Expand Up @@ -489,6 +491,8 @@ export const LogTypeData = z.object({
user: z.instanceof(TemplateSafeUser),
channel: z.instanceof(TemplateSafeChannel),
messageDate: z.string(),
replyInfo: z.string(),
reply: z.instanceof(TemplateSafeValueContainer).nullable(),
}),

[LogType.SET_ANTIRAID_USER]: z.object({
Expand Down
60 changes: 60 additions & 0 deletions backend/src/plugins/Logs/util/getMessageReplyLogInfo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { GuildPluginData } from "knub";
import { ISavedMessageAttachmentData, SavedMessage } from "../../../data/entities/SavedMessage.js";
import { messageLink, messageSummary, useMediaUrls } from "../../../utils.js";
import { TemplateSafeValueContainer } from "../../../templateFormatter.js";
import { savedMessageToTemplateSafeSavedMessage, TemplateSafeSavedMessage } from "../../../utils/templateSafeObjects.js";
import { LogsPluginType } from "../types.js";

export interface MessageReplyLogInfo {
replyInfo: string;
reply: TemplateSafeValueContainer | null;
}

export async function getMessageReplyLogInfo(
pluginData: GuildPluginData<LogsPluginType>,
message: SavedMessage,
): Promise<MessageReplyLogInfo> {
const reference = message.data.reference;
if (!reference?.messageId || !reference.channelId) {
return { replyInfo: "", reply: null };
}

const link = messageLink(reference.guildId ?? message.guild_id, reference.channelId, reference.messageId);
let replyInfo = `\n**Replied To:** [Jump to message](${link})`;

const referencedMessage = await pluginData.state.savedMessages.find(reference.messageId, true);

let timestamp: string | null = null;
let summary: string | null = null;
let timestampMs: number | null = null;
let templateSafeMessage: TemplateSafeSavedMessage | null = null;

if (referencedMessage) {
if (referencedMessage.data.attachments) {
for (const attachment of referencedMessage.data.attachments as ISavedMessageAttachmentData[]) {
attachment.url = useMediaUrls(attachment.url);
}
}

timestampMs = referencedMessage.data.timestamp;
timestamp = `<t:${Math.floor(timestampMs / 1000)}>`;
replyInfo += ` (posted at ${timestamp})`;

summary = messageSummary(referencedMessage);
if (summary) {
replyInfo += `\n${summary}`;
}

templateSafeMessage = savedMessageToTemplateSafeSavedMessage(referencedMessage);
}

const reply = new TemplateSafeValueContainer({
link,
timestamp,
timestampMs,
summary,
message: templateSafeMessage,
});

return { replyInfo, reply };
}
9 changes: 9 additions & 0 deletions backend/src/utils/templateSafeObjects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ export class TemplateSafeSavedMessageData extends TemplateSafeValueContainer {
embeds?: Array<TypedTemplateSafeValueContainer<ISavedMessageEmbedData>>;
stickers?: Array<TypedTemplateSafeValueContainer<ISavedMessageStickerData>>;
timestamp: number;
reference?: TypedTemplateSafeValueContainer<ISavedMessageData["reference"]>;

constructor(data: InputProps<TemplateSafeSavedMessageData>) {
super();
Expand Down Expand Up @@ -445,6 +446,14 @@ export function savedMessageToTemplateSafeSavedMessage(savedMessage: SavedMessag
),

timestamp: savedMessage.data.timestamp,

reference: savedMessage.data.reference
? (new TemplateSafeValueContainer({
messageId: savedMessage.data.reference.messageId ?? null,
channelId: savedMessage.data.reference.channelId ?? null,
guildId: savedMessage.data.reference.guildId ?? null,
}) as TypedTemplateSafeValueContainer<ISavedMessageData["reference"]>)
: undefined,
}),
});
}
Expand Down
18 changes: 9 additions & 9 deletions config-checker/public/config-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -9210,7 +9210,7 @@
]
},
"MESSAGE_DELETE": {
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -9650,7 +9650,7 @@
]
},
"MESSAGE_DELETE_AUTO": {
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -10037,7 +10037,7 @@
]
},
"MESSAGE_DELETE": {
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -10477,7 +10477,7 @@
]
},
"MESSAGE_DELETE_AUTO": {
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -11153,7 +11153,7 @@
]
},
"MESSAGE_DELETE": {
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -11593,7 +11593,7 @@
]
},
"MESSAGE_DELETE_AUTO": {
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -11980,7 +11980,7 @@
]
},
"MESSAGE_DELETE": {
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Message (`{message.id}`) from {userMention(user)} deleted in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -12420,7 +12420,7 @@
]
},
"MESSAGE_DELETE_AUTO": {
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}",
"default": "{timestamp} 🗑 Auto-deleted message (`{message.id}`) from {userMention(user)} in {channelMention(channel)} (originally posted at **{messageDate}**):{messageSummary(message)}{replyInfo}",
"anyOf": [
{
"type": "string"
Expand Down Expand Up @@ -20882,4 +20882,4 @@
}
},
"$schema": "https://json-schema.org/draft-2020-12/schema"
}
}
Loading