Connect-Links im Discord anklickbar, und Mods bekommen einen eigenen Knopf
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Im Kanal stand woertlich das da:

    [https://cfx.re/join/4odv68](https://cfx.re/join/4odv68)

Der Link war sein eigener Linktext. Discord macht aus der nackten URL zwischen
den eckigen Klammern zuerst selbst einen Link und kommt mit der
Masked-Link-Schreibweise dann nicht mehr durch — heraus kommen die Klammern im
Klartext. Der Kommentar an der Stelle behauptete ausserdem, so seien steam://
und Konsorten klickbar. Waren sie nie.

Jetzt sind es Link-Knoepfe unter dem Embed. Die Frage nach der Schreibweise
stellt sich damit gar nicht mehr, und ein Knopf sieht auch nach einem aus.
Discord nimmt dort nur http(s) an; fivem:// und steam:// stehen deshalb weiter
im Embed, aber als Codeblock zum Kopieren statt als toter Link.

Dazu ein eigenes Feld fuer den Mod-Download. Vorher landete der beim
Connect-Link, weil es kein anderes gab — und dann fuehrte "Verbinden" zu einer
ZIP-Datei. Farming Simulator liefert die Modliste ohnehin mit, also steht die
Anzahl jetzt auch im Embed und als Chip auf der Seite.

Beim Testen aufgefallen: eine neue Spalte hat jeden Aufrufer umgebracht, der
sie noch nicht kannte — better-sqlite3 wirft bei einem fehlenden benannten
Parameter. createGameserver und updateGameserver fuellen die Felder jetzt
einmal auf, statt das an jeder Aufrufstelle nachzuziehen.

Geprueft: was in einen Knopf darf und was nicht (https, http, fivem://,
steam://, leer, null, Leerzeichen, Satz mit Link drin), beide Knoepfe in einer
Reihe, nur einer, gar keiner — eine leere Reihe weist Discord ab —, https
landet im Knopf und nicht doppelt auch im Embed, fivem:// umgekehrt, Mods bei
47/0/null, und der Aufruf ohne die neue Spalte. Seite im laufenden Frontend
angesehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 22:52:08 +02:00
co-authored by Claude Opus 5
parent 8981eb91b8
commit eec170ff41
8 changed files with 91 additions and 18 deletions
+10 -2
View File
@@ -4,7 +4,7 @@
import { useEffect, useState } from 'react';
import { apiGet } from '../api.js';
import { SkeletonCards } from '../components/Skeleton.jsx';
import { IconGame, IconMapPin, IconClock, IconCheck, IconTeam, IconPackage, IconZap } from '../icons.jsx';
import { IconGame, IconMapPin, IconClock, IconCheck, IconTeam, IconPackage, IconZap, IconDownload, IconArchive } from '../icons.jsx';
import { useT, useFmt } from '../i18n.jsx';
import UptimeTrack from '../components/UptimeTrack.jsx';
@@ -130,6 +130,9 @@ function ServerCard({ s }) {
<div className="srv-chips">
{s.map && <span className="srv-chip"><IconMapPin size={12} /> {s.map}</span>}
{s.version && <span className="srv-chip"><IconPackage size={12} /> {s.version}</span>}
{/* Eigenes Zeichen — mit dem Paket-Icon der Version daneben
sähen die beiden Chips wie zusammengehörig aus. */}
{s.mods > 0 && <span className="srv-chip"><IconArchive size={12} /> {t('server.mods', s.mods)}</span>}
{s.ping != null && <span className="srv-chip"><IconZap size={12} /> {s.ping} ms</span>}
</div>
)}
@@ -177,13 +180,18 @@ function ServerCard({ s }) {
<UptimeTrack buckets={s.uptime} />
{(s.connect_url || s.address) && (
{(s.connect_url || s.mods_url || s.address) && (
<div className="srv-connect">
{s.connect_url && (
<a className="btn btn-save with-icon" href={s.connect_url}>
<IconGame size={15} /> {t('server.connect')}
</a>
)}
{s.mods_url && (
<a className="btn btn-ghost with-icon" href={s.mods_url} rel="noreferrer">
<IconDownload size={15} /> {t('server.modsDownload')}
</a>
)}
{s.address && (
<button className="alpha-key srv-addr" onClick={copyAddress} title={t('server.copyAddress')}>
{copied ? <span className="with-icon"><IconCheck size={14} /> {t('server.copied')}</span> : s.address}