core: use abstract room, member, roommanager
This commit is contained in:
parent
4e21347199
commit
699abc9d1b
@ -28,14 +28,14 @@ class MatchMaking(WebsocketConsumer):
|
|||||||
|
|
||||||
waiting_room: WaitingRoom = normal.get(self.mode)
|
waiting_room: WaitingRoom = normal.get(self.mode)
|
||||||
waiting_room.append(Waiter(user.pk, self))
|
waiting_room.append(Waiter(user.pk, self))
|
||||||
waiting_room.broadcast(f"{len(waiting_room)} / {waiting_room._mode}")
|
waiting_room.broadcast(f"{len(waiting_room)} / {waiting_room.mode}")
|
||||||
if (len(waiting_room) == self.mode):
|
if (len(waiting_room) == waiting_room.mode):
|
||||||
game_id: int = GameModel().create(waiting_room.get_users_id())
|
game_id: int = GameModel().create(waiting_room.get_users_id())
|
||||||
waiting_room.broadcast("game_found", {"game_id": game_id})
|
waiting_room.broadcast("game_found", {"game_id": game_id})
|
||||||
waiting_room.clear()
|
waiting_room.clear()
|
||||||
|
|
||||||
def disconnect(self, close_code):
|
def disconnect(self, close_code):
|
||||||
waiting_room: WaitingRoom = normal.get(self.mode)
|
waiting_room: WaitingRoom = normal.get(self.mode)
|
||||||
waiter: Waiter = waiting_room.get_waiter_by_socket(self)
|
waiter: Waiter = waiting_room.get_member_by_socket(self)
|
||||||
if (waiter is not None):
|
if (waiter is not None):
|
||||||
waiting_room.remove(waiter)
|
waiting_room.remove(waiter)
|
@ -3,94 +3,37 @@ from django.db import models
|
|||||||
from channels.generic.websocket import WebsocketConsumer
|
from channels.generic.websocket import WebsocketConsumer
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from transcendence.abstract.AbstractRoom import AbstractRoom
|
||||||
|
from transcendence.abstract.AbstractRoomManager import AbstractRoomManager
|
||||||
|
from transcendence.abstract.AbstractRoomMember import AbstractRoomMember
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class Waiter:
|
class Waiter(AbstractRoomMember):
|
||||||
|
pass
|
||||||
|
|
||||||
def __init__(self, user_id: int, socket: WebsocketConsumer):
|
class WaitingRoom(AbstractRoom):
|
||||||
self.user_id: int = user_id
|
|
||||||
self.socket: WebsocketConsumer = socket
|
|
||||||
|
|
||||||
def send(self, detail: str, data: dict = {}):
|
def __init__(self, room_manager,mode):
|
||||||
raw_data: dict = {"detail": detail}
|
super().__init__(room_manager)
|
||||||
raw_data.update(data)
|
self.mode = mode
|
||||||
self.socket.send(text_data=json.dumps(raw_data))
|
|
||||||
|
|
||||||
def accept(self):
|
|
||||||
self.socket.accept()
|
|
||||||
|
|
||||||
def disconnect(self):
|
|
||||||
self.socket.disconnect(200)
|
|
||||||
|
|
||||||
class WaitingRoom:
|
|
||||||
|
|
||||||
def __init__(self, waiting_room_manager, mode: int):
|
|
||||||
self._waiter_list: [Waiter] = []
|
|
||||||
self._mode: int = mode
|
|
||||||
self._waiting_room_manager = waiting_room_manager
|
|
||||||
|
|
||||||
def broadcast(self, detail: str, data: dict = {}):
|
|
||||||
for waiter in self._waiter_list:
|
|
||||||
waiter: Waiter
|
|
||||||
waiter.send(detail, data)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
self._waiter_list.clear()
|
|
||||||
|
|
||||||
def get_waiter_by_socket(self, socket: WebsocketConsumer):
|
|
||||||
for waiter in self._waiter_list:
|
|
||||||
waiter: Waiter
|
|
||||||
if (waiter.socket is socket):
|
|
||||||
return waiter
|
|
||||||
return None
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
def append(self, waiter: Waiter):
|
def append(self, waiter: Waiter):
|
||||||
tmp: Waiter = self.get_waiter_by_user_id(waiter.user_id)
|
tmp: Waiter = self.get_member_by_user_id(waiter.user_id)
|
||||||
if (tmp is not None):
|
if (tmp is not None):
|
||||||
tmp.send("Connection close: Another connection open with the same user id.")
|
tmp.send("Connection close: Another connection open with the same user id.")
|
||||||
self.remove(tmp)
|
self.remove(tmp)
|
||||||
waiter.accept()
|
waiter.accept()
|
||||||
self._waiter_list.append(waiter)
|
self._member_list.append(waiter)
|
||||||
|
|
||||||
def remove(self, waiter: Waiter):
|
class WaitingRoomManager(AbstractRoomManager):
|
||||||
self._waiter_list.remove(waiter)
|
|
||||||
waiter.disconnect()
|
|
||||||
|
|
||||||
def empty(self):
|
|
||||||
for _ in self._waiter_list:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def get_users_id(self):
|
|
||||||
return [waiter.user_id for waiter in self._waiter_list]
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self._waiter_list)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class WaitingRoomManager:
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self._waiting_rooms: [WaitingRoom] = []
|
|
||||||
|
|
||||||
def get(self, mode: int):
|
def get(self, mode: int):
|
||||||
for waiting_room in self._waiting_rooms:
|
for waiting_room in self._room_list:
|
||||||
waiting_room: WaitingRoom = waiting_room
|
waiting_room: WaitingRoom
|
||||||
if (waiting_room._mode == mode):
|
if (waiting_room.mode == mode):
|
||||||
return waiting_room
|
return waiting_room
|
||||||
tmp: WaitingRoom = WaitingRoom(self, mode)
|
tmp: WaitingRoom = WaitingRoom(self, mode)
|
||||||
self._waiting_rooms.append(tmp)
|
super().append(tmp)
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
def remove(self, waiting_room: WaitingRoom):
|
|
||||||
self._waiting_rooms.remove(waiting_room)
|
|
||||||
|
|
||||||
normal: WaitingRoomManager = WaitingRoomManager()
|
normal: WaitingRoomManager = WaitingRoomManager()
|
@ -1,3 +1,5 @@
|
|||||||
|
from channels.generic.websocket import WebsocketConsumer
|
||||||
|
|
||||||
from .AbstractRoomMember import AbstractRoomMember
|
from .AbstractRoomMember import AbstractRoomMember
|
||||||
|
|
||||||
class AbstractRoom:
|
class AbstractRoom:
|
||||||
@ -30,24 +32,20 @@ class AbstractRoom:
|
|||||||
|
|
||||||
|
|
||||||
def append(self, member: AbstractRoomMember):
|
def append(self, member: AbstractRoomMember):
|
||||||
tmp: AbstractRoomMember = self.get_member_by_user_id(member.user_id)
|
|
||||||
if (tmp is not None):
|
|
||||||
tmp.send("Connection close: Another connection open with the same user id.")
|
|
||||||
self.remove(tmp)
|
|
||||||
member.accept()
|
|
||||||
self._member_list.append(waiter)
|
self._member_list.append(waiter)
|
||||||
|
member.accept()
|
||||||
|
|
||||||
def remove(self, member: AbstractRoomMember):
|
def remove(self, member: AbstractRoomMember):
|
||||||
self._member_list.remove(member)
|
self._member_list.remove(member)
|
||||||
waiter.disconnect()
|
member.disconnect()
|
||||||
|
|
||||||
def empty(self):
|
def empty(self):
|
||||||
for _ in self._waiter_list:
|
for _ in self._member_list:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_users_id(self):
|
def get_users_id(self):
|
||||||
return [waiter.user_id for waiter in self._waiter_list]
|
return [member.user_id for member in self._member_list]
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self._waiter_list)
|
return len(self._member_list)
|
@ -5,14 +5,8 @@ class AbstractRoomManager:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._room_list: [AbstractRoom] = []
|
self._room_list: [AbstractRoom] = []
|
||||||
|
|
||||||
def get(self, mode: int):
|
def append(self, room: AbstractRoom):
|
||||||
for room in self._room_list:
|
self._room_list.append(room)
|
||||||
room: A
|
|
||||||
if (waiting_room._mode == mode):
|
def remove(self, room: AbstractRoom):
|
||||||
return waiting_room
|
self._room_list.remove(room)
|
||||||
tmp: WaitingRoom = WaitingRoom(self, mode)
|
|
||||||
self._waiting_rooms.append(tmp)
|
|
||||||
return tmp
|
|
||||||
|
|
||||||
def remove(self, waiting_room: WaitingRoom):
|
|
||||||
self._waiting_rooms.remove(waiting_room)
|
|
@ -1,3 +1,7 @@
|
|||||||
|
from channels.generic.websocket import WebsocketConsumer
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
class AbstractRoomMember:
|
class AbstractRoomMember:
|
||||||
|
|
||||||
def __init__(self, user_id: int, socket: WebsocketConsumer):
|
def __init__(self, user_id: int, socket: WebsocketConsumer):
|
||||||
|
Loading…
Reference in New Issue
Block a user