Modul-Felder speichern wieder, und die Feed-Adresse ist einstellbar
Die LS-Kanaele liessen sich im Panel waehlen und waren nach dem Speichern wieder leer. Der Grund: PUT /api/settings fuehrt fuer jede Feldart eine von Hand gepflegte Liste erlaubter Schluessel, und ein Schluessel, der nirgends steht, faellt still durch. Keine Fehlermeldung, kein Log — das Feld sieht funktionsfaehig aus und vergisst. Das ist keine Einzelheit, sondern eine Falle fuer jedes kuenftige Modul: wer eins ergaenzt und diese Listen nicht mitpflegt, baut denselben Fehler nach. Die Modulliste weiss laengst, welche Felder es gibt und welcher Art sie sind — also holt der Handler sie jetzt von dort, statt sie ein zweites Mal aufzuzaehlen. Beim Bauen des Helfers ware ich fast in die naechste Falle gelaufen: ich hatte alle requires-Eintraege als Kanaele eingestuft. Dort stehen aber auch gitea_api_token und watchdog_urls, und die haetten dann die Kanal-Pruefung durchlaufen — Speichern waere mit "Kanal nicht gefunden" gescheitert, sobald jemand seinen Gitea-Token aendert. Uebernommen wird jetzt nur, was der Namenskonvention folgt. Dazu die fest verdrahtete Feed-Adresse. http://host:port/feed war eine Wette auf drei Annahmen gleichzeitig: dass jeder Hoster http nimmt, den Feed unter /feed ablegt und keinen Pfad davorsetzt. Aendern konnte das niemand. Jetzt gibt es ein Feld dafuer, und wer die ganze Abfrage-URL ins Host-Feld einfuegt, bekommt es mitsamt Schema und Pfad automatisch ausgefuellt. Was dahinter kommt (dedicated-server-stats.xml und Geschwister) gibt Giants vor und bleibt im Code. Geprueft: jedes Feld jedes Moduls landet in einem Eimer — der Test faellt kuenftig aus, sobald jemand ein Feld ergaenzt, das nicht speicherbar waere. Dazu, dass nichts faelschlich in die Kanal- oder Rollenpruefung geraet, keine Dubletten, und die Feed-Basis mit eigenem Pfad, https, ueberzaehligen Schraegstrichen sowie sechs Sorten Unbrauchbarem. Das Einfuegen einer https-URL mit Pfad im laufenden Panel angesehen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -432,6 +432,43 @@ export function moduleDetail(id) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Alle Einstellungs-Schlüssel aus der Modulliste, nach Art sortiert.
|
||||
*
|
||||
* Der Speicher-Handler hatte für jede Art eine von Hand gepflegte Liste. Wer
|
||||
* ein Modul ergänzte und diese Listen nicht mitpflegte, bekam ein Feld, das
|
||||
* sich bedienen liess und beim Speichern stillschweigend verfiel — ohne
|
||||
* Fehlermeldung, weil unbekannte Schlüssel einfach durchfielen. Genau das ist
|
||||
* beim LS-Modul passiert.
|
||||
*
|
||||
* Bei `fields` sagt `art`, worum es geht. Bei `requires` steht das nicht dabei
|
||||
* — dort stehen Kanäle neben Rollen, dem Gitea-Token und der Adressliste des
|
||||
* Wächters. Deshalb wird dort nur übernommen, was der Namenskonvention folgt:
|
||||
* `…_channel_id` ist ein Kanal, `…_role_id` eine Rolle. Alles andere bleibt
|
||||
* aussen vor und wird weiter von seinem eigenen Zweig behandelt. Ein Token in
|
||||
* die Kanal-Prüfung zu schicken hiesse „Kanal nicht gefunden" beim Speichern.
|
||||
*
|
||||
* @returns {{kanal: string[], rolle: string[], text: string[], farbe: string[], zahl: string[], schalter: string[]}}
|
||||
*/
|
||||
export function moduleSettingKeys() {
|
||||
const raus = { kanal: [], rolle: [], text: [], farbe: [], zahl: [], schalter: [] };
|
||||
for (const mod of MODULES) {
|
||||
for (const r of mod.requires ?? []) {
|
||||
if (!r.setting) continue;
|
||||
if (r.setting.endsWith('_channel_id')) raus.kanal.push(r.setting);
|
||||
else if (r.setting.endsWith('_role_id')) raus.rolle.push(r.setting);
|
||||
}
|
||||
for (const f of mod.fields ?? []) {
|
||||
const art = f.art ?? 'text';
|
||||
if (f.setting && raus[art]) raus[art].push(f.setting);
|
||||
}
|
||||
// Der Modul-Schalter selbst ist auch eine Einstellung
|
||||
if (mod.setting) raus.schalter.push(mod.setting);
|
||||
}
|
||||
for (const art of Object.keys(raus)) raus[art] = [...new Set(raus[art])];
|
||||
return raus;
|
||||
}
|
||||
|
||||
/** Alle Module mit Zustand — für das Webinterface */
|
||||
export function moduleStates() {
|
||||
return MODULES.map((mod) => ({
|
||||
|
||||
Reference in New Issue
Block a user