Browse Source

Statut Discord : une date sans fuseau n'empêche plus le démarrage

Une date sans fuseau dans presence_state.json (par exemple
"step_end": "2026-11-03T10:00:00" après une modification à la main)
était acceptée par datetime.fromisoformat. La comparaison
« step_end <= now », hors du try de PresenceManager.restore, levait
alors TypeError (offset-naive / offset-aware). Comme start() appelle
restore depuis setup_hook, le bot ne démarrait plus.

restore refuse maintenant ces dates dans le try, comme une date
illisible : avertissement « illisible, ignoré », et un nouveau
statut est tiré.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Johnounet 6 hours ago
parent
commit
46cbf18653
3 changed files with 5 additions and 4 deletions
  1. 2 0
      CHANGELOG.md
  2. 3 0
      bot/presence.py
  3. 0 4
      tests/test_presence.py

+ 2 - 0
CHANGELOG.md

@@ -54,6 +54,8 @@ Les versions les plus récentes sont en haut. Chaque entrée commence par un ré
 
 - **Une longue réponse avec du code n'est plus coupée.** Quand un bloc de code commençait juste à la fin d'un morceau de 2000 caractères, ce morceau dépassait la limite de Discord et la suite de la réponse n'était pas envoyée. Le bloc passe maintenant au morceau suivant ; même chose pour les fiches de `/memoire`.
 
+- **Une date sans fuseau dans `presence_state.json` n'empêche plus le démarrage.** Après une modification à la main, une date comme `2026-11-03T10:00:00` arrêtait le bot dès le lancement. Le fichier est maintenant ignoré, avec un avertissement dans le journal, et Rika tire un nouveau statut.
+
 ---
 
 ## Version 5.11

+ 3 - 0
bot/presence.py

@@ -242,6 +242,9 @@ class PresenceManager:
             saved_at = datetime.fromisoformat(data["saved_at"])
             step_end = datetime.fromisoformat(data["step_end"])
             status_end = datetime.fromisoformat(data["status_end"]) if data.get("status_end") else None
+            if any(date and date.tzinfo is None for date in (saved_at, step_end, status_end)):
+                # Fichier modifié à la main : comparée à l'heure actuelle, une telle date lèverait TypeError.
+                raise ValueError("date sans fuseau horaire")
         except FileNotFoundError:
             return
         except (OSError, ValueError, TypeError, KeyError, AttributeError) as exc:

+ 0 - 4
tests/test_presence.py

@@ -298,11 +298,7 @@ class RestoreTest(unittest.IsolatedAsyncioTestCase):
                 self.assertEqual(manager.status, Status(Kind.ONLINE))
                 self.assertEqual(manager.program, [])
 
-    @unittest.expectedFailure
     def test_date_without_timezone(self):
-        # BUG : une date sans fuseau (« 2026-11-03T09:10:00 », fichier modifié à la main) est lue
-        # sans erreur, puis comparée à l'heure actuelle (avec fuseau) en dehors du try de restore :
-        # TypeError, et le bot ne démarre pas, au lieu d'ignorer le fichier comme un fichier illisible.
         self.save(Status(Kind.GAME, title="Celeste"), 60)
         valid = json.loads(self.state_file.read_text(encoding="utf-8"))
         self.state_file.write_text(json.dumps({**valid, "step_end": "2026-11-03T10:00:00"}), encoding="utf-8")