def request_game(
        request: chupacabra_pb2.GameRequest,
        game_map: Dict[str, GameServerStub], session_handler: SessionHandler
) -> game_structs_pb2.GameRequestResponse:
    """Request a new game."""
    username = request.username
    session_id = request.session_id
    user_data = session_handler.authenticate_session(username, session_id)
    if user_data is None:
        return game_structs_pb2.GameRequestResponse(
            success=False, message=AUTHENTICATION_FAILED)

    game_stub = game_map.get(request.game_type)
    if game_stub is None:
        return game_structs_pb2.GameRequestResponse(
            success=False,
            message=GAME_TYPE_NOT_FOUND.format(request.game_type))

    player_info = game_structs_pb2.PlayerInfo(username=username,
                                              nickname=user_data.nickname)

    internal_request = game_server_pb2.GameRequest(player_id=user_data.user_id,
                                                   player_info=player_info)

    response = game_stub.RequestGame(internal_request)
    return response
def make_move(
        request: chupacabra_pb2.MoveRequest,
        game_map: Dict[str, GameServerStub], session_handler: SessionHandler
) -> game_structs_pb2.GameStatusResponse:
    """Make a move in the game."""
    username = request.game_info.username
    session_id = request.game_info.session_id
    user_data = session_handler.authenticate_session(username, session_id)
    if user_data is None:
        return game_structs_pb2.GameStatusResponse(
            success=False, message=AUTHENTICATION_FAILED)

    game_stub = game_map.get(request.game_info.game_type)
    if game_stub is None:
        return game_structs_pb2.GameStatusResponse(
            success=False,
            message=GAME_TYPE_NOT_FOUND.format(request.game_info.game_type))

    user_game_info = game_server_pb2.UserGameInfo(
        player_id=user_data.user_id, game_id=request.game_info.game_id)
    internal_request = game_server_pb2.MoveRequest(game_info=user_game_info,
                                                   move=request.move)

    response = game_stub.MakeMove(internal_request)
    return response
def list_available_games(
        request: chupacabra_pb2.PlayerGameInfo, games: List[str],
        session_handler: SessionHandler
) -> chupacabra_pb2.AvailableGamesResponse:
    """List the games available on the server."""
    username = request.username
    session_id = request.session_id
    user_info = session_handler.authenticate_session(username, session_id)
    if not user_info:
        return chupacabra_pb2.AvailableGamesResponse(
            success=False, message=AUTHENTICATION_FAILED)

    descriptions = [
        game_structs_pb2.GameDescription(name=game) for game in games
    ]
    return chupacabra_pb2.AvailableGamesResponse(descriptions=descriptions,
                                                 success=True,
                                                 message='Success')
def begin_session(
        request: chupacabra_pb2.SessionRequest,
        auth_handler: AuthenticationHandler,
        session_handler: SessionHandler) -> chupacabra_pb2.SessionResponse:
    """Try to begin a new session."""
    username = request.username
    password = request.password
    user_auth_data = authenticate_user(username, password, auth_handler)
    del password
    if user_auth_data is None:
        return chupacabra_pb2.SessionResponse(success=False,
                                              message=AUTHENTICATION_FAILED)
    session_id, message = session_handler.create_or_retrieve_session(
        user_auth_data)
    if session_id:
        response = chupacabra_pb2.SessionResponse(success=True,
                                                  message=message,
                                                  session_id=session_id)
    else:
        response = chupacabra_pb2.SessionResponse(success=False,
                                                  message=message)
    return response
def check_game_request(
    request: chupacabra_pb2.GameRequestStatus,
    game_map: Dict[str, GameServerStub], session_handler: SessionHandler
) -> game_structs_pb2.GameRequestStatusResponse:
    """Check if the game request has been fulfilled"""
    username = request.username
    session_id = request.session_id
    user_data = session_handler.authenticate_session(username, session_id)
    if user_data is None:
        return game_structs_pb2.GameRequestStatusResponse(
            success=False, message=AUTHENTICATION_FAILED)

    game_stub = game_map.get(request.game_type)
    if game_stub is None:
        return game_structs_pb2.GameRequestStatusResponse(
            success=False,
            message=GAME_TYPE_NOT_FOUND.format(request.game_type))

    internal_request = game_server_pb2.GameRequestStatusRequest(
        player_id=user_data.user_id, request_id=request.request_id)

    response = game_stub.CheckGameRequest(internal_request)
    return response
def forfeit_game(
        request: chupacabra_pb2.PlayerGameInfo,
        game_map: Dict[str, GameServerStub], session_handler: SessionHandler
) -> game_structs_pb2.GameStatusResponse:
    """Immediately forfeit the game."""
    username = request.username
    session_id = request.session_id
    user_data = session_handler.authenticate_session(username, session_id)
    if user_data is None:
        return game_structs_pb2.GameStatusResponse(
            success=False, message=AUTHENTICATION_FAILED)

    game_stub = game_map.get(request.game_type)
    if game_stub is None:
        return game_structs_pb2.GameStatusResponse(
            success=False,
            message=GAME_TYPE_NOT_FOUND.format(request.game_type))

    internal_request = game_server_pb2.UserGameInfo(
        player_id=user_data.user_id, game_id=request.game_id)

    response = game_stub.ForfeitGame(internal_request)
    return response
def check_legal_moves(
        request: chupacabra_pb2.PlayerGameInfo,
        game_map: Dict[str, GameServerStub], session_handler: SessionHandler
) -> game_structs_pb2.LegalMovesResponse:
    """Check what types of moves are available for the player at this point in the game."""
    username = request.username
    session_id = request.session_id
    user_data = session_handler.authenticate_session(username, session_id)
    if user_data is None:
        return game_structs_pb2.GameStatusResponse(
            success=False, message=AUTHENTICATION_FAILED)

    game_stub = game_map.get(request.game_type)
    if game_stub is None:
        return game_structs_pb2.GameStatusResponse(
            success=False,
            message=GAME_TYPE_NOT_FOUND.format(request.game_type))

    internal_request = game_server_pb2.UserGameInfo(
        player_id=user_data.user_id, game_id=request.game_id)

    response = game_stub.GetLegalMoves(internal_request)
    return response