diff --git a/src/fivemserver/auth_worker.py b/src/fivemserver/auth_worker.py new file mode 100644 index 0000000..2a23e13 --- /dev/null +++ b/src/fivemserver/auth_worker.py @@ -0,0 +1,64 @@ +# workers/auth_worker.py +from PySide6.QtCore import QThread, Signal +from config.constants import Urls +from fivemserver.get_server_token import GetServerTokenForDiscord +from tools.http_client import ApiError # Importe ton exception personnalisée + +class AuthWorker(QThread): + # Signaux pour communiquer avec l'UI + # finished(success, session_id, error_message) + finished = Signal(bool, str, str) + + def __init__(self, discord_user_id: str, parent=None): + super().__init__(parent) + self.discord_user_id = discord_user_id + self._is_running = True + + def run(self): + """Exécuté dans un thread séparé.""" + session_id = "" + error_msg = "" + success = False + + if not self.discord_user_id or self.discord_user_id.isspace(): + self.finished.emit(False, "", "Identifiant Discord invalide.") + return + + try: + # 1. Authentification (Récupération du token) + # Assure-toi que GetServerTokenForDiscord à un timeout interne ! + print(f"[AuthWorker] Tentative d'authentification pour {self.discord_user_id}...") + token = GetServerTokenForDiscord.authenticate(Urls.API_URL.value) + + if not token: + raise ApiError("Le serveur n'a pas renvoyé de token valide.") + + session_id = token + print(f"[AuthWorker] Token récupéré: {session_id[:10]}...") + + # 2. Enregistrement de l'utilisateur (C'est souvent ici que ça bloque SSL) + print(f"[AuthWorker] Enregistrement de l'utilisateur...") + GetServerTokenForDiscord.register_discord_user( + self.discord_user_id, + session_id + ) + + print(f"[AuthWorker] Authentification réussie.") + success = True + + except ApiError as e: + error_msg = f"Erreur API: {str(e)}" + print(f"[AuthWorker] {error_msg}") + except Exception as e: + # Capture large pour le debug SSL de Python 3.14 + error_msg = f"Erreur critique (SSL/Réseau): {str(e)}" + print(f"[AuthWorker] {error_msg}") + finally: + # On émet le signal de fin avec les résultats + if self._is_running: + self.finished.emit(success, session_id, error_msg) + + def stop(self): + """Permet d'annuler le thread proprement.""" + self._is_running = False + self.requestInterruption() # Demande l'interruption à QThread \ No newline at end of file