"""Optionaler Punkte-Upload. Standardmässig **deaktiviert**: Es passiert nichts, solange ``HAG_SCORE_URL`` nicht gesetzt ist. Zugangsdaten kommen aus der Umgebung (``HAG_SCORE_API_KEY``) – nicht aus dem Quellcode. """ from __future__ import annotations import urllib.error import urllib.parse import urllib.request from . import config def submit_score( name: str, percent: float, *, url: str | None = None, api_key: str | None = None, timeout: float | None = None, ) -> tuple[bool, str]: """Sendet das Ergebnis. Rückgabe: ``(erfolgreich, meldung)``.""" endpoint = url if url is not None else config.SCORE_URL if not endpoint: return False, "" payload = urllib.parse.urlencode( { "name": name, "score": int(percent), "api_key": api_key if api_key is not None else config.SCORE_API_KEY, } ).encode("utf-8") try: request = urllib.request.Request(endpoint, data=payload) with urllib.request.urlopen(request, timeout=timeout or config.SCORE_TIMEOUT) as response: body = response.read().decode("utf-8", "replace") except (urllib.error.URLError, OSError, ValueError) as exc: return False, f"Punkte konnten nicht gesendet werden: {exc}" if "success" not in body.lower(): return False, "Punkte konnten nicht gesendet werden (unerwartete Serverantwort)." return True, "Punkte gesendet."