47 lines
1.5 KiB
Python
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)
|