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
+44
View File
@@ -178,11 +178,55 @@ export default function Settings({ me }) {
<span className="field-hint">Commits pro Tag, Devlogs & Top-Projekte in den Devlog-Kanal</span>
</label>
</div>
<div className="field">
<label className="toggle">
<input
type="checkbox"
checked={form.devlog_threads_enabled}
onChange={(e) => setForm({ ...form, devlog_threads_enabled: e.target.checked })}
/>
<span>Diskussions-Thread unter jedem Devlog</span>
<span className="field-hint">Bot öffnet automatisch 💬 Devlog &lt;Datum&gt;"</span>
</label>
</div>
<div className="field">
<button className="btn" onClick={() => sendTest('recap')}>Rückblick jetzt testen</button>
</div>
</div>
{/* Bug-Reports */}
<div className="settings-section">
<h2 className="settings-title">// Bug-Reports (/bug)</h2>
{!data.status.giteaTokenConfigured && (
<p className="notice" style={{ padding: '0 0 .8rem' }}>
⚠️ Kein <code>GITEA_API_TOKEN</code> gesetzt — /bug ist deaktiviert.
</p>
)}
<div className="field">
<label>Ziel-Repo <span className="field-hint">hier landen die Issues aus /bug</span></label>
<input
type="text"
placeholder="D4rkst3r/EcoGame"
value={form.bug_report_repo}
onChange={(e) => setForm({ ...form, bug_report_repo: e.target.value })}
/>
</div>
</div>
{/* Watchdog */}
<div className="settings-section">
<h2 className="settings-title">// Watchdog</h2>
<div className="field">
<label>Überwachte URLs <span className="field-hint">kommagetrennt; bei Ausfall gibt's eine DM — leer = aus</span></label>
<input
type="text"
placeholder="https://git.d4rkst3r.de, https://bot.d4rkst3r.de/health"
value={form.watchdog_urls}
onChange={(e) => setForm({ ...form, watchdog_urls: e.target.value })}
/>
</div>
</div>
{/* Commit-Feed */}
<div className="settings-section">
<h2 className="settings-title">// Commit-Feed</h2>