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
+18 -3
View File
@@ -326,14 +326,21 @@ db.exec(`
author_id TEXT,
avatar TEXT,
content TEXT NOT NULL,
images TEXT NOT NULL DEFAULT '[]',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_wish_comments ON wish_comments (wish_id, created_at);
`);
{
const spalten = db.prepare('PRAGMA table_info(wish_comments)').all().map((c) => c.name);
if (!spalten.includes('images')) {
db.exec(`ALTER TABLE wish_comments ADD COLUMN images TEXT NOT NULL DEFAULT '[]'`);
}
}
const insertCommentStmt = db.prepare(`
INSERT OR REPLACE INTO wish_comments
(message_id, wish_id, author, author_id, avatar, content, created_at)
VALUES (@message_id, @wish_id, @author, @author_id, @avatar, @content, @created_at)
(message_id, wish_id, author, author_id, avatar, content, images, created_at)
VALUES (@message_id, @wish_id, @author, @author_id, @avatar, @content, @images, @created_at)
`);
const updateCommentStmt = db.prepare('UPDATE wish_comments SET content = ? WHERE message_id = ?');
const deleteCommentStmt = db.prepare('DELETE FROM wish_comments WHERE message_id = ?');
@@ -344,7 +351,15 @@ const dropCommentsStmt = db.prepare('DELETE FROM wish_comments WHERE wish_id = ?
export const saveWishComment = (c) => insertCommentStmt.run(c);
export const updateWishComment = (messageId, text) => updateCommentStmt.run(text, messageId).changes > 0;
export const deleteWishComment = (messageId) => deleteCommentStmt.run(messageId).changes > 0;
export const wishComments = (wishId, limit = 200) => listCommentsStmt.all(wishId, limit);
export const wishComments = (wishId, limit = 200) =>
listCommentsStmt.all(wishId, limit).map((c) => ({ ...c, images: JSON.parse(c.images || '[]') }));
/** Alle Bilddateien eines Wunsches — zum Wegräumen beim Löschen */
const wishImagesStmt = db.prepare('SELECT images FROM wish_comments WHERE wish_id = ?');
export const wishCommentImages = (wishId) =>
wishImagesStmt.all(wishId).flatMap((r) => JSON.parse(r.images || '[]'));
const commentImagesStmt = db.prepare('SELECT images FROM wish_comments WHERE message_id = ?');
export const wishCommentImagesOf = (messageId) =>
JSON.parse(commentImagesStmt.get(messageId)?.images || '[]');
const listWishCatsStmt = db.prepare('SELECT * FROM wish_categories ORDER BY sort, id');
const getWishCatStmt = db.prepare('SELECT * FROM wish_categories WHERE id = ?');