Wochen-Rückblick: sonntags 20:00 automatisch in den Devlog-Kanal

- Scheduler (5-Minuten-Check, dedupe über last_weekly_recap-Setting)
- Embed: Commits pro Tag als Balken-Grafik, Commit-/Devlog-Zahlen, Top-Projekte
- Setting weekly_recap_enabled + 'Rückblick jetzt testen'-Button auf der Setup-Seite
- TZ Europe/Berlin im Compose (Scheduler + Datumsformate)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 10:41:17 +02:00
co-authored by Claude Opus 4.8
parent 247e8c805c
commit 3c8f442d6c
6 changed files with 144 additions and 1 deletions
+16
View File
@@ -138,6 +138,7 @@ ${rssItems}
commit_feed_enabled: getSetting('commit_feed_enabled') !== '0',
commit_branch_filter: getSetting('commit_branch_filter') ?? '',
ignored_repos: getSetting('ignored_repos') ?? '',
weekly_recap_enabled: getSetting('weekly_recap_enabled') !== '0',
};
}
@@ -193,6 +194,9 @@ ${rssItems}
if (body.commit_feed_enabled !== undefined) {
setSetting('commit_feed_enabled', body.commit_feed_enabled ? '1' : '0');
}
if (body.weekly_recap_enabled !== undefined) {
setSetting('weekly_recap_enabled', body.weekly_recap_enabled ? '1' : '0');
}
for (const key of ['commit_branch_filter', 'ignored_repos']) {
if (body[key] !== undefined) {
setSetting(key, String(body[key]).trim());
@@ -208,6 +212,18 @@ ${rssItems}
if (requireAdmin(request, reply)) return;
const target = request.params.target;
// Sonderfall: echten Wochen-Rückblick sofort posten
if (target === 'recap') {
try {
const { postWeeklyRecap } = await import('../bot/weekly-recap.js');
await postWeeklyRecap(client);
return { ok: true };
} catch (error) {
request.log.error({ err: error }, 'Wochen-Rückblick-Test fehlgeschlagen');
return reply.code(502).send({ error: 'Senden fehlgeschlagen' });
}
}
const channelId =
target === 'commit' ? commitChannelId()
: target === 'devlog' ? devlogChannelId()