Modliste: melden was sich geaendert hat, einzeln laden
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Bisher gab es fuer Mods nur einen Link auf das Sammelpaket des Hosters — vier
Gigabyte, auch wenn sich zwei Dateien geaendert haben. Jetzt liest der Bot die
Modliste aus der Statusabfrage, die er ohnehin holt, und meldet im Kanal, was
neu, aktualisiert oder entfernt wurde. Beim ersten Durchlauf bleibt es still,
sonst kaeme eine Meldung ueber 110 "neue" Mods.

Geaendert heisst: andere Version oder anderer Hash. Beides einzeln reicht
nicht — manche Modder bessern nach, ohne die Version zu erhoehen.

Dazu die Seite /mods/<server>: jeder Mod mit Version und Groesse, Suche ueber
Titel, Dateiname und Autor, und ein Download je Zeile. Der laeuft durch den
Bot, damit der Zugangs-Code des Spielservers nicht in einem Link landet — mit
dem Code liesse sich auch der ganze Spielstand lesen. Angefragt wird nur, was
wirklich in der Modliste steht; ueber den Dateinamen kommt man an nichts
anderes heran.

Groessen lernt der Bot beim Weiterleiten. Der Spielserver beantwortet kein
HEAD (501) und ignoriert Range, es gibt also keinen billigen Weg, sie vorher
zu erfahren — und 4 GB nur fuers Anzeigen zu holen waere keiner.

Nebenbei gefunden und behoben: 'server.mods' und 'commands.tag' gab es je
zweimal in den Sprachdateien. Der spaetere Eintrag gewinnt still, deshalb
stand auf dem neuen Knopf woertlich "%s Mods (110)" und auf der Befehlsseite
die Beschreibung von /tag statt der Kopfzeile.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 11:22:55 +02:00
co-authored by Claude Opus 5
parent 9b681754fa
commit 1ef06f747c
12 changed files with 527 additions and 10 deletions
+37 -1
View File
@@ -1052,6 +1052,37 @@ const lsHofStmt = db.prepare(`
ON CONFLICT(server_id) DO UPDATE SET hof_messages = excluded.hof_messages
`);
export const setLsHofMessages = (serverId, map) => lsHofStmt.run(serverId, JSON.stringify(map));
// Die zuletzt gesehene Modliste — daraus entsteht die Änderungsmeldung.
// Dazu je Mod die Dateigrösse, sobald sie einmal bekannt ist: der Server
// beantwortet kein HEAD, also lernt der Bot sie beim ersten Weiterleiten
// eines Downloads statt 4 GB nur fürs Anzeigen zu holen.
{
const cols = db.prepare('PRAGMA table_info(ls_state)').all().map((c) => c.name);
if (!cols.includes('mods')) db.exec('ALTER TABLE ls_state ADD COLUMN mods TEXT');
}
const lsModsStmt = db.prepare(`
INSERT INTO ls_state (server_id, mods) VALUES (?, ?)
ON CONFLICT(server_id) DO UPDATE SET mods = excluded.mods
`);
export const setLsMods = (serverId, mods) => lsModsStmt.run(serverId, JSON.stringify(mods));
db.exec(`
CREATE TABLE IF NOT EXISTS ls_mod_sizes (
server_id INTEGER NOT NULL,
name TEXT NOT NULL,
bytes INTEGER NOT NULL,
gesehen TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (server_id, name)
);
`);
const lsModSizeStmt = db.prepare(`
INSERT INTO ls_mod_sizes (server_id, name, bytes, gesehen) VALUES (?, ?, ?, datetime('now'))
ON CONFLICT(server_id, name) DO UPDATE SET bytes = excluded.bytes, gesehen = datetime('now')
`);
export const setLsModSize = (serverId, name, bytes) => lsModSizeStmt.run(serverId, name, bytes);
const lsModSizesStmt = db.prepare('SELECT name, bytes FROM ls_mod_sizes WHERE server_id = ?');
export const lsModSizes = (serverId) =>
Object.fromEntries(lsModSizesStmt.all(serverId).map((r) => [r.name, r.bytes]));
const lsVergessenStmt = db.prepare('DELETE FROM ls_state WHERE server_id = ?');
export const lsState = (serverId) => {
const r = lsStateStmt.get(serverId);
@@ -1063,7 +1094,12 @@ export const lsState = (serverId) => {
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 };
let mods = null;
try {
const roh = r.mods ? JSON.parse(r.mods) : null;
if (Array.isArray(roh)) mods = roh;
} catch { /* kaputt gespeichert — gilt als „noch nichts bekannt" */ }
return { ...r, hofMessages, mods };
};
export const setLsMessage = (serverId, messageId) => lsMessageStmt.run(serverId, messageId);
export const forgetLsState = (serverId) => lsVergessenStmt.run(serverId).changes > 0;