feat: Server aus dem Panel uebernehmen -- und nur die auch wieder loeschen
Deploy / check (push) Canceled after 0s
Deploy / deploy (push) Canceled after 0s

Im d4rk_gameserver-Panel bekommt jeder Server einen Schalter "Im Discord
anzeigen". Das Panel schreibt dafuer NICHTS hierher: es setzt nur ein
Haekchen, und das reist in dem Statusbericht mit, den der Monitor ohnehin
alle 30 Sekunden abholt. Der Bot legt den Eintrag dann selbst an.

Der umgekehrte Weg -- Panel ruft unsere API -- braeuchte dort ein
Zeichen mit Schreibrecht. So bleibt es bei einem, das nur lesen kann.

ZWEI FALLEN, beide beim Bauen aufgefallen:

Der Abgleich lief zu spaet. In monitorTick stand `if (servers.length ===
0) return` VOR dem Panel-Abruf; beim allerersten Server haette der
Schalter also nichts getan, und zwar stillschweigend. Der Abruf steht
jetzt davor.

Loeschen braucht einen Besitzvermerk. Ohne den nimmt ein Haekchen im
Panel den handgepflegten ATM10 mit -- die einzige verfuegbare Grundlage
waere der Name, und beim ersten Server, der in beiden Werkzeugen gleich
heisst, waere der Eintrag samt Bild, Links und Zugangs-Code weg. Neue
Spalte `panel_name`, leer heisst "von Hand". Die UPDATE-Anweisung fasst
sie nicht an, damit ein Bearbeiten im Webinterface die Herkunft behaelt.

Und der Abgleich ueberschreibt nichts: angelegt und geloescht wird, mehr
nicht.

tools/panel-abgleich-pruefen.mjs prueft das auf einer EIGENEN Datenbank
in /tmp und bricht ab, wenn sie es nicht ist -- eine Probe, die loeschen
kann, darf nicht dort loeschen, wo es zaehlt. Alles gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 19:08:43 +02:00
co-authored by Claude Opus 5
parent 21eab627b9
commit 0982e8cd1b
5 changed files with 241 additions and 4 deletions
+19 -2
View File
@@ -934,6 +934,18 @@ db.exec(`
// Wer darf drauf: 'auto' nimmt, was die Abfrage sagt. Nur die wenigsten
// Spiele melden das — und eine Whitelist meldet gar keins.
if (!cols.includes('zugang')) db.exec(`ALTER TABLE gameservers ADD COLUMN zugang TEXT NOT NULL DEFAULT 'auto'`);
// Migration v4: Wer hat diesen Eintrag angelegt?
//
// Leer = ein Mensch, über das Webinterface. Steht ein Name drin, kommt der
// Eintrag aus dem d4rk_gameserver-Panel und wird von dort auch wieder
// weggeräumt.
//
// DIESE SPALTE IST DIE GANZE SICHERUNG DAGEGEN, dass ein Häkchen im Panel
// einen von Hand gepflegten Server löscht. Ohne sie müsste der Abgleich
// raten, und die einzige verfügbare Grundlage wäre der Name — bei dem
// ersten Server, der in beiden Werkzeugen gleich heißt, wäre der
// handgepflegte Eintrag samt Bild, Links und Zugangs-Code weg.
if (!cols.includes('panel_name')) db.exec(`ALTER TABLE gameservers ADD COLUMN panel_name 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,
@@ -947,8 +959,8 @@ 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, mods_url, links, zugang)
VALUES (@name, @type, @query_url, @address, @host, @port, @connect_url, @image_url, @token, @mods_url, @links, @zugang)
INSERT INTO gameservers (name, type, query_url, address, host, port, connect_url, image_url, token, mods_url, links, zugang, panel_name)
VALUES (@name, @type, @query_url, @address, @host, @port, @connect_url, @image_url, @token, @mods_url, @links, @zugang, @panel_name)
`);
const updateGameserverStmt = db.prepare(`
UPDATE gameservers SET name = @name, type = @type, query_url = @query_url, address = @address,
@@ -966,6 +978,11 @@ const deleteGameserverStmt = db.prepare('DELETE FROM gameservers WHERE id = ?');
const gameserverFelder = {
name: '', type: 'fivem', query_url: '', address: '', host: '', port: null,
connect_url: '', image_url: '', token: '', mods_url: '', links: '[]', zugang: 'auto',
// Leer = von Hand angelegt. Die UPDATE-Anweisung oben fasst die Spalte
// absichtlich NICHT an: wer einen Panel-Server im Webinterface bearbeitet,
// soll ihm damit nicht die Herkunft nehmen. (Ein überzähliger benannter
// Parameter stört better-sqlite3 nicht -- nachgemessen.)
panel_name: '',
};
// Links dürfen als Liste hereinkommen — so gibt getGameserver sie ja auch
// heraus. better-sqlite3 kann kein Array binden und würde sonst werfen.