def do_move(self, selected, square, promotion=5):
		color = self.board.color()
		move = self.board.move(selected, square, promotion)
		if self.online == color:
			data = post(URL_BASE + VALIDATE_MOVE, {
				'move_id': self.move_id,
				'player_key': self.player_key,
				'valid': 'true' if move else 'false'
			})
			return move
		elif move:
			move_type = move.type()
			param = {
				'game_id': self.game_id,
				'player_key': self.player_key,
				'type': move_type
			}
			if move_type in [0, 2, 3]:
				param['move_from'] = tuple_to_chess_notation(selected)
				param['move_to'] = tuple_to_chess_notation(square)
			if move_type == 1: #castling
				param['rook_from'] = tuple_to_chess_notation(move.rook_from())
				param['rook_to'] = tuple_to_chess_notation(move.rook_to())
				param['king_from'] = tuple_to_chess_notation(selected)
				param['king_to'] = tuple_to_chess_notation(square)

			if move_type == 2: #en passant
				param['eliminated_pawn'] = tuple_to_chess_notation(
					move.get_eliminated_pawn())
			if move_type == 3: #promotion
				param['promotion_type'] = 3 #queen


			data = post(URL_BASE + NEW_MOVE, param)
			self.move_id = data['move']['id']
			while self.running:
				self.do_jit_draw()
				data = get(URL_BASE + SHOW_MOVE.format(self.move_id))
				if data['move']['validation_time']:
					if not data['move']['legal']:
						move.undo_update(self.board)
						return False
					else:
						return move
				sleep(3)
		return False
    SHOW_MOVE,
    NEW_MOVE,
    WAITING_MOVE_VALIDATION,
    VALIDATE_MOVE,
    NEW_GAME_OVER_REQUEST,
    WAITING_GAME_OVER_VALIDATION,
    SHOW_GAME_OVER,
    SUCCESS,
    SUCCESS_CODES,
)


valid_html_request = lambda url, m, v={}: {
    (URL_BASE + NEW_GAME): {"player_key": "a", "game_id": 2, "code": 0},
    (URL_BASE + JOIN_GAME): {"player_key": "b", "code": 0},
    (URL_BASE + SHOW_MOVE.format(1)): {"move": {"validation_time": "2014", "legal": 1}, "code": 0},
    (URL_BASE + NEW_MOVE): {"code": 0, "move": {"id": 1}},
    (URL_BASE + WAITING_MOVE_VALIDATION): {
        "code": 0,
        "move": {"id": 1, "move_type": 0, "movimentations": [{"from": "c1", "to": "c3"}]},
    },
    (URL_BASE + VALIDATE_MOVE): {"code": 0},
    (URL_BASE + NEW_GAME_OVER_REQUEST): {"code": 0, "game_over_request_id": 1},
    (URL_BASE + WAITING_GAME_OVER_VALIDATION): {"code": 0},
    (URL_BASE + SHOW_GAME_OVER): {"code": 0, "game_over_request": {"validation_time": "2014", "legal": 0}},
}[url]

invalid_sent_move = lambda url, m, v={}: {
    (URL_BASE + NEW_GAME): {"player_key": "a", "game_id": 2, "code": 0},
    (URL_BASE + JOIN_GAME): {"player_key": "b", "code": 0},
    (URL_BASE + SHOW_MOVE.format(1)): {"move": {"validation_time": "2014", "legal": 0}, "code": 0},