"""Validierungs-Helfer für Benutzereingaben.""" import re MIN_TELEFON_ZIFFERN: int = 10 MIN_SPIELNAME_LAENGE: int = 2 MAX_SPIELNAME_LAENGE: int = 200 MIN_SPIELERANZAHL: int = 1 MAX_SPIELERANZAHL: int = 20 def validiere_telefonnummer(telefon: str) -> str: """Validiert und normalisiert eine Telefonnummer. Args: telefon: Telefonnummer im beliebigen Format, z.B. '+491****7890', '+49 123 4567890', '00491234567890'. '*' wird als Maskierungs-Platzhalter behandelt (>=1 Ziffer). Returns: Bereinigte Telefonnummer, die mit '+' beginnt, '*' als Platzhalter. Raises: ValueError: Wenn weniger als 10 Ziffern oder kein '+' nach Bereinigung. """ # Ziffern zählen (* als Platzhalter für >=1 Ziffer) ziffern_count = len(re.findall(r"\d|\*", telefon)) # Alles außer +, * und Ziffern entfernen bereinigt = re.sub(r"[^\d*+]", "", telefon) # "00" am Anfang zu "+" konvertieren if bereinigt.startswith("00"): bereinigt = "+" + bereinigt[2:] # Muss mit + beginnen (nach Bereinigung) if not bereinigt.startswith("+"): raise ValueError(f"Telefonnummer muss mit + beginnen: {telefon}") # Mindestens 10 Ziffern (* zählt als eine) if ziffern_count < MIN_TELEFON_ZIFFERN: raise ValueError(f"Telefonnummer muss mindestens 10 Ziffern haben: {telefon}") return bereinigt def validiere_spiel_name(name: str) -> str: """Validiert einen Spielnamen. Args: name: Spielname mit 2-200 Zeichen. Returns: Bereinigter Spielname ohne HTML-Tags, mit gestrippten Rändern. Raises: ValueError: Wenn weniger als 2 oder mehr als 200 Zeichen. """ # HTML-Tags entfernen without_tags = re.sub(r"<[^>]*>", "", name) stripped = without_tags.strip() if len(stripped) < MIN_SPIELNAME_LAENGE: raise ValueError(f"Spielname muss mindestens 2 Zeichen haben: {name}") if len(stripped) > MAX_SPIELNAME_LAENGE: raise ValueError(f"Spielname darf maximal 200 Zeichen haben: {name}") return stripped def validiere_spieleranzahl(anzahl: int) -> int: """Validiert eine Spieleranzahl. Args: anzahl: Anzahl der Spieler (1-20). Returns: Die unveränderte Spieleranzahl. Raises: ValueError: Wenn < 1, > 20 oder kein Integer. """ if not isinstance(anzahl, int) or isinstance(anzahl, bool): raise ValueError(f"Spieleranzahl muss eine Ganzzahl sein: {anzahl}") if anzahl < MIN_SPIELERANZAHL: raise ValueError(f"Spieleranzahl muss mindestens 1 sein: {anzahl}") if anzahl > MAX_SPIELERANZAHL: raise ValueError(f"Spieleranzahl darf maximal 20 sein: {anzahl}") return anzahl