diff --git a/pong/pong/static/pong/components/PongGame.js b/pong/pong/static/pong/components/PongGame.js index 06efbf7..383334a 100644 --- a/pong/pong/static/pong/components/PongGame.js +++ b/pong/pong/static/pong/components/PongGame.js @@ -89,6 +89,12 @@ export class PongGame extends Component { case "tournament-winner": this.setRouteContext("TournamentWinner", message.contents); break; + case "timeout": + if (document.getElementById("timeoutMessage")) { + document.getElementById("timeoutMessage").innerHTML = + "Timeout requested."; + } + break; } }; diff --git a/pong/pong/static/pong/components/PongGameHome.js b/pong/pong/static/pong/components/PongGameHome.js index f3b4228..1ddb734 100644 --- a/pong/pong/static/pong/components/PongGameHome.js +++ b/pong/pong/static/pong/components/PongGameHome.js @@ -51,6 +51,12 @@ export class PongGameHome extends Component { alert(message.contents); this.goNextPage("/error"); break; + case "timeout": + if (document.getElementById("timeoutMessage")) { + document.getElementById("timeoutMessage").innerHTML = + "Timeout requested."; + } + break; } }; diff --git a/pong/pong/static/pong/components/PongGameTournament.js b/pong/pong/static/pong/components/PongGameTournament.js index 29f2230..807c16d 100644 --- a/pong/pong/static/pong/components/PongGameTournament.js +++ b/pong/pong/static/pong/components/PongGameTournament.js @@ -11,6 +11,7 @@ export class PongGameTournament extends Component { alert("connection failed."); this.goNextPage("/"); } + this.connection = this.getRouteContext("PongGameWebSocket"); const tournamentContext = this.getRouteContext("Tournament"); this.bracket = new PongGameTournamentBracket( this.route, @@ -20,12 +21,28 @@ export class PongGameTournament extends Component { ); this.element.appendChild(this.bracket.element); this.unsetRouteContext("Tournament"); + this.timeoutButton = document.getElementById("timeoutButton"); + if (this.timeoutButton) { + this.timeoutButton.onclick = this.onClickTimeoutButton; + } } + onClickTimeoutButton = async () => { + this.connection.send( + JSON.stringify({ + sender: "player", + type: "timeout", + contents: "timeout", + }), + ); + }; + get html() { return ` -

Pong-Game Tournament

+ +

`; } diff --git a/pong/realtime_pong_game/roommanager.py b/pong/realtime_pong_game/roommanager.py index c25067f..44f8a35 100644 --- a/pong/realtime_pong_game/roommanager.py +++ b/pong/realtime_pong_game/roommanager.py @@ -67,6 +67,7 @@ def __init__(self, room_name, number_of_players): self.participants_state = dict() self.max_of_participants = int(number_of_players) self.game_results = [] + self.is_timeout = False def set_room_state(self, new_room_state): with self.instance_lock: @@ -167,6 +168,19 @@ async def send_room_state_to_group(self): async def on_receive_user_message(self, participant, message_json): if self.room_state == RoomState.In_Game: await self.handle_game_action(participant, message_json) + elif self.room_state == RoomState.Display_Tournament: + self.is_timeout = True + await self.channel_layer.group_send( + self.room_name, + { + "type": "send_room_information", + "contents": { + "sender": "room-manager", + "type": "timeout", + "contents": "timeout", + }, + }, + ) def change_participants_state_for_game(self, player1, player2): for participant in self.participants_state.keys(): @@ -236,7 +250,9 @@ def game_dispatcher(self, dummy_data): # change room state to Display_Tournament self.set_room_state(RoomState.Display_Tournament) async_to_sync(self.send_room_state_to_group)() - time.sleep(3) + time.sleep(5) + if self.is_timeout is True: + time.sleep(30) # change room state to In_Game self.set_room_state(RoomState.In_Game) async_to_sync(self.send_room_state_to_group)()