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:
+8
-1
@@ -139,6 +139,9 @@ ${rssItems}
|
||||
commit_branch_filter: getSetting('commit_branch_filter') ?? '',
|
||||
ignored_repos: getSetting('ignored_repos') ?? '',
|
||||
weekly_recap_enabled: getSetting('weekly_recap_enabled') !== '0',
|
||||
devlog_threads_enabled: getSetting('devlog_threads_enabled') !== '0',
|
||||
bug_report_repo: getSetting('bug_report_repo') ?? 'D4rkst3r/EcoGame',
|
||||
watchdog_urls: getSetting('watchdog_urls') ?? '',
|
||||
};
|
||||
}
|
||||
|
||||
@@ -154,6 +157,7 @@ ${rssItems}
|
||||
botTag: client.user?.tag ?? null,
|
||||
uptimeSeconds: Math.floor(process.uptime()),
|
||||
guilds: client.guilds.cache.size,
|
||||
giteaTokenConfigured: Boolean(config.giteaApiToken),
|
||||
...stats,
|
||||
},
|
||||
};
|
||||
@@ -197,7 +201,10 @@ ${rssItems}
|
||||
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.devlog_threads_enabled !== undefined) {
|
||||
setSetting('devlog_threads_enabled', body.devlog_threads_enabled ? '1' : '0');
|
||||
}
|
||||
for (const key of ['commit_branch_filter', 'ignored_repos', 'bug_report_repo', 'watchdog_urls']) {
|
||||
if (body[key] !== undefined) {
|
||||
setSetting(key, String(body[key]).trim());
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import { join } from 'node:path';
|
||||
import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from 'discord.js';
|
||||
import { config } from '../config.js';
|
||||
import { saveDevlog } from '../db.js';
|
||||
import { devlogChannelId, devlogPingRoleId } from '../runtime-settings.js';
|
||||
import { devlogChannelId, devlogPingRoleId, devlogThreadsEnabled } from '../runtime-settings.js';
|
||||
import { imagesDir } from '../bot/devlog-archive.js';
|
||||
|
||||
const BRAND_YELLOW = 0xf5c518;
|
||||
@@ -154,6 +154,21 @@ export function registerDevlogEndpoint(app, client) {
|
||||
: {}),
|
||||
});
|
||||
|
||||
// Diskussions-Thread unterm Devlog (Fehler nicht fatal — z. B. fehlende Rechte)
|
||||
if (devlogThreadsEnabled() && typeof message.startThread === 'function') {
|
||||
try {
|
||||
const threadDate = new Intl.DateTimeFormat('de-DE', {
|
||||
day: '2-digit', month: '2-digit',
|
||||
}).format(new Date());
|
||||
await message.startThread({
|
||||
name: `💬 Devlog ${threadDate}`,
|
||||
autoArchiveDuration: 4320, // 3 Tage
|
||||
});
|
||||
} catch (error) {
|
||||
request.log.warn(`Devlog-Thread fehlgeschlagen: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Direkt archivieren (der Live-Listener ignoriert eigene Bot-Posts bewusst)
|
||||
const imageFiles = [];
|
||||
for (const [i, f] of files.entries()) {
|
||||
|
||||
+23
-1
@@ -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 };
|
||||
|
||||
Reference in New Issue
Block a user