fix: matchmaking support start stop, multi connection

This commit is contained in:
2023-12-23 16:47:22 +01:00
parent 6c39a13aca
commit c02c49215d
5 changed files with 92 additions and 32 deletions

View File

@ -39,4 +39,4 @@ class MatchMaking(WebsocketConsumer):
waiting_room: WaitingRoom = normal.get(self.mode)
waiter: Waiter = waiting_room.get_waiter_by_socket(self)
if (waiter is not None):
waiting_room.remove(self.scope["user"].pk)
waiting_room.remove(waiter)

View File

@ -10,17 +10,16 @@ class Waiter:
self.user_id: int = user_id
self.socket: WebsocketConsumer = socket
def send(self, data: dict):
self.socket.send(text_data=json.dumps(data))
def send(self, detail: str, data: dict = {}):
raw_data: dict = {"detail": detail}
raw_data.update(data)
self.socket.send(text_data=json.dumps(raw_data))
def accept(self):
self.socket.accept()
def disconnect(self):
self.socket.disconnect()
def __eq__(self, obj):
return self.user_id == obj.user_id
self.socket.disconnect(200)
class WaitingRoom:
@ -29,10 +28,10 @@ class WaitingRoom:
self._mode: int = mode
self._waiting_room_manager = waiting_room_manager
def broadcast(self, data: dict):
def broadcast(self, detail: str, data: dict = {}):
for waiter in self._waiter_list:
waiter: Waiter
waiter.send(data)
waiter.send(detail, data)
def clear(self):
self._waiter_list.clear()
@ -44,20 +43,25 @@ class WaitingRoom:
return waiter
return None
def append(self, waiter: Waiter):
def get_waiter_by_user_id(self, user_id: int):
for waiter in self._waiter_list:
waiter: Waiter
if (waiter.user_id == user_id):
return waiter
return None
self.remove(waiter)
def append(self, waiter: Waiter):
tmp: Waiter = self.get_waiter_by_user_id(waiter.user_id)
if (tmp is not None):
tmp.send("Connection close: Another connection open with the same user id.")
self.remove(tmp)
waiter.accept()
self._waiter_list.append(waiter)
def remove(self, users_id):
for waiter in self._waiter_list:
waiter: Waiter = waiter
if (waiter == users_id):
waiter.disconnect()
if (self.empty()):
self._waiting_room_manager.remove(self)
return
def remove(self, waiter: Waiter):
self._waiter_list.remove(waiter)
waiter.disconnect()
def empty(self):
for _ in self._waiter_list: