Skip to content
Open
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
57 changes: 54 additions & 3 deletions backend/src/api/archives.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,58 @@
import express, { Request, Response } from "express";
import moment from "moment-timezone";
import { Configs } from "../data/Configs.js";
import { GuildArchives } from "../data/GuildArchives.js";
import { defaultDateFormats } from "../plugins/TimeAndDate/defaultDateFormats.js";
import { zTimeAndDateConfig } from "../plugins/TimeAndDate/types.js";
import { zZeppelinGuildConfig } from "../types.js";
import { loadYamlSafely } from "../utils/loadYamlSafely.js";
import { notFound } from "./responses.js";

const defaultTimeAndDateConfig = zTimeAndDateConfig.parse({});
function getDefaultTimeAndDateSettings() {
return {
timezone: defaultTimeAndDateConfig.timezone,
dateFormats: { ...defaultTimeAndDateConfig.date_formats },
};
}

async function getTimeAndDateSettingsForGuild(guildId: string, configs: Configs) {
try {
const configEntry = await configs.getActiveByKey(`guild-${guildId}`);
if (!configEntry?.config) {
return getDefaultTimeAndDateSettings();
}

const parsedConfig = loadYamlSafely(configEntry.config);
const guildConfig = zZeppelinGuildConfig.safeParse(parsedConfig);
if (!guildConfig.success) {
return getDefaultTimeAndDateSettings();
}

const pluginOptions = guildConfig.data.plugins?.time_and_date;
if (!pluginOptions || typeof pluginOptions !== "object") {
return getDefaultTimeAndDateSettings();
}

const basePluginConfig =
typeof (pluginOptions as any).config === "object" ? (pluginOptions as any).config : pluginOptions;
const pluginConfig = zTimeAndDateConfig.safeParse(basePluginConfig ?? {});
if (!pluginConfig.success) {
return getDefaultTimeAndDateSettings();
}

return {
timezone: pluginConfig.data.timezone,
dateFormats: pluginConfig.data.date_formats,
};
} catch {
return getDefaultTimeAndDateSettings();
}
}

export function initArchives(router: express.Router) {
const archives = new GuildArchives(null);
const configs = new Configs();

// Legacy redirect
router.get("/spam-logs/:id", (req: Request, res: Response) => {
Expand All @@ -18,13 +66,16 @@ export function initArchives(router: express.Router) {
let body = archive.body;

// Add some metadata at the end of the log file (but only if it doesn't already have it directly in the body)
// TODO: Use server timezone / date formats
if (archive.body.indexOf("Log file generated on") === -1) {
const createdAt = moment.utc(archive.created_at).format("YYYY-MM-DD [at] HH:mm:ss [(+00:00)]");
const timeAndDate = await getTimeAndDateSettingsForGuild(archive.guild_id, configs);
const prettyDatetimeFormat =
timeAndDate.dateFormats.pretty_datetime ?? defaultDateFormats.pretty_datetime;

const createdAt = moment.utc(archive.created_at).tz(timeAndDate.timezone).format(prettyDatetimeFormat);
body += `\n\nLog file generated on ${createdAt}`;

if (archive.expires_at !== null) {
const expiresAt = moment.utc(archive.expires_at).format("YYYY-MM-DD [at] HH:mm:ss [(+00:00)]");
const expiresAt = moment.utc(archive.expires_at).tz(timeAndDate.timezone).format(prettyDatetimeFormat);
body += `\nExpires at ${expiresAt}`;
}
}
Expand Down
Loading