SOULGATE/server/websocket.py
2026-05-04 03:42:47 +02:00

47 lines
1.5 KiB
Python

# Gestionnaire de connexions WebSocket — accepte, envoie, broadcast
import logging
from fastapi import WebSocket
logger = logging.getLogger(__name__)
class ConnectionManager:
def __init__(self) -> None:
self.connections: dict[str, WebSocket] = {}
self.usernames: dict[str, str] = {}
self._counter: int = 0
def _next_id(self) -> str:
self._counter += 1
return f"conn_{self._counter}"
async def connect(self, websocket: WebSocket) -> str:
await websocket.accept()
conn_id = self._next_id()
self.connections[conn_id] = websocket
logger.info("Connexion %s établie", conn_id)
return conn_id
def disconnect(self, conn_id: str) -> None:
self.connections.pop(conn_id, None)
self.usernames.pop(conn_id, None)
logger.info("Connexion %s fermée", conn_id)
def set_username(self, conn_id: str, username: str) -> None:
self.usernames[conn_id] = username
def get_username(self, conn_id: str) -> str | None:
return self.usernames.get(conn_id)
async def send(self, conn_id: str, message: dict) -> None:
ws = self.connections.get(conn_id)
if ws:
await ws.send_json(message)
async def dispatch(self, messages: list[tuple[str, dict]]) -> None:
"""Envoie une liste de (conn_id, message) produite par le LobbyManager."""
for conn_id, message in messages:
await self.send(conn_id, message)