from __future__ import annotations import threading from collections import deque from typing import Deque, Optional, Tuple from .net import ServerClient class Matchmaker: def __init__(self) -> None: self._queue: Deque[ServerClient] = deque() self._lock = threading.Lock() def enqueue(self, client: ServerClient) -> None: with self._lock: # Avoid duplicates if client in self._queue: return self._queue.append(client) def dequeue_pair(self) -> Optional[Tuple[ServerClient, ServerClient]]: with self._lock: if len(self._queue) >= 2: c1 = self._queue.popleft() c2 = self._queue.popleft() return c1, c2 return None def remove(self, client: ServerClient) -> None: with self._lock: try: self._queue.remove(client) except ValueError: pass