Modul-Felder speichern wieder, und die Feed-Adresse ist einstellbar
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

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:
2026-08-09 02:13:32 +02:00
co-authored by Claude Opus 5
parent 768fcda666
commit c5e13182c0
4 changed files with 86 additions and 8 deletions
+15 -1
View File
@@ -181,7 +181,10 @@ const GAMESEL_MAX = 60;
* und die drei Felder von Hand auseinanderzupflücken ist Arbeit, die niemand
* machen muss. Der Port steht mit drin — er ist nicht immer 8080.
*
* @returns {{host: string, port: string, token?: string} | null}
* Die Feed-Basis kommt mit heraus (alles bis zum Dateinamen), damit auch
* Hoster funktionieren, die https nehmen oder einen Pfad davorsetzen.
*
* @returns {{host: string, port: string, query_url: string, token?: string} | null}
*/
function feedUrlZerlegen(text) {
const roh = String(text).trim();
@@ -190,9 +193,12 @@ function feedUrlZerlegen(text) {
try { u = new URL(roh); } catch { return null; }
if (!u.hostname) return null;
const code = u.searchParams.get('code') || u.searchParams.get('token') || '';
// …/feed/dedicated-server-stats.xml → …/feed
const ordner = u.pathname.replace(/\/[^/]*$/, '').replace(/\/+$/, '');
return {
host: u.hostname,
port: u.port || '',
query_url: `${u.origin}${ordner}`,
// Ohne Code im Link den vorhandenen stehen lassen, statt ihn zu leeren
...(code ? { token: code } : {}),
};
@@ -3388,6 +3394,14 @@ export default function Settings({ me }) {
value={serverDraft.token}
onChange={(e) => setServerDraft({ ...serverDraft, token: e.target.value })}
/>
<label style={{ marginTop: '.6rem' }}>
Feed-Basis <span className="field-hint">optional leer heißt <code>http://host:port/feed</code>. Nur setzen, wenn dein Hoster https nimmt oder einen Pfad davorsetzt.</span>
</label>
<input
type="text" placeholder={`http://${serverDraft.host || 'host'}:${serverDraft.port || gewaehltesSpiel.port || 8080}/feed`}
value={serverDraft.query_url}
onChange={(e) => setServerDraft({ ...serverDraft, query_url: e.target.value })}
/>
<p className="field-hint" style={{ marginTop: '.3rem' }}>
{gewaehltesSpiel.id.startsWith('farmingsimulator')
? <>Im Spiel heißt er <b>Code</b> und steckt in der Abfrage-URL, die dein Hoster ausgibt: <code>/feed/dedicated-server-stats.xml?code=<b>DAS_HIER</b></code>. Am einfachsten die ganze URL oben ins Host-Feld einfügen Host, Port und Code werden herausgezogen.</>