Emojis zum Anklicken, und Wuensche als Forums-Beitraege mit Tags
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:
+27
-15
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user