Bug-Reports, Devlog-Threads und Watchdog

- /bug (alle Member): erstellt Gitea-Issue inkl. Screenshot-Upload als Asset;
  bug_reports-Tabelle für den Rückkanal — Issue geschlossen (issues-Webhook)
  → DM an den Reporter
- Auto-Thread '💬 Devlog <Datum>' unter jedem Devlog-Post (Setting, Default an)
- Watchdog: prüft Setting watchdog_urls alle 2 min, DM an Admin nach 2 Fails
  in Folge + Entwarnung mit Downtime-Dauer
- Setup-Seite: Bug-Repo, Threads-Toggle, Watchdog-URLs; Env GITEA_API_TOKEN/GITEA_URL

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 11:29:01 +02:00
co-authored by Claude Opus 4.8
parent 4fb3a6d02c
commit 07c3bf47d0
15 changed files with 359 additions and 4 deletions
+23 -1
View File
@@ -8,7 +8,7 @@ import { existsSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
import { config } from '../config.js';
import { saveCommits, saveRelease } from '../db.js';
import { saveCommits, saveRelease, takeBugReport } from '../db.js';
import { commitFeedEnabled, branchAllowed, repoIgnored } from '../runtime-settings.js';
import { postPushEmbed } from '../bot/commit-feed.js';
import { postReleaseEmbed } from '../bot/release-feed.js';
@@ -140,6 +140,28 @@ export async function startWebServer(client) {
return { ok: true, release: release.tag, posted };
}
// Issue geschlossen → Rückkanal-DM an den Discord-Reporter (/bug)
if (event === 'issues') {
const payload = request.body;
if (payload.action === 'closed' && payload.issue?.number) {
const repo = payload.repository?.full_name ?? '';
const report = takeBugReport(repo, payload.issue.number);
if (report) {
try {
const user = await client.users.fetch(report.discord_user_id);
await user.send(
`✅ Dein gemeldeter Bug **„${report.title}"** wurde behoben!\n` +
`Issue [#${payload.issue.number}](${payload.issue.html_url ?? ''}) ist geschlossen — danke für den Report! 🙌`
);
request.log.info(`Bug-Report-DM an ${report.discord_user_id} (Issue #${payload.issue.number})`);
} catch (error) {
request.log.warn(`Bug-Report-DM fehlgeschlagen: ${error.message}`);
}
}
}
return { ok: true, event: 'issues' };
}
// Andere Events (Tag, Issue, …) freundlich ignorieren
if (event !== 'push') {
return { ok: true, ignored: event };