PronounsPage/server/calendar.ts
2024-05-20 12:53:15 +02:00

85 lines
2.8 KiB
TypeScript

import './setup.ts';
import Pageres from 'pageres';
import fs from 'fs';
import dbConnection from './db.ts';
import Suml from 'suml';
import { calendar } from '../src/calendar/calendar.ts';
import type { Config } from '../locale/config.ts';
const __dirname = new URL('.', import.meta.url).pathname;
const loadSuml = (name: string): unknown => new Suml().parse(fs.readFileSync(`${__dirname}/../data/${name}.suml`).toString());
const config = loadSuml('config') as Config;
const dir = `${__dirname}/../static/calendar`;
const force = process.argv[2] === '-f' || process.argv[2] === '--force';
const shoot = async (url: string, filename: string): Promise<void> => {
const pr = new Pageres({
delay: 3,
scale: 2,
});
pr.src(process.env.BASE_URL + url, ['1500x300']);
for (const buffer of await pr.run()) {
fs.mkdirSync(dir, { recursive: true });
const target = `${dir}/${filename}.png`;
console.log(target);
fs.writeFileSync(target, buffer);
}
};
const dumpNameDays = async (): Promise<void> => {
if (!config.names || !config.names.enabled || !config.names.namedays) {
return;
}
const db = await dbConnection();
const names = await db.all(`
SELECT n.name, n.namedays
FROM names n
WHERE n.namedays IS NOT NULL
AND approved = 1
AND deleted = 0
`);
const output: Record<string, string[]> = {};
for (const { name, namedays } of names) {
output[name] = namedays.split('|');
}
fs.writeFileSync(`${__dirname}/../data/names/namedays.json`, JSON.stringify(output));
};
(async (): Promise<void> => {
if (!config.calendar?.enabled) {
return;
}
const prevPath = `${__dirname}/../cache/calendar.json`;
const prev = fs.existsSync(prevPath) ? JSON.parse(fs.readFileSync(prevPath, 'utf-8')) : {};
const current = calendar.buildSummary();
const changedYears = new Set();
for (const day in current) {
if (!current.hasOwnProperty(day)) {
continue;
}
const year = day.substring(0, 4);
if (current[day] !== prev[day] || !fs.existsSync(`${dir}/${day}.png`) || force) {
await shoot(`/${config.calendar.route}/${day}?layout=basic`, `${day}`);
changedYears.add(year);
}
if (!fs.existsSync(`${dir}/${year}-overview.png`) || !fs.existsSync(`${dir}/${year}-labels.png`) || force) {
changedYears.add(year);
}
}
for (const year of changedYears) {
await shoot(`/${config.calendar.route}/${year}?layout=basic`, `${year}-overview`);
await shoot(`/${config.calendar.route}/${year}?layout=basic&labels=true`, `${year}-labels`);
}
fs.writeFileSync(prevPath, JSON.stringify(current, null, 4));
await dumpNameDays();
})();