Ein Embed je Hof, das sich selbst aktualisiert
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Der Fuhrpark stand bisher nur als Gesamtzahl im Karten-Embed. Jetzt bekommt
jeder Hof eine eigene Nachricht im selben Kanal, die bei jedem Durchlauf
bearbeitet statt neu gepostet wird: Land, Fahrzeuge mit Wert und
Betriebsstunden, was in die Werkstatt muss, was gewaschen gehoert und was
geladen ist.

Die Fahrzeuge kommen aus vehicles.xml, blockweise gelesen — Verschleiss und
Schmutz stehen in Kindelementen und gehoeren sonst dem falschen Fahrzeug.
Gemietete Missionsfahrzeuge bleiben draussen, sie verfaelschen Anzahl und
Wert. Faellt die Datei einmal aus, bleiben die Embeds stehen, statt dass ein
Hof verschwindet und gleich darauf doppelt gepostet wird.

Damit tauchen auch Hoefe auf, die noch kein Land gekauft haben: die Liste der
Hoefe kommt aus Parzellen und Fuhrpark zusammen.

Dazu raus, was nur den Kanal vollgeschrieben hat: die Meldung zum
Monatswechsel und die zum Landkauf. Der Monat wird still weitergestellt — er
steht ohnehin im Embed. Damit faellt der Ereignis-Kanal weg und mit ihm die
gespeicherte Besitzliste.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 14:53:02 +02:00
co-authored by Claude Opus 5
parent 0875dff127
commit 9b681754fa
5 changed files with 265 additions and 82 deletions
+17 -9
View File
@@ -1023,7 +1023,6 @@ db.exec(`
CREATE TABLE IF NOT EXISTS ls_state (
server_id INTEGER PRIMARY KEY,
message_id TEXT,
besitz TEXT,
geprueft TEXT NOT NULL DEFAULT (datetime('now'))
);
`);
@@ -1032,10 +1031,6 @@ const lsMessageStmt = db.prepare(`
INSERT INTO ls_state (server_id, message_id) VALUES (?, ?)
ON CONFLICT(server_id) DO UPDATE SET message_id = excluded.message_id
`);
const lsBesitzStmt = db.prepare(`
INSERT INTO ls_state (server_id, besitz, geprueft) VALUES (?, ?, datetime('now'))
ON CONFLICT(server_id) DO UPDATE SET besitz = excluded.besitz, geprueft = datetime('now')
`);
// Letzte gesehene Tageszeit — daran erkennt das Modul den Tageswechsel
{
const cols = db.prepare('PRAGMA table_info(ls_state)').all().map((c) => c.name);
@@ -1046,18 +1041,31 @@ const lsTagStmt = db.prepare(`
ON CONFLICT(server_id) DO UPDATE SET tageszeit = excluded.tageszeit
`);
export const setLsTageszeit = (serverId, ms) => lsTagStmt.run(serverId, ms);
// Eine gepflegte Nachricht je Hof: { "1": "messageId", "2": … }
{
const cols = db.prepare('PRAGMA table_info(ls_state)').all().map((c) => c.name);
if (!cols.includes('hof_messages')) db.exec(`ALTER TABLE ls_state ADD COLUMN hof_messages TEXT NOT NULL DEFAULT '{}'`);
}
const lsHofStmt = db.prepare(`
INSERT INTO ls_state (server_id, hof_messages) VALUES (?, ?)
ON CONFLICT(server_id) DO UPDATE SET hof_messages = excluded.hof_messages
`);
export const setLsHofMessages = (serverId, map) => lsHofStmt.run(serverId, JSON.stringify(map));
const lsVergessenStmt = db.prepare('DELETE FROM ls_state WHERE server_id = ?');
export const lsState = (serverId) => {
const r = lsStateStmt.get(serverId);
if (!r) return null;
// Kaputtes JSON darf den Durchlauf nicht anhalten — dann gilt eben
// "noch nichts bekannt" und beim nächsten Mal steht wieder etwas drin.
let besitz = null;
try { besitz = r.besitz ? JSON.parse(r.besitz) : null; } catch { besitz = null; }
return { ...r, besitz };
let hofMessages = {};
try {
const roh = JSON.parse(r.hof_messages || '{}');
if (roh && typeof roh === 'object' && !Array.isArray(roh)) hofMessages = roh;
} catch { /* kaputt gespeichert — dann werden die Embeds neu gepostet */ }
return { ...r, hofMessages };
};
export const setLsMessage = (serverId, messageId) => lsMessageStmt.run(serverId, messageId);
export const setLsBesitz = (serverId, besitz) => lsBesitzStmt.run(serverId, JSON.stringify(besitz));
export const forgetLsState = (serverId) => lsVergessenStmt.run(serverId).changes > 0;
// Erreichbarkeit stundenweise zusammengefasst — für den Uptime-Balken.
// Die Rohdaten (alle 2 min) wären über eine Woche rund 5000 Zeilen pro Server;