From 8981eb91b814bab2daa9e7d68d182d2f618d44fa Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 5 Aug 2026 17:14:30 +0200 Subject: [PATCH] Ganze Abfrage-URL einfuegen statt drei Felder tippen --- frontend/src/locales/de.js | 1 + frontend/src/locales/en.js | 1 + frontend/src/pages/Server.jsx | 34 +++++++++++++++++------------ frontend/src/pages/Settings.jsx | 38 ++++++++++++++++++++++++++++++--- frontend/src/style.css | 5 +++++ 5 files changed, 62 insertions(+), 17 deletions(-) diff --git a/frontend/src/locales/de.js b/frontend/src/locales/de.js index 4ceaec9..ef09a3a 100644 --- a/frontend/src/locales/de.js +++ b/frontend/src/locales/de.js @@ -182,6 +182,7 @@ export default { 'server.free': 'frei', 'server.full': 'voll', 'server.whoIsOn': 'Wer gerade drauf ist', + 'server.nobody24h': 'In den letzten 24 Stunden war niemand drauf.', 'server.andMore': '+%s weitere', 'server.lastOnline': 'Zuletzt online: %s', 'server.agoMin': 'vor %s min', diff --git a/frontend/src/locales/en.js b/frontend/src/locales/en.js index 2ac1ed7..00566cc 100644 --- a/frontend/src/locales/en.js +++ b/frontend/src/locales/en.js @@ -181,6 +181,7 @@ export default { 'server.free': 'free', 'server.full': 'full', 'server.whoIsOn': 'Who is playing', + 'server.nobody24h': 'Nobody played in the last 24 hours.', 'server.andMore': '+%s more', 'server.lastOnline': 'Last online: %s', 'server.agoMin': '%s min ago', diff --git a/frontend/src/pages/Server.jsx b/frontend/src/pages/Server.jsx index efc091a..ae4321c 100644 --- a/frontend/src/pages/Server.jsx +++ b/frontend/src/pages/Server.jsx @@ -75,6 +75,10 @@ function ServerCard({ s }) { const [alleSpieler, setAlleSpieler] = useState(false); const pct = s.online && s.max ? Math.round((s.players / s.max) * 100) : 0; const stats = historyStats(s.history); + // War in 24 h überhaupt jemand drauf? Wenn nicht, ist das Diagramm eine + // Nulllinie in hundert Pixeln Leere — das sieht nach Fehler aus, obwohl + // es keiner ist. Dann lieber ein Satz statt einer leeren Fläche. + const hatVerlauf = s.history.length > 1 && s.history.some((h) => (h.players ?? 0) > 0); // Ab 80 % wird es eng, ab 100 % kommt keiner mehr rein — das soll man // sehen, ohne den Balken mit der Zahl daneben zu vergleichen. const fuellung = pct >= 100 ? 'voll' : pct >= 80 ? 'eng' : 'frei'; @@ -153,20 +157,22 @@ function ServerCard({ s }) { )} - {s.history.length > 1 && } - {stats && ( -
- {t('server.players24h')} - {/* Uptime steht jetzt am Balken darunter — zweimal dieselbe - Zahl in verschiedenen Zeiträumen verwirrt nur. */} - {t('server.peak')} {stats.peak} -
- )} - {s.history.length > 1 && ( -
- {t('server.hours24')} - {t('server.now')} -
+ {hatVerlauf ? ( + <> + +
+ {t('server.players24h')} + {/* Uptime steht jetzt am Balken darunter — zweimal dieselbe + Zahl in verschiedenen Zeiträumen verwirrt nur. */} + {t('server.peak')} {stats.peak} +
+
+ {t('server.hours24')} + {t('server.now')} +
+ + ) : s.online && ( +

{t('server.nobody24h')}

)} diff --git a/frontend/src/pages/Settings.jsx b/frontend/src/pages/Settings.jsx index 41846c4..b2d806c 100644 --- a/frontend/src/pages/Settings.jsx +++ b/frontend/src/pages/Settings.jsx @@ -171,6 +171,33 @@ const BELIEBTE_SPIELE = [ ]; const GAMESEL_MAX = 60; +/** + * Ganze Abfrage-URL eingefügt statt Host getippt? Dann Host, Port und Code + * daraus ziehen. + * + * Bei Farming Simulator ist genau das der Normalfall: der Hoster gibt einem + * eine fertige URL wie + * `http://1.2.3.4:8200/feed/dedicated-server-stats.xml?code=…`, + * 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} + */ +function feedUrlZerlegen(text) { + const roh = String(text).trim(); + if (!/^https?:\/\//i.test(roh)) return null; + let u; + try { u = new URL(roh); } catch { return null; } + if (!u.hostname) return null; + const code = u.searchParams.get('code') || u.searchParams.get('token') || ''; + return { + host: u.hostname, + port: u.port || '', + // Ohne Code im Link den vorhandenen stehen lassen, statt ihn zu leeren + ...(code ? { token: code } : {}), + }; +} + /** Combobox für die Spiel-Auswahl — datalist ist nicht stylebar, das hier schon. * Die Liste kommt aus gamedig selbst, damit sie mit jedem Update mitwächst; * freie IDs bleiben trotzdem erlaubt. */ @@ -832,6 +859,11 @@ export default function Settings({ me }) { const serverNeedsUrl = ['fivem', 'http'].includes(serverDraft.type); const gewaehltesSpiel = games.find((g) => g.id === serverDraft.type) ?? null; + /** Ins Host-Feld getippt — oder die ganze Abfrage-URL eingefügt */ + function hostEingeben(wert) { + const teile = feedUrlZerlegen(wert); + setServerDraft((d) => (teile ? { ...d, ...teile } : { ...d, host: wert })); + } /** Spiel gewählt: Standard-Port vorschlagen, solange keiner drinsteht */ function spielWaehlen(type) { const spiel = games.find((g) => g.id === type); @@ -3332,14 +3364,14 @@ export default function Settings({ me }) { setServerDraft({ ...serverDraft, query_url: e.target.value })} /> ) : ( <> - setServerDraft({ ...serverDraft, host: e.target.value })} /> + hostEingeben(e.target.value)} /> setServerDraft({ ...serverDraft, port: e.target.value })} /> )}

{gewaehltesSpiel - ? <>Gewählt: {gewaehltesSpiel.name}{!gewaehltesSpiel.eigen && gewaehltesSpiel.port ? ` — Standard-Query-Port ${gewaehltesSpiel.port}` : ''}. Die Liste kommt direkt aus gamedig, {games.length} Einträge. + ? <>Gewählt: {gewaehltesSpiel.name}{!gewaehltesSpiel.eigen && gewaehltesSpiel.port ? ` — Standard-Query-Port ${gewaehltesSpiel.port}, Hoster weichen oft davon ab` : ''}. Die Liste kommt direkt aus gamedig, {games.length} Einträge. : <>Unbekannte ID — sie wird trotzdem versucht. Alle bekannten stehen in der gamedig-Liste.}

@@ -3358,7 +3390,7 @@ export default function Settings({ me }) { />

{gewaehltesSpiel.id.startsWith('farmingsimulator') - ? <>Im Spiel heißt er Code. Steht im Webinterface des Servers unter http://host:{gewaehltesSpiel.port ?? 8080}/settings.html — er gilt nur für den eigenen Server. + ? <>Im Spiel heißt er Code und steckt in der Abfrage-URL, die dein Hoster ausgibt: …/feed/dedicated-server-stats.xml?code=DAS_HIER. Am einfachsten die ganze URL oben ins Host-Feld einfügen — Host, Port und Code werden herausgezogen. : <>Steht im Webinterface des Servers. Ohne ihn liefert die Abfrage nichts und der Server stünde dauerhaft auf „offline".}

diff --git a/frontend/src/style.css b/frontend/src/style.css index bb8b4c4..aeb4daa 100644 --- a/frontend/src/style.css +++ b/frontend/src/style.css @@ -1835,6 +1835,11 @@ label.toggle { color: var(--muted); background: var(--bg3); border: 1px solid var(--border); border-radius: 5px; padding: .22rem .5rem; } +/* Steht anstelle des Verlaufs, wenn es nichts zu zeigen gibt */ +.srv-leer { + font-family: var(--mono); font-size: .68rem; color: var(--muted2); + margin-top: 1rem; letter-spacing: .04em; +} .srv-weg { font-family: var(--mono); font-size: .7rem; color: #f23f43; margin-top: .9rem; letter-spacing: .04em;