diff --git a/src/config/constants.py b/src/config/constants.py index ea1463e..2078a04 100644 --- a/src/config/constants.py +++ b/src/config/constants.py @@ -38,6 +38,7 @@ class ApiEndPoints(Enum): QUEUE_STATUS = '/queue/status/' QUEUE_LEAVE = '/queue/leave' QUEUE_JOIN = '/queue/join' + QUEUE_REFRESH = '/queue/refresh' REGISTER_USER = '/api_v2/connection/register' class Glow(Enum): diff --git a/src/fivemserver/queuemanager.py b/src/fivemserver/queuemanager.py index 06b7b9a..dfed110 100644 --- a/src/fivemserver/queuemanager.py +++ b/src/fivemserver/queuemanager.py @@ -1,15 +1,17 @@ -# queue_manager.py — Aucune dépendance Qt import requests import time from typing import Callable from config.constants import Urls, ApiEndPoints +from config.constants import PlayerServerInfo # ← à ajouter si pas déjà importé class QueueManager: def __init__(self, user_id: str, on_update: Callable[[str], None]): self.user_id = user_id - self.on_update = on_update # Callback pour envoyer les mises à jour + self.on_update = on_update self._running = True + self._last_refresh = 0 # ← timestamp du dernier refresh + self.REFRESH_INTERVAL = 30 # ← en secondes def stop(self): self._running = False @@ -23,7 +25,9 @@ class QueueManager: return res.json() def check_status(self) -> dict: - res = requests.get(f"{Urls.API_URL.value}{ApiEndPoints.QUEUE_STATUS.value}/{self.user_id}") + res = requests.get( + f"{Urls.API_URL.value}{ApiEndPoints.QUEUE_STATUS.value}/{self.user_id}" + ) return res.json() def leave_queue(self): @@ -33,24 +37,50 @@ class QueueManager: verify=False ) + def refresh_session(self): + """Informe le serveur que le client est toujours présent, sans changer le session_id.""" + session_id = PlayerServerInfo.session_id + if not session_id: + return + try: + requests.post( + f"{Urls.API_URL.value}{ApiEndPoints.QUEUE_REFRESH.value}", + json={ + "uuid": self.user_id, + "session_id": session_id, + }, + verify=False, + timeout=5, + ) + except requests.RequestException: + pass # On ignore silencieusement, le serveur expirera de lui-même + def start(self): join = self.join_queue() - # print(f"[QueueManager] join response: {join}") # ← Debug - if join.get("position") == 0: # Position 0 = slot libre + if join.get("position") == 0: self.on_update("ok") return self.on_update(f"position:{join.get('position')}:{join.get('queueSize')}") + self._last_refresh = time.monotonic() # ← démarre le compteur après le join + while self._running: time.sleep(5) if not self._running: break + # Refresh du session_id toutes les 30 secondes + now = time.monotonic() + if now - self._last_refresh >= self.REFRESH_INTERVAL: + self.refresh_session() + self._last_refresh = now + + # Vérification de la position en file status = self.check_status() - if status.get("position") == 0: # Position 0 = c'est le tour + if status.get("position") == 0: self.on_update("ready") return else: diff --git a/src/ui/main_window.py b/src/ui/main_window.py index 103c9fd..fcd7474 100644 --- a/src/ui/main_window.py +++ b/src/ui/main_window.py @@ -36,6 +36,7 @@ class MainWindow(QMainWindow): self.config = config_manager self.stored_user_id = self.config.get_discord_user() self.queue_thread = None + self.queue_position_value = None # UI self.ui = QUiLoader().load(f"{bundle_dir}/ui/mainwindow_vertical_pager.ui", self) @@ -149,9 +150,39 @@ class MainWindow(QMainWindow): def _on_connexion(self) -> None: try: - session_id = GetServerTokenForDiscord.authenticate(Urls.API_URL.value) - GetServerTokenForDiscord.register_discord_user(self.stored_user_id, session_id) + if not self.stored_user_id or self.stored_user_id.isspace(): + show_qt_error( + self, + "Connexion impossible", + "Aucun identifiant Discord n'est disponible. Merci de passer par la connexion Discord." + ) + return + + if not PlayerServerInfo.session_id: + PlayerServerInfo.session_id = GetServerTokenForDiscord.authenticate(Urls.API_URL.value) + GetServerTokenForDiscord.register_discord_user( + self.stored_user_id, + PlayerServerInfo.session_id, + ) + + if self.queue_position_value is None: + show_qt_error( + self, + "Connexion en attente", + "La position dans la file d'attente n'est pas encore connue." + ) + return + + if self.queue_position_value != 0: + show_qt_error( + self, + "Connexion en attente", + f"Tu dois attendre ton tour.\n\nPosition actuelle : {self.queue_position_value}" + ) + return + FiveMLauncher.launch() + except ApiError as exc: show_qt_error(self, "Connexion impossible", f"Erreur lors de la connexion.\n\n{exc}") @@ -218,28 +249,26 @@ class MainWindow(QMainWindow): self.queue_thread.start() # 🧪 TEMP - Simule une position en queue pour tester l'UI - self.handle_update("position:3:10") + # self.handle_update("position:3:10") def handle_update(self, message: str): - # print(f"[handle_update] reçu: {message}") # ← Debug if message == "ok": - self.ui.queue_lbl.setVisible(False) + self.ui.queue_lbl.setVisible(True) self.ui.queue_position.setVisible(False) - #self.ui.connexion_btn.setEnabled(True) - #self.ui.connexion_btn.setText("Lancer FiveM") - #self.launch_fivem() + self.ui.queue_lbl.setText("🚀 C'est votre tour !") + self.queue_position_value = 0 elif message == "ready": self.ui.queue_lbl.setVisible(True) self.ui.queue_position.setVisible(False) self.ui.queue_lbl.setText("🚀 C'est votre tour !") - self.launch_fivem() + self.queue_position_value = 0 elif message.startswith("position:"): _, pos, total = message.split(":") + self.queue_position_value = int(pos) self.ui.queue_lbl.setVisible(True) self.ui.queue_position.setVisible(True) - #self.ui.queue_position.setText(f"{pos} / {total}") <- si on veux le total de slots self.ui.queue_position.setText(f"{pos}") def launch_fivem(self):