feat: Server aus dem Panel uebernehmen -- und nur die auch wieder loeschen
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:
@@ -9,6 +9,7 @@ import { brandEmbed } from '../embeds.js';
|
||||
import { moduleEnabled } from '../modules.js';
|
||||
import { tuning, tuningMs, everyTuned } from '../tuning.js';
|
||||
import { panelStatus, panelEintrag, zustandText, lastText, startetNoch, gewolltAus } from '../panel.js';
|
||||
import { abgleichen, embedWegraeumen } from '../panel-abgleich.js';
|
||||
|
||||
const GREEN = 0x23a55a;
|
||||
const RED = 0xf23f43;
|
||||
@@ -376,6 +377,28 @@ async function handleAlerts(client, r) {
|
||||
/** Ein Poll-Durchlauf — exportiert für Tests und den Timer */
|
||||
export async function monitorTick(client) {
|
||||
if (!moduleEnabled('server_monitor')) return;
|
||||
|
||||
// DER PANEL-BERICHT WIRD VOR ALLEM ANDEREN GEHOLT, und der Abgleich läuft
|
||||
// VOR der Prüfung auf einen leeren Monitor.
|
||||
//
|
||||
// Vorher stand hier zuerst `if (servers.length === 0) return`. Damit hätte
|
||||
// der Schalter im Panel beim ALLERERSTEN Server nichts getan -- der
|
||||
// Durchlauf wäre ausgestiegen, bevor er das Panel überhaupt fragt. Und
|
||||
// zwar stillschweigend, was der schlechteste aller Fehlermodi ist: der
|
||||
// Schalter steht auf an, im Kanal passiert nichts, und es gibt nirgends
|
||||
// eine Meldung, an der man sich entlanghangeln könnte.
|
||||
//
|
||||
// Der Aufruf ist billig: `panelStatus` hält seine Antwort 20 Sekunden und
|
||||
// gibt ohne eingetragene Adresse sofort null zurück.
|
||||
const panelItems = await panelStatus();
|
||||
if (panelItems) {
|
||||
const { angelegt, entfernt } = abgleichen(panelItems);
|
||||
if (entfernt.length > 0) await embedWegraeumen(client, entfernt);
|
||||
if (angelegt.length > 0 || entfernt.length > 0) {
|
||||
console.log(`[panel] übernommen: ${angelegt.join(', ') || '—'} | entfernt: ${entfernt.map((e) => e.name).join(', ') || '—'}`);
|
||||
}
|
||||
}
|
||||
|
||||
const servers = listGameservers();
|
||||
if (servers.length === 0) return;
|
||||
|
||||
@@ -384,7 +407,6 @@ export async function monitorTick(client) {
|
||||
// Die Zusatzauskunft vom Panel: EINMAL je Durchlauf, nicht je Server.
|
||||
// Sie ist optional -- ist nichts eingetragen oder antwortet das Panel
|
||||
// nicht, bleibt `panel` schlicht null und alles läuft wie vorher.
|
||||
const panelItems = await panelStatus();
|
||||
for (const r of results) r.panel = panelEintrag(panelItems, r);
|
||||
|
||||
// Verlauf für die Web-Seite festhalten + Cache fürs API
|
||||
|
||||
Reference in New Issue
Block a user