35 lines
976 B
Python
35 lines
976 B
Python
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
|