async def take_turn(self, message): player = getattr(self.game, f"player_{message.body['player_id']}") player.drawing_block() await self.pick_block(player=player, index=message.body['block_index']) request = await player.ws.recv() request = Request.deserialize(value=request) guess = Guess(**request.body) await self.guess_block(player, guess=guess)
async def guess_block(self, player, guess: Guess): from_player = player # type: Player to_player = getattr(self.game, f'player_{guess.to_player_id}') # type: Player success = from_player.guess_block(target_player=to_player, target_block_index=guess.target, guess=guess.guess) await self.distribute_game() if success: response = Response(action=Actions.GUESS_SUCCESS.value, message="Guess Succeeded!", body="") from_player.guessing_more() await self.distribute_response(response=response) await self.distribute_game() next_action_message = await player.ws.recv() request = Request.deserialize(value=next_action_message) if request.action == Actions.MAKE_GUESS.value: guess = Guess(**request.body) await self.guess_block(player, guess) elif request.action == Actions.YIELD_TURN.value: from_player.get_ready() self.game.swap_turn() next_player = getattr(self.game, f'player_{self.game.turn}') next_player.drawing_block() else: raise TypeError('Invalid Action type.') else: response = Response(action=Actions.GUESS_FAIL.value, message="Guess Failed!", body="") await self.distribute_response(response=response) from_player.get_ready() self.game.swap_turn() next_player = getattr(self.game, f'player_{self.game.turn}') next_player.drawing_block() return self.game
async def feed(request, ws, *args, **kwargs): session_id = kwargs.get('session_id') manager = on_going_sessions.get(session_id) if not manager: manager = GameManager(session_id) on_going_sessions[session_id] = manager message = "Game created!!" else: message = f"Joined the session {session_id}" await ws.send(ujson.dumps({ "message": message })) manager.add_waiting(ws=ws) await manager.distribute_game(to_waiting=True) while True: message = await ws.recv() message = Request.deserialize(message) print(message.to_dict()) if GameState(manager.game.state) == GameState.CREATED: print('Waiting for players...') if Actions(message.action) == Actions.ADD_PLAYER: await manager.add_player(name=message.body['name'], ws=ws) elif Actions(message.action) == Actions.START_GAME: print('Game started!!') await manager.initiate_new_game() elif GameState(manager.game.state) == GameState.INITIATED: print('pick starting blocks!!') await manager.update_game(message=message) elif GameState(manager.game.state) == GameState.PLAYING: print('running!!') await manager.update_game(message=message)