Gestion refresh session_id au serveur

This commit is contained in:
2026-03-24 12:36:50 +01:00
parent 6eccea5b9d
commit e50b24dfec
3 changed files with 76 additions and 16 deletions

View File

@@ -38,6 +38,7 @@ class ApiEndPoints(Enum):
QUEUE_STATUS = '/queue/status/' QUEUE_STATUS = '/queue/status/'
QUEUE_LEAVE = '/queue/leave' QUEUE_LEAVE = '/queue/leave'
QUEUE_JOIN = '/queue/join' QUEUE_JOIN = '/queue/join'
QUEUE_REFRESH = '/queue/refresh'
REGISTER_USER = '/api_v2/connection/register' REGISTER_USER = '/api_v2/connection/register'
class Glow(Enum): class Glow(Enum):

View File

@@ -1,15 +1,17 @@
# queue_manager.py — Aucune dépendance Qt
import requests import requests
import time import time
from typing import Callable from typing import Callable
from config.constants import Urls, ApiEndPoints from config.constants import Urls, ApiEndPoints
from config.constants import PlayerServerInfo # ← à ajouter si pas déjà importé
class QueueManager: class QueueManager:
def __init__(self, user_id: str, on_update: Callable[[str], None]): def __init__(self, user_id: str, on_update: Callable[[str], None]):
self.user_id = user_id 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._running = True
self._last_refresh = 0 # ← timestamp du dernier refresh
self.REFRESH_INTERVAL = 30 # ← en secondes
def stop(self): def stop(self):
self._running = False self._running = False
@@ -23,7 +25,9 @@ class QueueManager:
return res.json() return res.json()
def check_status(self) -> dict: 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() return res.json()
def leave_queue(self): def leave_queue(self):
@@ -33,24 +37,50 @@ class QueueManager:
verify=False 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): def start(self):
join = self.join_queue() 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") self.on_update("ok")
return return
self.on_update(f"position:{join.get('position')}:{join.get('queueSize')}") 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: while self._running:
time.sleep(5) time.sleep(5)
if not self._running: if not self._running:
break 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() status = self.check_status()
if status.get("position") == 0: # Position 0 = c'est le tour if status.get("position") == 0:
self.on_update("ready") self.on_update("ready")
return return
else: else:

View File

@@ -36,6 +36,7 @@ class MainWindow(QMainWindow):
self.config = config_manager self.config = config_manager
self.stored_user_id = self.config.get_discord_user() self.stored_user_id = self.config.get_discord_user()
self.queue_thread = None self.queue_thread = None
self.queue_position_value = None
# UI # UI
self.ui = QUiLoader().load(f"{bundle_dir}/ui/mainwindow_vertical_pager.ui", self) 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: def _on_connexion(self) -> None:
try: try:
session_id = GetServerTokenForDiscord.authenticate(Urls.API_URL.value) if not self.stored_user_id or self.stored_user_id.isspace():
GetServerTokenForDiscord.register_discord_user(self.stored_user_id, session_id) 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() FiveMLauncher.launch()
except ApiError as exc: except ApiError as exc:
show_qt_error(self, "Connexion impossible", f"Erreur lors de la connexion.\n\n{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() self.queue_thread.start()
# 🧪 TEMP - Simule une position en queue pour tester l'UI # 🧪 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): def handle_update(self, message: str):
# print(f"[handle_update] reçu: {message}") # ← Debug
if message == "ok": if message == "ok":
self.ui.queue_lbl.setVisible(False) self.ui.queue_lbl.setVisible(True)
self.ui.queue_position.setVisible(False) self.ui.queue_position.setVisible(False)
#self.ui.connexion_btn.setEnabled(True) self.ui.queue_lbl.setText("🚀 C'est votre tour !")
#self.ui.connexion_btn.setText("Lancer FiveM") self.queue_position_value = 0
#self.launch_fivem()
elif message == "ready": elif message == "ready":
self.ui.queue_lbl.setVisible(True) self.ui.queue_lbl.setVisible(True)
self.ui.queue_position.setVisible(False) self.ui.queue_position.setVisible(False)
self.ui.queue_lbl.setText("🚀 C'est votre tour !") self.ui.queue_lbl.setText("🚀 C'est votre tour !")
self.launch_fivem() self.queue_position_value = 0
elif message.startswith("position:"): elif message.startswith("position:"):
_, pos, total = message.split(":") _, pos, total = message.split(":")
self.queue_position_value = int(pos)
self.ui.queue_lbl.setVisible(True) self.ui.queue_lbl.setVisible(True)
self.ui.queue_position.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}") self.ui.queue_position.setText(f"{pos}")
def launch_fivem(self): def launch_fivem(self):