Пример #1
0
def exists_biene(response_data):
    """
    Check if there's any biene in the response.
    :param response_data: Response data to check.
    :return: True if there is, False otherwise.
    """
    try:
        query_input = response_data['query']
        if 'biene' in query_input.lower():
            log.debug('|BIENE| BIENE detected')
            return True
        else:
            return False
    except Exception as e:
        log.exception(e)
        return False
Пример #2
0
def run():
    """
    Run Biene Bot.
    :return: Biene bot ran
    """
    rtm_client = slack.get_rtm_client()
    try:
        slack.send_message(':bee: Biene Bot starting!')
        rtm_client.start()
    except Exception as e:
        log.exception(e)
        log.error(f'General error: {e}', notify=True)
    finally:
        log.info('|BIENE| Biene Bot stopped!')
        slack.send_message(':bee: Biene Bot stopped!')
        return
Пример #3
0
def execute(method,
            url,
            headers=None,
            params=None,
            data=None,
            allowed_statuses=None):
    """
    Execute request giving some parameters.
    :param method: Method to request.
    :param url: URL to request.
    :param headers: Request headers.
    :param params: Parameters.
    :param data: Request body.
    :param allowed_statuses: Allowed HTTP status response for avoiding retry.
    :return: JSON response.
    """
    if allowed_statuses is None:
        allowed_statuses = {}

    # Check method
    if method not in ('GET', 'POST', 'PUT', 'PATCH', 'DELETE'):
        log.error('Indicated method must be GET, POST, PUT, PATCH or DELETE')
        return None

    # Iterate until six times
    for it in range(1, 6):
        try:
            response = requests.request(method=method,
                                        url=url,
                                        headers=headers,
                                        params=params,
                                        data=data,
                                        timeout=15)
            if response is not None and (response.ok or response.status_code
                                         in allowed_statuses):
                return response.json()
            else:
                status_code = None if response is None else response.status_code,
                log.warn(
                    f'Problem requesting URL [{url}] getting [{status_code}] status code. Number of tries: {it}'
                )
                time.sleep(it)
        except Exception as e:
            log.exception(e)
            log.error(f'Could not request URL [{url}]. Number of tries: {it}')
            time.sleep(it)
            continue
Пример #4
0
def get_intent(query):
    """
    Get intent from LUIS.
    :param query: Query to process.
    :return: LUIS answer.
    """
    query = re.sub(r':([a-zA-Z]|_)+:', '', query).strip()
    log.debug(f'|LUIS| Get intent with query [{query}]')
    # headers = {'Ocp-Apim-Subscription-Key': LUIS_SUBSCRIPTION_KEY}
    headers = {}
    params = {
        'query': query,
        'log': 'true',
        # 'timezoneOffset': '0',
        'verbose': 'false',
        # 'spellCheck': 'false',
        # 'staging': 'false',
        'show-all-intents': 'true',
        'subscription-key': LUIS_SUBSCRIPTION_KEY,
    }
    try:
        url = f'https://{LUIS_SERVER}/luis/prediction/v3.0/apps/{LUIS_ID}/slots/production/predict'
        response_data = request.execute(method='GET',
                                        url=url,
                                        headers=headers,
                                        params=params)
        answers = analyze_response(response_data)

        prediction = response_data['prediction']
        intent = prediction['topIntent']
        score = prediction['intents'][intent]['score']

        for an in answers:
            an = an.replace('\n', '')
            log.debug(f'|LUIS| After analyzing data, we got [{an}]')
        return answers, intent, score
    except Exception as e:
        log.exception(e)
Пример #5
0
def analyze_response(response_data):
    """
    Analyze LUIS response.
    :param response_data: Response data to analyze.
    :return: Response analyzed.
    """
    try:
        # Retrieve intent
        prediction = response_data['prediction']
        intent = prediction['topIntent']
        score = prediction['intents'][intent]['score']
        log.debug(f'|LUIS| Intent that we got [{intent}]')

        # Initialize answer array
        answer = list()

        # Check score (if score retrieved from the API is lower than the config. value, discard the option and raise error.)
        if score < SCORE_THRESHOLD:
            answer.extend(error.get_message())
            return answer

        # Select intent
        if intent == 'Indication.Activity':
            answer.extend(activities.get_message(response_data))
        elif intent == 'HackUPC':
            answer.extend(hackupc.get_message(response_data))
        elif intent == 'HardwareLab':
            answer.extend(hardware_lab.get_message(response_data))
        elif intent == 'Logistics':
            answer.extend(logistics.get_message(response_data))
        elif intent == 'Meals':
            answer.extend(meals.get_message(response_data))
        elif intent == 'Mentor':
            answer.extend(mentor.get_message(response_data))
        elif intent == 'Indication.Place':
            answer.extend(places.get_message(response_data))
        elif intent == 'Project':
            answer.extend(projects.get_message(response_data))
        elif intent == 'Smalltalk':
            answer.extend(smalltalk.get_message(response_data))
        elif intent.startswith('Sponsors'):
            answer.extend(sponsors.get_message(response_data))
        elif intent == 'Support':
            answer.extend(support.get_message(response_data))
        else:
            if exists_biene(response_data):
                answer.extend(['BIENE'])
            else:
                answer.extend(error.get_message())
            return answer

        # Check for biene manually
        if exists_biene(response_data):
            answer.extend(['BIENE'])

        # Return array of answers
        return answer

    except Exception as e:
        log.exception(e)
        return error.get_message()