Kein Monatswechsel mehr aus einer kaputten Antwort
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Der Bot rief einen neuen Monat aus, obwohl im Spiel keiner war. Zwei Fehler,
die zusammen genau das ergeben:

statsLesen las die Uhrzeit als `Number(server.dayTime) || 0`. Eine Antwort
ohne dayTime — Server startet neu, Proxy schiebt eine Fehlerseite dazwischen,
XML halb geschrieben — wurde damit zu 0. Und tagUmgeschlagen prueft auf
`jetzt < vorher`. Null ist kleiner als jeder Vortagswert, also sah jede
kaputte Antwort wie Mitternacht aus.

Beides behoben: fehlt die Angabe, ist sie jetzt null und nicht 0 — "weiss
nicht" ist kein Tageswechsel. Und ein Wechsel muss die Form eines echten
Mitternachtssprungs haben: vom spaeten Abend in den fruehen Morgen, beide
Werte innerhalb eines Tages. Ein Zappeln um ein paar Minuten faellt jetzt
durch. Eine Antwort ohne Uhrzeit ueberschreibt ausserdem den letzten guten
Stand nicht mehr, sonst ginge der echte Sprung danach verloren.

Beim Nachmessen zeigte sich, dass meine Doku an der Stelle falsch war: dayTime
ist nicht live, sondern ein Schnappschuss. Fuenf Abrufe ueber zwei Minuten mit
einem Spieler online ergaben denselben Wert (37028620) — der Server schreibt
das XML im "Web API Interval" neu, hier alle 360 Sekunden. Steht jetzt richtig
in docs/ls-feed.md, samt dem verbleibenden Restrisiko: ein Serverneustart
setzt die Uhr auf den gespeicherten Stand zurueck und kann in seltenen Faellen
einen Monat zu viel zaehlen.

Geprueft: echter Sprung, normaler Tagesverlauf, Erstlauf, fehlende Angabe als
0/null/NaN, kleiner Ruecksprung, Ruecksprung am Vormittag, unsinnige Groessen,
und dass eine fehlende dayTime im XML als null ankommt statt als 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 13:05:21 +02:00
co-authored by Claude Opus 5
parent b69cb6c5e4
commit 4ce3c10d76
2 changed files with 58 additions and 12 deletions
+21 -5
View File
@@ -90,11 +90,27 @@ Autosave geschrieben und hinkt bis zu einer Viertelstunde hinterher. Über zwei
Stunden gemessen stieg `playTime` um 50, während die Spieluhr 18,7 Stunden
weiterlief — daraus lässt sich nichts rechnen.
`dayTime` in der Statusabfrage ist dagegen live und zählt Millisekunden seit
Tagesbeginn. Bei `plannedDaysPerPeriod = 1` ist jeder Rücksprung um Mitternacht
ein Monatswechsel. Also: Monat einmal im Panel eintragen, danach zählt der Bot
an dieser Uhr selbst weiter. Steht der Server leer, steht auch die Spielzeit —
und der Monat bleibt richtigerweise stehen.
`dayTime` in der Statusabfrage zählt Millisekunden seit Tagesbeginn und ist
die brauchbarste Uhr im Feed — aber **auch nur ein Schnappschuss**. Der Server
schreibt das XML im „Web API Interval" neu, dazwischen steht derselbe Wert.
Gemessen: fünf Abrufe über zwei Minuten, ein Spieler online, alle identisch
(`dayTime=37028620`).
Bei `plannedDaysPerPeriod = 1` ist jeder Rücksprung um Mitternacht ein
Monatswechsel. Also: Monat einmal im Panel eintragen, danach zählt der Bot an
dieser Uhr selbst weiter. Steht der Server leer, steht auch die Spielzeit — und
der Monat bleibt richtigerweise stehen.
**Ein Rücksprung ist nicht automatisch Mitternacht.** Wer einfach auf
`jetzt < vorher` prüft, ruft bei jeder kaputten Antwort einen neuen Monat aus:
eine fehlende `dayTime` wird schnell zu `0`, und `0` ist kleiner als jeder
Vortagswert. Ein echter Wechsel geht vom späten Abend in den frühen Morgen —
also beide Werte prüfen, nicht nur ihre Differenz.
Bleibt ein Restrisiko: ein Serverneustart lädt den Spielstand und setzt die Uhr
auf den gespeicherten Zeitpunkt zurück. Fällt der zufällig in den frühen
Morgen, während vorher später Abend gemessen wurde, zählt der Bot einen Monat
zu viel. Dann im Panel den richtigen eintragen — von da an läuft es weiter.
Die zwölf Perioden sind übrigens schlicht Monate: `EARLY_SPRING` ist März,
`EARLY_AUTUMN` September.