diff --git a/frontend/static/js/api/game/Game.js b/frontend/static/js/api/game/Game.js index cba955c..1d4eb05 100644 --- a/frontend/static/js/api/game/Game.js +++ b/frontend/static/js/api/game/Game.js @@ -10,9 +10,10 @@ class Game { /** * @param {Client} client - * @param {CallableFunction} update_goal + * @param {CallableFunction} goal_handler + * @param {CallableFunction} finish_handler */ - constructor(client, id, update_goal) + constructor(client, id, goal_handler, finish_handler) { /** * @type {Client} @@ -27,7 +28,12 @@ class Game /** * @type {CallableFunction} */ - this.update_goal = update_goal; + this.goal_handler = goal_handler; + + /** + * @type {CallableFunction} + */ + this.finish_handler = finish_handler; } /** @@ -161,6 +167,16 @@ class Game this.ball.from_json(data); } + _receive_finish(data) + { + this.finish_handler(data) + } + + _receive_goal(data) + { + this.goal_handler(data) + } + _receive(data) { if (data.detail === "update_paddle") @@ -170,7 +186,9 @@ class Game else if (data.detail === "init_game") this._init_game(data); else if (data.detail === "goal") - this.update_goal(data); + this._receive_goal(data); + else if (data.detail === "finish") + this._receive_finish(data) } _init_game(data) diff --git a/frontend/static/js/views/GameView.js b/frontend/static/js/views/GameView.js index 67aa36b..2721859 100644 --- a/frontend/static/js/views/GameView.js +++ b/frontend/static/js/views/GameView.js @@ -1,4 +1,4 @@ -import { client } from "../index.js"; +import { client, reloadView } from "../index.js"; import { Game } from "../api/game/Game.js"; import AbstractView from "./abstracts/AbstractView.js"; import { MyPlayer } from "../api/game/MyPlayer.js"; @@ -9,11 +9,17 @@ export default class extends AbstractView constructor(params) { super(params, "Game"); - this.game = new Game(client, params.id, this.update_goal); + this.game = new Game(client, params.id, this.on_goal, this.on_finish); this.keys_pressed = []; this.my_player = undefined; } + on_finish(data) + { + console.log(data) + reloadView() + } + keyReleaseHandler(event) { const idx = this.keys_pressed.indexOf(event.key); @@ -51,7 +57,7 @@ export default class extends AbstractView /** * @param {Object} data */ - update_goal(data) + on_goal(data) { document.getElementById(`goal-${data.player}`).innerText = data.nb_goal; } diff --git a/games/objects/Game.py b/games/objects/Game.py index 0c284fa..2f01a28 100644 --- a/games/objects/Game.py +++ b/games/objects/Game.py @@ -106,17 +106,11 @@ class Game(AbstractRoom): def _send_game_data(self, member: Spectator | Player): member.send("init_game", self.to_dict()) - def everbody_is_here(self): - for player in self.players: - if not player.is_connected(): - return False - return True + def _everbody_is_here(self): + return len(self.players) == len(self.get_players_connected()) - def nobody_is_here(self): - for player in self.players: - if player.is_connected(): - return False - return len(self.spectators) == 0 + def _nobody_is_here(self): + return len(self.get_players_connected()) == 0 def _player_join(self, user_id: int, socket: WebsocketConsumer): @@ -130,7 +124,7 @@ class Game(AbstractRoom): player.socket = socket - if (self.everbody_is_here()): + if (self._everbody_is_here()): self.start() self._update_player(player) @@ -141,13 +135,22 @@ class Game(AbstractRoom): self._updated_players.append(player) def finish(self, winner: Player): + print("yo") + self.broadcast("finish", {"winner": winner.to_dict()}) self.model.finish(winner.user_id) def _player_leave(self, player: Player): - if (self.nobody_is_here()): - if (self.model.started): - self.finish(player) + + connected_players: list[Player] = self.get_players_connected() + + if (self.model.started): + print(len(connected_players)) + if (len(connected_players) == 1): + last_player: Player = connected_players[0] + print("finish") + self.finish(last_player) return + self._update_player(player) def _spectator_join(self, user_id: int, socket: WebsocketConsumer): @@ -178,7 +181,7 @@ class Game(AbstractRoom): self._player_leave(member) elif (isinstance(member, Spectator)): self._spectator_leave(member) - if (self.nobody_is_here()): + if (self._nobody_is_here()): self.stopped = True self.thread.join(10) self.game_manager.remove(self)