42_ft_transcendence/games/consumers.py

61 lines
1.7 KiB
Python

from channels.generic.websocket import WebsocketConsumer
from django.contrib.auth.models import User
import json
from .objects.GameRoomManager import GameRoomManager
from .objects.GameMember import GameMember
from .objects.Game import Game
from .objects.GameManager import GameManager
game_room_manager: GameRoomManager = GameRoomManager()
game_manager: GameManager = GameManager()
class GameWebSocket(WebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.channel_name = "games"
self.group_name = "games"
def send_game_data(self):
self.member.send("init_game", self.game.to_dict())
def connect(self):
self.user: User = self.scope["user"]
if (self.user.is_anonymous or not self.user.is_authenticated):
return
self.channel_layer.group_add(self.group_name, self.channel_name)
self.game_id = int(self.scope['url_route']['kwargs']['game_id'])
self.game = game_manager.get(self.game_id)
self.room = game_room_manager.get(self.game_id)
if (self.room is None):
self.send("Game not found.")
self.disconnect(1017)
self.member = GameMember(self.user.pk, self, self.room)
self.room.append(self.member)
self.send_game_data()
def receive(self, text_data: str = None, bytes_data: bytes = None):
if (text_data is None):
return
data: dict = json.loads(text_data)
self.member.receive(data)
def disconnect(self, close_code):
member = self.room.get_member_by_socket(self)
if (member is not None):
self.room.remove(self.member, close_code)