core: fix: matchmaking and game
This commit is contained in:
@ -1,51 +1,57 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from channels.generic.websocket import WebsocketConsumer
|
||||
|
||||
from .AbstractRoomMember import AbstractRoomMember
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from profiles.models import ProfileModel
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .AbstractRoomManager import AbstractRoomManager
|
||||
|
||||
class AbstractRoom:
|
||||
|
||||
def __init__(self, room_manager):
|
||||
self._member_list: list[AbstractRoomMember] = []
|
||||
self.room_manager = room_manager
|
||||
def __init__(self, room_manager: AbstractRoomManager):
|
||||
self._member_list: set[AbstractRoomMember] = set()
|
||||
self._room_manager: AbstractRoomManager = room_manager
|
||||
|
||||
def broadcast(self, detail: str, data: dict = {}):
|
||||
for member in self._member_list:
|
||||
member: AbstractRoomMember
|
||||
def broadcast(self, detail: str, data: dict = {}, excludes: set[AbstractRoomMember] = set()) -> None:
|
||||
|
||||
members: set[AbstractRoomMember] = self._member_list - excludes
|
||||
|
||||
for member in members:
|
||||
member.send(detail, data)
|
||||
|
||||
def get_member_by_socket(self, socket: WebsocketConsumer) -> AbstractRoomMember | None:
|
||||
|
||||
for member in self._member_list:
|
||||
if member.socket is socket:
|
||||
return member
|
||||
|
||||
def get_member_by_user(self, user: User) -> AbstractRoomMember:
|
||||
|
||||
for member in self._member_list:
|
||||
if member.user == user:
|
||||
return member
|
||||
|
||||
def clear(self):
|
||||
self._member_list.clear()
|
||||
def get_members_profiles(self) -> set[ProfileModel]:
|
||||
return set(member.user.profilemodel for member in self._member_list)
|
||||
|
||||
def get_members(self) -> set[ProfileModel]:
|
||||
return set(member.user for member in self._member_list)
|
||||
|
||||
def get_member_by_socket(self, socket: WebsocketConsumer):
|
||||
for member in self._member_list:
|
||||
member: AbstractRoomMember
|
||||
if (member.socket is socket):
|
||||
return member
|
||||
return None
|
||||
def append(self, member: AbstractRoomMember) -> None:
|
||||
self._member_list.add(member)
|
||||
|
||||
def get_member_by_user_id(self, user_id: int):
|
||||
for member in self._member_list:
|
||||
member: AbstractRoomMember
|
||||
if (member.user_id == user_id):
|
||||
return member
|
||||
return None
|
||||
|
||||
|
||||
def append(self, member: AbstractRoomMember):
|
||||
self._member_list.append(member)
|
||||
member.accept()
|
||||
|
||||
def remove(self, member: AbstractRoomMember, code: int = 1000):
|
||||
def remove(self, member: AbstractRoomMember) -> None:
|
||||
self._member_list.remove(member)
|
||||
member.socket.disconnect(code)
|
||||
|
||||
def empty(self):
|
||||
for _ in self._member_list:
|
||||
return False
|
||||
return True
|
||||
def get_users(self) -> set[User]:
|
||||
return set(member.user for member in self._member_list)
|
||||
|
||||
def get_users_id(self):
|
||||
return [member.user_id for member in self._member_list]
|
||||
|
||||
def __len__(self):
|
||||
def __len__(self) -> int:
|
||||
return len(self._member_list)
|
||||
|
@ -5,8 +5,8 @@ class AbstractRoomManager:
|
||||
def __init__(self):
|
||||
self._room_list: list[AbstractRoom] = []
|
||||
|
||||
def remove(self, room: AbstractRoom):
|
||||
def remove(self, room: AbstractRoom) -> None:
|
||||
self._room_list.remove(room)
|
||||
|
||||
def append(self, room: AbstractRoom):
|
||||
def append(self, room: AbstractRoom) -> None:
|
||||
self._room_list.append(room)
|
||||
|
@ -1,14 +1,16 @@
|
||||
from channels.generic.websocket import WebsocketConsumer
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
import json
|
||||
|
||||
class AbstractRoomMember:
|
||||
|
||||
def __init__(self, user_id: int, socket: WebsocketConsumer):
|
||||
self.user_id: int = user_id
|
||||
def __init__(self, user: User, socket: WebsocketConsumer):
|
||||
self.user: User = user
|
||||
self.socket: WebsocketConsumer = socket
|
||||
|
||||
def send(self, detail: str, data: dict = {}):
|
||||
def send(self, detail: str, data: dict = {}) -> None:
|
||||
raw_data: dict = {"detail": detail}
|
||||
raw_data.update(data)
|
||||
self.socket.send(text_data=json.dumps(raw_data))
|
Reference in New Issue
Block a user