from typing import Any _MAX_LINES_PER_COLUMN = 200 _MAX_SPEAKER_LENGTH = 60 # Question à choix (voir "❓ Question", static/js/triggers/trigger-editor.js) : # une bulle jaune posée dans le même enchaînement qu'une réplique de # dialogue — plusieurs choix, une seule bonne réponse, une récompense. # Un seul type de récompense pour l'instant (le score, voir db.SCORE_STATUS_*/ # db.set_score_value) — liste plutôt qu'un booléen pour pouvoir en ajouter # d'autres plus tard sans changer la forme des données. QUESTION_REWARD_TYPES = ["score"] _MIN_CHOICES = 2 _MAX_CHOICES = 4 def _sanitize_dialogue_line(raw_line: dict[str, Any]) -> dict[str, Any] | None: speaker = raw_line.get("speaker") text = raw_line.get("text") if not isinstance(speaker, str) or not speaker.strip(): return None if not isinstance(text, str) or not text.strip(): return None line = {"type": "dialogue", "speaker": speaker.strip()[:_MAX_SPEAKER_LENGTH], "text": text.strip()} # Réplique audio (demande explicite : "ajouter une réplique audio") # — une voix off jouée en même temps que la bulle s'affiche, voir # "Mes assets" (un fichier déjà importé, jamais un chemin arbitraire # posté à la main : la sélection se fait via un