Screenshots zu Ideen, und der Bot legt die Forum-Tags selbst an
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Zwei Fragen, zwei Antworten — eine davon ein Nein mit Umweg.

## Bilder im Eingabefenster: geht nicht

Discord-Modals koennen nur Textfelder. Kein Datei-Anhang, keine Umgehung — das
ist eine Grenze der Plattform, nicht unseres Codes.

Der Umweg ist besser als er klingt: Wer nach dem Einreichen einen Screenshot in
den Thread haengt, sieht ihn auf der Ideen-Seite. Die Bestaetigung nach dem
Absenden sagt das jetzt auch. Damit kann man auch nachtraeglich noch Bilder
dazulegen, was im Eingabefenster gar nicht ginge.

## Warum nicht einfach der Discord-Link

Discord haengt seit einiger Zeit eine Signatur an die Anhang-Links
(?ex=&is=&hm=), die nach etwa einem Tag ablaeuft. Ein gespeicherter Link zeigt
morgen ein kaputtes Bild. Deshalb laden Devlogs und Galerie seit dem ersten Tag
herunter — im Kopf von devlog-archive.js steht der Grund. Wuensche machen es
jetzt genauso, ausgeliefert unter /wish-assets/.

Beim Loeschen eines Beitrags oder eines ganzen Wunsches gehen die Dateien mit;
sonst waechst der Ordner mit Bildern, auf die nichts mehr zeigt.

Das Herunterladen stand vorher zweimal fast wortgleich im Code. Mit den
Wuenschen waeren es drei Kopien geworden — also einmal nach bot/bilder.js, und
Devlogs und Galerie ziehen mit um. Ein Fehler steckt jetzt an einer Stelle
statt an dreien.

## Forum-Tags per Knopf

Bisher musstest du sie von Hand anlegen. Jetzt macht es das Panel: die Bereiche
von dort plus die fuenf Staende, mit ihren Emojis. Vorhandene bleiben, auch
fremde — die Liste wird ergaenzt und nicht ersetzt. Discords Grenze von 20 Tags
wird eingehalten, was nicht mehr reinpasst, wird gemeldet statt still
verschluckt.

Geprueft: forumTagsAnlegen gegen eine Kanal-Attrappe — leeres Forum, teilweise
vorhandene, Gross/Kleinschreibung, fremde Tags, nichts zu tun (dann wird auch
nicht geschrieben), volles Forum, kein Forum, kein Kanal. Im Browser die
Ideen-Seite mit Bildern in einem Beitrag, einem Beitrag nur aus Bild ohne Text,
und der Lightbox darueber.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-02 00:17:01 +02:00
co-authored by Claude Opus 5
parent 5073e7bcf4
commit b3758f1f76
12 changed files with 237 additions and 74 deletions
+20 -2
View File
@@ -16,7 +16,7 @@ import {
saveTemplate, listTemplates, deleteTemplate,
getLevelRow, isPlaytester, saveWish, toggleWishVote, myWishVotes,
getWish, searchWishes, setWishStatus, mergeWish, deleteWish, wishVoters, setWishCategory,
wishComments,
wishComments, wishCommentImages,
listWishCategories, createWishCategory, updateWishCategory, deleteWishCategory,
logAudit, listAudit, playerHistory, uptimeBuckets, watchdogBuckets, watchdogDays,
heartbeatBuckets, heartbeatFirst,
@@ -36,8 +36,10 @@ import { lastResults, GAME_ICONS } from '../bot/server-monitor.js';
import { watchdogState, watchedServices } from '../bot/watchdog.js';
import { listRules, setRuleEnabled } from '../bot/automod.js';
import {
wunschAnlegen, wunschTagsAktualisieren, STATUS_LABEL, STATUS_EMOJI,
wunschAnlegen, wunschTagsAktualisieren, forumTagsAnlegen, wunschBilderDir,
STATUS_LABEL, STATUS_EMOJI,
} from '../bot/wishes.js';
import { bilderLoeschen } from '../bot/bilder.js';
import { heartbeatSerie } from '../bot/heartbeat.js';
import { publishAppForm, unpublishAppForm, MAX_QUESTIONS } from '../bot/app-forms.js';
import { sanitizeEmbed } from './api-v1.js';
@@ -2058,6 +2060,19 @@ ${rssItems}
return { deleted: weg, bereiche: listWishCategories(), wishes: topWishes(50) };
});
// Fehlende Tags im Forum anlegen — spart das Abtippen der Bereichsnamen
// und der fuenf Staende, und Tippfehler waeren hier stumme Fehlschlaege
app.post('/api/wish-categories/tags', async (request, reply) => {
if (requireScope(request, reply, 'community')) return;
try {
const res = await forumTagsAnlegen(client);
logAudit(getSessionUser(request), 'forum-tags angelegt', res.angelegt.join(', ') || 'keine');
return { ok: true, ...res };
} catch (error) {
return reply.code(400).send({ error: error.message });
}
});
// --- Wünsche verwalten (Team) ---
const STATUS = Object.fromEntries(Object.entries(STATUS_LABEL).map(([id, label]) => [
@@ -2162,7 +2177,10 @@ ${rssItems}
if (requireScope(request, reply, 'community')) return;
const wunsch = getWish(Number(request.params.id));
if (!wunsch) return { deleted: false, wishes: topWishes(50) };
// Erst die Dateinamen holen, dann loeschen — danach sind sie weg
const bilder = wishCommentImages(wunsch.id);
deleteWish(wunsch.id);
await bilderLoeschen(wunschBilderDir, bilder);
logAudit(getSessionUser(request), 'wunsch gelöscht', String(wunsch.idea).slice(0, 60));
return { deleted: true, wishes: topWishes(50) };
});