core: fix: matchmaking and game

This commit is contained in:
2024-04-22 11:37:08 +02:00
parent d31d3e053e
commit e125eb16c7
16 changed files with 135 additions and 134 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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))