Connect-Links im Discord anklickbar, und Mods bekommen einen eigenen Knopf
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:
@@ -924,6 +924,9 @@ db.exec(`
|
||||
if (!cols.includes('image_url')) db.exec(`ALTER TABLE gameservers ADD COLUMN image_url TEXT NOT NULL DEFAULT ''`);
|
||||
// Zugangs-Code für Spiele, die ohne nicht antworten (Farming Simulator, Terraria)
|
||||
if (!cols.includes('token')) db.exec(`ALTER TABLE gameservers ADD COLUMN token TEXT NOT NULL DEFAULT ''`);
|
||||
// Eigener Link für den Mod-Download. Vorher landete der beim Connect-Link,
|
||||
// weil es kein anderes Feld gab — und dann führte "Connect" zu einer ZIP.
|
||||
if (!cols.includes('mods_url')) db.exec(`ALTER TABLE gameservers ADD COLUMN mods_url TEXT NOT NULL DEFAULT ''`);
|
||||
}
|
||||
// Die Auswahl im Panel bot mal Spiel-IDs an, die es bei gamedig gar nicht gibt.
|
||||
// Wer eine davon gewählt hat, hatte einen Server, der dauerhaft offline stand,
|
||||
@@ -937,20 +940,29 @@ db.exec(`
|
||||
for (const [alt, neu] of Object.entries(echteIds)) um.run(neu, alt);
|
||||
}
|
||||
const insertGameserver = db.prepare(`
|
||||
INSERT INTO gameservers (name, type, query_url, address, host, port, connect_url, image_url, token)
|
||||
VALUES (@name, @type, @query_url, @address, @host, @port, @connect_url, @image_url, @token)
|
||||
INSERT INTO gameservers (name, type, query_url, address, host, port, connect_url, image_url, token, mods_url)
|
||||
VALUES (@name, @type, @query_url, @address, @host, @port, @connect_url, @image_url, @token, @mods_url)
|
||||
`);
|
||||
const updateGameserverStmt = db.prepare(`
|
||||
UPDATE gameservers SET name = @name, type = @type, query_url = @query_url, address = @address,
|
||||
host = @host, port = @port, connect_url = @connect_url, image_url = @image_url, token = @token
|
||||
host = @host, port = @port, connect_url = @connect_url, image_url = @image_url, token = @token,
|
||||
mods_url = @mods_url
|
||||
WHERE id = @id
|
||||
`);
|
||||
const setGameserverMessageStmt = db.prepare('UPDATE gameservers SET message_id = ? WHERE id = ?');
|
||||
const listGameserversStmt = db.prepare('SELECT * FROM gameservers ORDER BY id');
|
||||
const getGameserverStmt = db.prepare('SELECT * FROM gameservers WHERE id = ?');
|
||||
const deleteGameserverStmt = db.prepare('DELETE FROM gameservers WHERE id = ?');
|
||||
export const createGameserver = (s) => insertGameserver.run(s).lastInsertRowid;
|
||||
export const updateGameserver = (s) => updateGameserverStmt.run(s).changes > 0;
|
||||
// Jede neue Spalte bricht sonst jeden Aufrufer, der sie noch nicht kennt —
|
||||
// better-sqlite3 wirft bei einem fehlenden benannten Parameter. Hier einmal
|
||||
// auffüllen ist billiger, als das an jeder Aufrufstelle nachzuziehen.
|
||||
const gameserverFelder = {
|
||||
name: '', type: 'fivem', query_url: '', address: '', host: '', port: null,
|
||||
connect_url: '', image_url: '', token: '', mods_url: '',
|
||||
};
|
||||
const vollstaendig = (s) => ({ ...gameserverFelder, ...s });
|
||||
export const createGameserver = (s) => insertGameserver.run(vollstaendig(s)).lastInsertRowid;
|
||||
export const updateGameserver = (s) => updateGameserverStmt.run(vollstaendig(s)).changes > 0;
|
||||
export const setGameserverMessage = (id, messageId) => setGameserverMessageStmt.run(messageId, id);
|
||||
export const listGameservers = () => listGameserversStmt.all();
|
||||
export const getGameserver = (id) => getGameserverStmt.get(id) ?? null;
|
||||
|
||||
Reference in New Issue
Block a user