Emojis zum Anklicken, und Wuensche als Forums-Beitraege mit Tags
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Ueberall, wo ein Emoji nach Discord geht — Rollen-Menues, Ticket-Anliegen,
Wunsch-Bereiche, Portal-Kacheln — stand ein leeres Textfeld, in das man mit
Win+. hineintippen musste. Jetzt sitzt daneben ein Knopf mit einer Tafel:
sieben Gruppen, deutsche Suchbegriffe ("auto", "geld", "warnung"), ein Klick
schreibt ins Feld. Das Feld bleibt daneben stehen, denn Server-Emojis
(<:name:123>) kennt nur Discord.

Bewusst eine eigene Liste statt einer Bibliothek: die vollstaendige
Unicode-Tabelle waere ein halbes Megabyte fuer eine Handvoll Symbole, und die
Suchbegriffe duerfen deutsch sein.

## Forum-Tags

Ist der Voting-Kanal ein Forum, wird jeder Wunsch jetzt ein Forums-Beitrag
statt Nachricht-plus-Thread — und bekommt Tags fuer Bereich und Stand. Damit
laesst sich auch in Discord filtern, wofuer Tags ja da sind. Beim Wechsel des
Stands zieht das Tag mit: der alte fliegt raus, der neue kommt rein, der
Bereich bleibt stehen.

Zugeordnet wird ueber den Namen. Wer im Forum ein Tag "Fahrzeuge" anlegt,
bekommt es automatisch gesetzt; wer keines anlegt, verliert nichts. Bewusst
keine ID-Zuordnung im Panel — das waere eine zweite Liste, die man pflegen
muss und die beim ersten Umbenennen auseinanderlaeuft.

Dabei aufgefallen und mitgefixt: im Forum liegt die Startnachricht im Beitrag
selbst und nicht im Kanal. Der Status-Aktualisierer hat sie vorher im Kanal
gesucht und nicht gefunden — die Begruendung waere im Forum also nie im Post
gelandet. Und der Titel wird jetzt nur um den Stand ergaenzt statt
ueberschrieben, damit "🚗 Fahrzeuge" stehen bleibt.

Geprueft: tagsFuer gegen 20 Faelle — kein Forum, Medien-Kanal, fehlende Tags,
Gross/Kleinschreibung, Deckel bei fuenf (mehr nimmt Discord nicht), und alle
fuenf Staende einzeln. Im Browser die Emoji-Tafel an allen vier Stellen:
Suche, Escape, Klick daneben, Leeren, Uebernehmen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 23:45:18 +02:00
co-authored by Claude Opus 5
parent edf8fa14c5
commit cc7a51f02e
7 changed files with 366 additions and 26 deletions
+27 -15
View File
@@ -34,7 +34,9 @@ import { tuningStates, setTuning, tuning, TUNING_GROUPS } from '../tuning.js';
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 } from '../bot/wishes.js';
import {
wunschAnlegen, wunschTagsAktualisieren, STATUS_LABEL, STATUS_EMOJI,
} from '../bot/wishes.js';
import { heartbeatSerie } from '../bot/heartbeat.js';
import { publishAppForm, unpublishAppForm, MAX_QUESTIONS } from '../bot/app-forms.js';
import { sanitizeEmbed } from './api-v1.js';
@@ -2025,13 +2027,9 @@ ${rssItems}
// --- Wünsche verwalten (Team) ---
const STATUS = {
offen: { label: 'Wird geprüft', emoji: '💡' },
geplant: { label: 'Geplant', emoji: '📌' },
in_arbeit: { label: 'In Arbeit', emoji: '🔨' },
umgesetzt: { label: 'Umgesetzt', emoji: '✅' },
abgelehnt: { label: 'Nicht geplant', emoji: '🚫' },
};
const STATUS = Object.fromEntries(Object.entries(STATUS_LABEL).map(([id, label]) => [
id, { label, emoji: STATUS_EMOJI[id] },
]));
/**
* Den Wunsch-Post in Discord auf den neuen Stand bringen. Dort haben die
@@ -2042,16 +2040,29 @@ ${rssItems}
if (!wunsch.message_id) return;
const channelId = votingChannelId();
if (!channelId) return;
const channel = await client.channels.fetch(channelId).catch(() => null);
const message = await channel?.messages?.fetch(wunsch.message_id).catch(() => null);
// Im Forum liegt die Startnachricht im Beitrag selbst, nicht im Kanal —
// deshalb zuerst dort suchen, wo der Wunsch seinen Thread hat
const wo = wunsch.thread_id
? await client.channels.fetch(wunsch.thread_id).catch(() => null)
: null;
const channel = wo ?? await client.channels.fetch(channelId).catch(() => null);
let message = await channel?.messages?.fetch(wunsch.message_id).catch(() => null);
if (!message && wo) {
// Textkanal mit Thread darunter: die Nachricht steht eine Ebene höher
const eltern = await client.channels.fetch(channelId).catch(() => null);
message = await eltern?.messages?.fetch(wunsch.message_id).catch(() => null);
}
if (!message?.embeds?.[0]) return;
const s = STATUS[wunsch.status] ?? STATUS.offen;
const embed = EmbedBuilder.from(message.embeds[0])
.setTitle(`${s.emoji} Feature-Wunsch — ${s.label}`);
const felder = wunsch.status_grund
const alt = message.embeds[0];
// Den Kopf nur um den Stand ergänzen, nicht den Bereich überschreiben —
// dort steht „🚗 Fahrzeuge", das soll bleiben
const basis = String(alt.title ?? 'Feature-Wunsch').split(' — ')[0];
const embed = EmbedBuilder.from(alt).setTitle(`${basis}${s.emoji} ${s.label}`);
embed.setFields(wunsch.status_grund
? [{ name: 'Vom Team', value: String(wunsch.status_grund).slice(0, 1000) }]
: [];
embed.setFields(felder);
: []);
await message.edit({ embeds: [embed] }).catch(() => {});
}
@@ -2066,6 +2077,7 @@ ${rssItems}
const wunsch = getWish(id);
await wunschPostAktualisieren(wunsch);
await wunschTagsAktualisieren(client, wunsch, STATUS[status].label);
// Kreis schliessen: wer dafür gestimmt hat, erfährt es — aber nur beim
// Sprung auf umgesetzt, und nur einmal (vorher war ein anderer Status)