fix: ein schon von Hand eingetragener Server wird uebernommen, nicht uebergangen
Der Betreiber hat im Panel den Schalter fuer atm11-test umgelegt und im Discord passierte nichts. Er hat den Fehler bei sich gesucht -- ob er den Namen falsch geschrieben habe. Hat er nicht: der Server stand schon von Hand im Monitor, weil ich ihn vorhin selbst dort eingetragen hatte, und der Abgleich uebersprang ihn mit `continue`, damit nicht zwei Embeds fuer denselben Server im Kanal stehen. Das Ueberspringen war richtig, das Schweigen nicht. Wer den Schalter umlegt, sagt "dieser Server gehoert ans Panel" -- also bekommt der bestehende Eintrag jetzt den Herkunftsvermerk, statt ignoriert zu werden. Ein zweites Embed entsteht dabei nicht. Der Preis gehoert benannt und wird mitgeprueft: ab der Uebernahme nimmt ein Ausschalten den Eintrag mit, samt Bild und Links, die von Hand daran haengen. Das ist der Sinn des Schalters, aber es ist eine Uebertragung von Besitz. Ueberschrieben wird weiterhin kein Feld -- die Uebernahme setzt nur panel_name. Und die Meldung im Protokoll unterscheidet jetzt "neu" von "uebernommen"; vorher hiess beides "uebernommen", was genau die Auskunft verwischt haette, um die es hier geht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -392,10 +392,14 @@ export async function monitorTick(client) {
|
||||
// gibt ohne eingetragene Adresse sofort null zurück.
|
||||
const panelItems = await panelStatus();
|
||||
if (panelItems) {
|
||||
const { angelegt, entfernt } = abgleichen(panelItems);
|
||||
const { angelegt, uebernommen, 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(', ') || '—'}`);
|
||||
if (angelegt.length + uebernommen.length + entfernt.length > 0) {
|
||||
console.log(
|
||||
`[panel] neu: ${angelegt.join(', ') || '—'}`
|
||||
+ ` | uebernommen: ${uebernommen.join(', ') || '—'}`
|
||||
+ ` | entfernt: ${entfernt.map((e) => e.name).join(', ') || '—'}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+39
-11
@@ -12,12 +12,19 @@
|
||||
// Schalters dazu, wie lange es dauert. Ein Knopf, der scheinbar nichts tut,
|
||||
// wird dreimal gedrückt.
|
||||
//
|
||||
// WAS HIER NICHT PASSIERT: ein bestehender Eintrag wird nicht angefasst. Wer
|
||||
// im Webinterface ein Bild, einen Verbinden-Link oder Regeln ergänzt hat, soll
|
||||
// das nicht beim nächsten Durchlauf verlieren. Angelegt und gelöscht wird,
|
||||
// mehr nicht.
|
||||
// WAS HIER NICHT PASSIERT: kein Feld eines bestehenden Eintrags wird
|
||||
// überschrieben. Wer im Webinterface ein Bild, einen Verbinden-Link oder Regeln
|
||||
// ergänzt hat, soll das nicht beim nächsten Durchlauf verlieren. Angelegt,
|
||||
// übernommen und gelöscht wird — mehr nicht.
|
||||
//
|
||||
// „Übernommen" heißt: gab es den Server schon von Hand, bekommt er nur den
|
||||
// Herkunftsvermerk. Sonst täte der Schalter im Panel sichtbar nichts, und
|
||||
// genau das ist dem Betreiber passiert.
|
||||
|
||||
import { listGameservers, createGameserver, deleteGameserver, getSetting } from './db.js';
|
||||
import { listGameservers, createGameserver, deleteGameserver, getSetting, db } from './db.js';
|
||||
|
||||
/** Einen bestehenden Eintrag dem Panel zuschreiben -- ohne ihn sonst anzufassen. */
|
||||
const uebernehmenStmt = db.prepare('UPDATE gameservers SET panel_name = ? WHERE id = ?');
|
||||
|
||||
/**
|
||||
* Taugt dieser Panel-Eintrag für einen Monitor-Eintrag?
|
||||
@@ -34,12 +41,13 @@ export function taugt(x) {
|
||||
/**
|
||||
* Einmal abgleichen.
|
||||
*
|
||||
* @returns {{angelegt: string[], entfernt: Array<{id: number, name: string, message_id: string|null}>}}
|
||||
* @returns {{angelegt: string[], uebernommen: string[],
|
||||
* entfernt: Array<{id: number, name: string, message_id: string|null}>}}
|
||||
* Die Entfernten kommen mit ihrer Nachrichten-Kennung zurück, damit
|
||||
* der Aufrufer das Embed löschen kann — hier gibt es keinen Client.
|
||||
*/
|
||||
export function abgleichen(items) {
|
||||
const ergebnis = { angelegt: [], entfernt: [] };
|
||||
const ergebnis = { angelegt: [], uebernommen: [], entfernt: [] };
|
||||
if (!Array.isArray(items)) return ergebnis;
|
||||
|
||||
const vorhanden = listGameservers();
|
||||
@@ -48,13 +56,33 @@ export function abgleichen(items) {
|
||||
|
||||
for (const x of items) {
|
||||
if (!taugt(x) || ausPanel.has(x.name)) continue;
|
||||
// Ein von Hand angelegter Server auf demselben Port ist schon da —
|
||||
// dann NICHT noch einmal. Sonst stünde derselbe Server zweimal im
|
||||
// Kanal, und niemand wüsste, welches Embed das richtige ist.
|
||||
// Ein Server auf derselben Adresse und demselben Port ist schon da —
|
||||
// dann NICHT noch einmal anlegen. Sonst stünde derselbe Server zweimal
|
||||
// im Kanal, und niemand wüsste, welches Embed das richtige ist.
|
||||
//
|
||||
// ABER AUCH NICHT EINFACH ÜBERGEHEN. Vorher stand hier `continue`, und
|
||||
// damit tat der Schalter im Panel sichtbar nichts, sobald der Server
|
||||
// schon von Hand eingetragen war — keine Meldung, kein Embed, keine
|
||||
// Spur. Genau so ist es dem Betreiber gegangen, und er hat den Fehler
|
||||
// erst bei sich gesucht.
|
||||
//
|
||||
// Wer den Schalter umlegt, sagt „dieser Server gehört ans Panel". Also
|
||||
// wird der bestehende Eintrag übernommen statt ignoriert.
|
||||
//
|
||||
// Der Preis gehört benannt: ab dann nimmt ein Ausschalten den Eintrag
|
||||
// mit, samt Bild und Links, die von Hand daran hängen. Das ist der Sinn
|
||||
// des Schalters — aber es ist eine Übertragung von Besitz und keine
|
||||
// Kleinigkeit.
|
||||
const dasselbe = vorhanden.find(
|
||||
(s) => Number(s.port) === Number(x.port) && String(s.host) === String(x.adresse),
|
||||
);
|
||||
if (dasselbe) continue;
|
||||
if (dasselbe) {
|
||||
if (!dasselbe.panel_name) {
|
||||
uebernehmenStmt.run(x.name, dasselbe.id);
|
||||
ergebnis.uebernommen.push(x.name);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
createGameserver({
|
||||
name: x.name,
|
||||
|
||||
Reference in New Issue
Block a user