def place_pdu(self, context, client, x, y):
        if client == context.socket_player_white:
            if GameLogic.is_valid_position(context.boardmodel, x, y, Player.WHITE):
                affected_positions = GameLogic.get_affected_positions(context.boardmodel, x, y, Player.WHITE)
                GameLogic.apply_move(context.boardmodel, x, y, Player.WHITE)
                board_pdu = GameClientPDUCodec.update_board_pdu(Player.WHITE, affected_positions)
                context.request.send_req(context.socket_player_white, board_pdu)
                context.request.send_req(context.socket_player_black, board_pdu)
                next_turn_player = GameLogic.next_turn_player(context.boardmodel, Player.WHITE)

                white_count, black_count = context.boardmodel.count_disks()
                # if white_count > 4:
                #    context.end_game()

                if next_turn_player == Player.WHITE:
                    context.turn = context.socket_player_white
                    context.state = context.WHITE_TURN
                    context.state.turn_req(context)
                elif next_turn_player == Player.BLACK:
                    context.turn = context.socket_player_black
                    context.state = context.BLACK_TURN
                    context.state.turn_req(context)
                else:
                    # no valid movements->board full or no valid placements for any player
                    context.end_game()
            else:
                context.request.send_req(client, GameClientPDUCodec.place_error_pdu())
                context.request.send_req(client, GameClientPDUCodec.turn_pdu())
        else:
            # not your turn
            # read protocol, I don't remember if it's specified to report the error or not
            context.request.send_req(client, GameClientPDUCodec.place_error_pdu())
    def game_init(self):
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.connect_ok_pdu(Player.WHITE))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.connect_ok_pdu(Player.BLACK))

        initial_board = GameLogic.initial_board_as_affected_positions(8)
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0]))
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1]))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0]))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1]))

        self.request.send_req(self.socket_player_black, GameClientPDUCodec.turn_pdu())
 def turn_req(self, context):
     context.request.send_req(context.turn, GameClientPDUCodec.turn_pdu())