48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
"""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."
|