game: add: close game when nobody in

This commit is contained in:
2024-02-21 19:04:25 +01:00
committed by AdrienLSH
parent 35af766c2b
commit b6936751b1
4 changed files with 59 additions and 14 deletions

View File

@ -22,15 +22,22 @@ from ..routine import routine
import threading
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .GameManager import GameManager
class Game(AbstractRoom):
def __init__(self, game_id):
def __init__(self, game_id: int, game_manager):
super().__init__(None)
self.game_manager: GameManager = game_manager
self.ball: Ball = Ball()
self.model: GameModel = GameModel.objects.get(pk = game_id)
self.started = False
self.stopped: bool = False
radius: float = min(config.MAP_SIZE_X, config.MAP_SIZE_Y) / 2 - 10
@ -105,6 +112,12 @@ class Game(AbstractRoom):
return False
return True
def nobody_is_here(self):
for player in self.players:
if player.is_connected():
return False
return len(self.spectators) == 0
def _player_join(self, user_id: int, socket: WebsocketConsumer):
player = self.get_player_by_user_id(user_id)
@ -127,7 +140,14 @@ class Game(AbstractRoom):
def _update_player(self, player: Player):
self._updated_players.append(player)
def finish(self, winner: Player):
self.model.finish(winner.user_id)
def _player_leave(self, player: Player):
if (self.nobody_is_here()):
if (self.model.started):
self.finish(player)
return
self._update_player(player)
def _spectator_join(self, user_id: int, socket: WebsocketConsumer):
@ -149,9 +169,8 @@ class Game(AbstractRoom):
return member
def start(self):
if (self.started == True):
if (self.model.started == True):
return
self.started = True
self.model.start()
def leave(self, member: AbstractRoomMember):
@ -159,6 +178,10 @@ class Game(AbstractRoom):
self._player_leave(member)
elif (isinstance(member, Spectator)):
self._spectator_leave(member)
if (self.nobody_is_here()):
self.stopped = True
self.thread.join(10)
self.game_manager.remove(self)
def to_dict(self):

View File

@ -1,12 +1,15 @@
from ..models import GameModel
from .Game import Game
from ..models import GameModel
class GameManager():
def __init__(self) -> None:
self._game_list: list[Game] = []
def remove(self, game: Game):
self._game_list.remove(game)
def get(self, game_id: int) -> Game:
if (not GameModel.objects.filter(pk = game_id, finished = False).exists()):
@ -17,7 +20,7 @@ class GameManager():
if (game.game_id == game_id):
return game
game: Game = Game(game_id)
game: Game = Game(game_id, self)
self._game_list.append(game)