42_ft_transcendence/matchmaking/consumers.py

53 lines
1.9 KiB
Python

from channels.generic.websocket import WebsocketConsumer
from django.contrib.auth.models import User
from games.models import GameModel
import json
from .models import Waiter, WaitingRoom, waiting_room_manager
class MatchMaking(WebsocketConsumer):
def connect(self):
user: User = self.scope["user"]
if (user.is_anonymous or not user.is_authenticated):
return
self.mode: int = int(self.scope['url_route']['kwargs']['mode'])
self.game_type: str = self.scope['url_route']['kwargs']['game_type']
self.group_name = self.mode
self.waiting_room: WaitingRoom = waiting_room_manager.get(self.game_type, self.mode)
self.waiting_room.append(Waiter(user, self))
if (self.mode < 2 or self.mode > 4):
data: dict = {
"detail": "The mode must be > 1 and < 4.",
}
self.send(json.dumps(data))
self.disconnect(1000)
return
if (self.game_type not in ["tictactoe", "pong"]):
data: dict = {
"detail": "The game_type must 'pong' or 'tictactoe'.",
}
self.send(json.dumps(data))
self.disconnect(1000)
return
self.waiting_room.broadcast(f"{len(self.waiting_room)} / {self.waiting_room.mode}")
if (len(self.waiting_room) == self.waiting_room.mode):
game_id: int = GameModel(game_type=self.game_type).create(self.waiting_room.get_members())
self.waiting_room.broadcast("game_found", {"game_id": game_id, "game_type": self.game_type})
def disconnect(self, close_code):
super().disconnect(close_code)
waiting_room: WaitingRoom = waiting_room_manager.get(self.game_type, self.mode)
waiter: Waiter = waiting_room.get_member_by_socket(self)
if (waiter is not None):
waiting_room.remove(waiter)