Ejemplo n.º 1
0
def respond_help(request: YandexRequest) -> Optional[YandexResponse]:
    help_text = 'Я считаю калории. Просто скажите что вы съели, а я скажу ' \
                'сколько в этом было калорий. Например: соевое молоко с ' \
                'хлебом. Потом я спрошу надо ли сохранить этот прием пищи, и ' \
                'если вы скажете да, я запишу его в свою базу данных. Можно ' \
                'сказать не просто да, а указать время приема пищи, ' \
                'например: да, вчера в 9 часов 30 минут. После того, как ' \
                'прием пищи сохранен, вы сможете узнать свое суточное ' \
                'потребление калорий с помощью команды "что я ел(а)?". ' \
                'При этом также можно указать время, например: "Что я ел ' \
                'вчера?" или "Что я ела неделю назад?". Если какая-то еда ' \
                'была внесена ошибочно, можно сказать "Удалить соевое ' \
                'молоко с хлебом".  Прием пищи "Соевое молоко с хлебом" ' \
                'будет удален'

    tokens = request.tokens
    if ('помощь' in tokens or 'справка' in tokens or 'хелп' in tokens
            or 'информация' in tokens or 'ping' in tokens or 'пинг' in tokens
            or 'умеешь' in tokens
            or ('что' in tokens and [t for t in tokens if 'делать' in t])
            or ('что' in tokens and [t for t in tokens if 'умеешь' in t])
            or ('как' in tokens and [t for t in tokens if 'польз' in t])
            or 'скучно' in tokens or 'help' in tokens):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=help_text,
            tts=help_text,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 2
0
def respond_nothing_to_delete(request: YandexRequest, date) -> YandexResponse:
    respond_string = f'Никакой еды не найдено за {date}. Чтобы еда появилась ' \
        f'в моей базе, необходимо не забывать говорить "сохранить"'
    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text=respond_string,
        tts=respond_string,
        end_session=False,
        buttons=[],
    )
Ejemplo n.º 3
0
def respond_what_i_have_eaten(request: YandexRequest) -> YandexResponse:
    all_datetime_entries = [
        entity for entity in request.entities
        if entity['type'] == "YANDEX.DATETIME"
    ]

    if len(all_datetime_entries) == 0:
        target_date = datetime.date.today()
    else:
        # last detected date
        last_detected_date = all_datetime_entries[-1]
        target_date = transform_yandex_datetime_value_to_datetime(
            yandex_datetime_value_dict=last_detected_date, ).date()

    all_food_for_date = find_all_food_names_for_day(
        database_client=get_boto3_client(
            aws_lambda_mode=request.aws_lambda_mode,
            service_name='dynamodb')[0],
        date=target_date,
        user_id=request.user_guid,
    )
    if len(all_food_for_date) == 0:
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=f'Не могу ничего найти за {target_date}. '
            f'Чтобы еда сохранялась в мою базу, не забывайте '
            f'говорить "Сохранить", после того, как я посчитаю калории.',
            tts='Ничего не найдено',
            end_session=False,
            buttons=[],
        )

    food_total_text, food_total_tts = total_calories_text(
        food_dicts_list=all_food_for_date,
        target_date=target_date,
        timezone=request.timezone)
    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text=food_total_text,
        tts=food_total_tts,
        end_session=False,
        buttons=[],
    )
Ejemplo n.º 4
0
def respond_ping(request: YandexRequest) -> Optional[YandexResponse]:
    full_phrase = request.original_utterance
    if full_phrase in ('ping', 'пинг'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text='pong',
            tts='pong',
            end_session=False,
            buttons=[],
        )
    return None
Ejemplo n.º 5
0
def respond_greeting_phrase(
        request: YandexRequest) -> Optional[YandexResponse]:
    greeting_text = 'Какую еду записать?'
    if request.is_new_session:
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=greeting_text,
            tts=greeting_text,
            end_session=False,
            buttons=[],
        )
    return None
Ejemplo n.º 6
0
def respond_forgetting_food(
    *,
    request: YandexRequest,
):

    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text='Забыли',
        tts='Забыли',
        end_session=False,
        buttons=[],
    )
Ejemplo n.º 7
0
def respond_shut_up(request: YandexRequest) -> Optional[YandexResponse]:
    full_phrase = request.original_utterance
    if full_phrase in ('заткнись', 'замолчи', 'молчи', 'молчать'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text='Молчу',
            tts='Молчу',
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 8
0
def respond_smart_ccr(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Да, я слушаю'
    full_phrase = request.original_utterance
    if full_phrase in ('умный счетчик калорий', ):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 9
0
def respond_nothing_to_add(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Хорошо, дайте знать, когда что-то появится'
    full_phrase = request.original_utterance
    if full_phrase in ('никакую', 'ничего', 'никакой'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 10
0
def respond_dick(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'С солью или без соли?'
    full_phrase = request.original_utterance
    if full_phrase in ('хуй', 'моржовый хуй', 'хер', 'хуй моржовый'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 11
0
def respond_eat_cat(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Нееш, падумой'
    full_phrase = request.original_utterance
    if full_phrase in ('кошка', 'кошку', 'кот', 'кота', 'котенок', 'котенка'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 12
0
def respond_eat_poop(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Вы имели в виду "Сладкий хлеб"?'
    full_phrase = request.original_utterance
    if full_phrase in ('говно', 'какашка', 'кака', 'дерьмо', 'фекалии',
                       'какахе', 'какахи'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 13
0
def respond_text_too_long(request: YandexRequest) -> Optional[YandexResponse]:
    # "удали" request CAN be longer than 100 characters
    if (len(request.original_utterance) >= 100
            and 'удали' not in request.original_utterance):

        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text='Ой, текст слишком длинный. Давайте попробуем частями?',
            tts='Ой, текст слишком длинный. Давайте попробуем частями?',
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 14
0
def respond_what_your_name(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Я умный счетчик калорий, а имя мне пока не придумали. ' \
                     'Может, Вы придумаете?'

    tokens = request.tokens
    if 'как' in tokens and ('зовут' in tokens or 'имя' in tokens):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 15
0
def respond_launch_another(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Я навык Умный Счетчик Калорий. Чтобы вернуться в Алису ' \
                     'и запустить другой навык, скажите Выход'

    full_phrase = request.original_utterance
    if 'запусти' in full_phrase or 'поиграем' in full_phrase:
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 16
0
def respond_human_meat(request: YandexRequest) -> Optional[YandexResponse]:

    respond_string = 'Доктор Лектер, это вы?'
    tokens = request.tokens
    full_phrase = request.original_utterance
    if [t for t in tokens if 'человеч' in t] or \
            tokens == ['мясо', 'человека'] or \
            full_phrase in ('человек',):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )
    return None
Ejemplo n.º 17
0
def respond_angry(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Все мы можем ошибаться. Напишите моему разработчику, ' \
                     'а он меня накажет и научит больше не ошибаться.'
    full_phrase = request.original_utterance
    if full_phrase in ('дура', 'дурочка', 'иди на хер', 'пошла нахер',
                       'тупица', 'идиотка', 'тупорылая', 'тупая', 'ты дура',
                       'плохо'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 18
0
def respond_request_contains_error(
    *,
    request: Optional[YandexRequest],
) -> Optional[YandexResponse]:

    if not request:
        return None

    if request.error:
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=request.error,
            tts=request.error,
            buttons=[],
            end_session=True,
        )
    return None
Ejemplo n.º 19
0
def respond_goodbye(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'До свидания'
    tokens = request.tokens
    full_phrase = request.original_utterance
    if ('выход' in tokens or 'выйти' in tokens or 'выйди' in tokens
            or 'до свидания' in full_phrase.lower()
            or 'всего доброго' in full_phrase.lower()
            or full_phrase in ('иди на хуй', 'стоп', 'пока', 'алиса')):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=True,
            buttons=[],
        )

    return None
Ejemplo n.º 20
0
def respond_where_is_saved(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Приемы пищи сохраняются в моей базе данных. ' \
                     'Ваши приемы пищи будут доступны только Вам. ' \
                     'Я могу быть Вашим личным дневником калорий'

    full_phrase = request.original_utterance
    if full_phrase in ('а где сохраняются', 'где сохраняются', 'где сохранить',
                       'а зачем сохранять', 'зачем сохранять', 'куда',
                       'а куда сохранила'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 21
0
def respond_food_to_delete_not_found(
    request: YandexRequest,
    date: datetime,
    food_to_delete_name: str,
    found_foods: typing.List[dict],
) -> YandexResponse:
    respond_string = f'"{food_to_delete_name}" не найдено за {date}. ' \
        f'Найдено: {[food["utterance"] for food in found_foods]}. Чтобы ' \
        f'удалить еду, нужно произнести Удалить "еда" ' \
        f'именно в том виде, как она записана. ' \
        f'Например, удалить {found_foods[0]["utterance"]}. Также можно ' \
        f'удалить еду по номеру, например: удалить номер 2'
    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text=respond_string,
        tts=respond_string,
        end_session=False,
        buttons=[],
    )
Ejemplo n.º 22
0
def respond_saving_food(*, request: YandexRequest, context: dict,
                        database_client):
    # Save to database
    # Clear context
    # Say Сохранено

    update_user_table(database_client=database_client,
                      event_time=dateutil.parser.parse(context['time']),
                      foods_dict=context['foods'],
                      user_id=request.user_guid,
                      utterance=context['utterance'])

    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text='Сохранено. Чтобы посмотреть список сохраненной '
        'еды, спросите "Что я ел сегодня?',
        tts='Сохранено',
        end_session=False,
        buttons=[],
    )
Ejemplo n.º 23
0
def respond_launch_again(request: YandexRequest) -> Optional[YandexResponse]:

    help_text = 'Какую еду записать?'
    full_phrase = request.original_utterance
    if full_phrase.lower().strip() in (
            'запусти навык умный счетчик калорий',
            'запустить навык умный счетчик калорий',
            'алиса запусти умный счетчик калорий',
            'запустить умный счетчик калорий',
            'запусти умный счетчик калорий',
            '',
    ):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=help_text,
            tts=help_text,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 24
0
def respond_thanks(request: YandexRequest) -> Optional[YandexResponse]:
    welcome_phrases = [
        'Спасибо, я стараюсь', 'Спасибо за комплимент',
        'Приятно быть полезной', 'Доброе слово и боту приятно'
    ]
    chosen_welcome_phrase = random.choice(welcome_phrases)
    full_phrase = request.original_utterance
    if full_phrase.lower().strip() in ('спасибо', 'молодец', 'отлично',
                                       'ты классная', 'классная штука',
                                       'классно', 'ты молодец', 'круто',
                                       'обалдеть', 'прикольно', 'клево',
                                       'ништяк', 'класс'):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=chosen_welcome_phrase,
            tts=chosen_welcome_phrase,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 25
0
def respond_think_too_much(request: YandexRequest) -> Optional[YandexResponse]:

    respond_string = 'Если вы нашли ошибку, напишите моему разработчику, ' \
                     'и он объяснит мне, как правильно'
    full_phrase = request.original_utterance
    if full_phrase in (
            'это много',
            'это мало',
            'что-то много',
            'что-то мало',
            'так много',
            'а почему так много',
            'неправильно',
    ):
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 26
0
def respond_date_in_request(*, request: YandexRequest, context: dict,
                            date: datetime, database_client):
    # Save to database for specified time
    # Clear context
    # Say Сохранено

    update_user_table(
        database_client=database_client,
        event_time=date.replace(
            tzinfo=dateutil.tz.gettz(request.timezone)).astimezone(
                dateutil.tz.gettz('UTC')),
        foods_dict=context['foods'],
        user_id=request.user_guid,
        utterance=context['utterance'])

    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text=f'Сохранено за {date.date()}. Чтобы посмотреть список '
        f'сохраненной еды, спросите меня что Вы ели',
        tts='Сохранено',
        end_session=False,
        buttons=[],
    )
Ejemplo n.º 27
0
def respond_not_implemented(
        request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Этого я пока не умею, но планирую скоро научиться. ' \
                     'Следите за обновлениями'

    full_phrase = request.original_utterance
    tokens = request.tokens
    if full_phrase in ('норма калорий', 'сколько я набрала калорий',
                       'сколько я набрал калорий',
                       'сколько в день нужно калорий', 'норма потребления',
                       'сколько нужно съесть калорий в день',
                       'дневная норма калорий',
                       'сколько калорий можно употреблять в сутки',
                       'сколько калорий в день можно') or 'норма' in tokens:
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 28
0
def respond_hello(request: YandexRequest) -> Optional[YandexResponse]:
    respond_string = 'Здравствуйте. А теперь расскажите что вы съели, ' \
                     'а я скажу сколько там было калорий и питательных веществ.'

    tokens = request.tokens
    if tokens in (
            'привет',
            'здравствуй',
            'здравствуйте',
            'хелло',
            'приветик',
            'hello',
    ):

        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=respond_string,
            tts=respond_string,
            end_session=False,
            buttons=[],
        )

    return None
Ejemplo n.º 29
0
def respond_i_dont_know(request: YandexRequest) -> YandexResponse:
    first_parts_list = [
        'Это не похоже на название еды. Попробуйте сформулировать иначе',
        'Хм. Не могу понять что это. Попробуйте сказать иначе',
        'Такой еды я пока не знаю. Попробуйте сказать иначе'
    ]

    food_examples_list = [
        'Бочка варенья и коробка печенья',
        'Литр молока и килограмм селедки',
        '2 куска пиццы с ананасом',
        '200 грамм брокколи и 100 грамм шпината',
        'ананас и рябчик',
        '2 блина со сгущенкой',
        'тарелка риса, котлета и стакан апельсинового сока',
        'банан, апельсин и манго',
        'черная икра, красная икра, баклажанная икра',
        'каша из топора и свежевыжатый березовый сок',
    ]

    full_generated_text = f"{random.choice(first_parts_list)}, " \
        f"например: {random.choice(food_examples_list)}. " \
        f"Чтобы выйти, скажите Выход"

    if request.has_screen:
        tts = "Попробуйте сказать иначе"
    else:
        tts = full_generated_text

    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text=full_generated_text,
        tts=tts,
        buttons=[],
        end_session=False,
    )
Ejemplo n.º 30
0
def respond_delete(request: YandexRequest) -> typing.Optional[YandexResponse]:
    tokens = request.tokens
    # if (
    #         'удалить' in tokens or
    #         'удали' in tokens or
    #         'убери' in tokens or
    #         'убрать' in tokens):
    #
    #     return None

    all_datetime_entries = [
        entity for entity in request.entities
        if entity['type'] == "YANDEX.DATETIME"
    ]

    # if no dates found in request, assuming deletion for today was requested
    if len(all_datetime_entries) == 0:
        target_date = datetime.date.today()
    else:
        # last detected date
        last_detected_date = all_datetime_entries[-1]
        target_date = transform_yandex_datetime_value_to_datetime(
            yandex_datetime_value_dict=last_detected_date, ).date()

    respond_nothing_to_delete_with_date = functools.partial(
        respond_nothing_to_delete, date=target_date)

    tokens_without_dates_tokens = remove_tokens_from_specific_intervals(
        tokens_list=request.original_utterance.split(),
        intervals_dicts_list=all_datetime_entries)

    tokens_without_delete_words = [
        t for t in tokens_without_dates_tokens
        if t.lower() not in ('удалить', 'еду', 'удали', 'удалите'
                             'убери', 'убрать')
    ]

    if len(tokens_without_delete_words) == 0:
        return respond_request(
            request=request,
            responding_function=respond_nothing_to_delete_with_date)

    food_to_delete = ' '.join(tokens_without_delete_words)

    all_food_for_date = find_all_food_names_for_day(
        database_client=get_boto3_client(
            aws_lambda_mode=request.aws_lambda_mode,
            service_name='dynamodb')[0],
        date=target_date,
        user_id=request.user_guid,
    )

    if len(all_food_for_date) == 0:
        return respond_request(request=request,
                               responding_function=functools.partial(
                                   respond_nothing_to_delete_with_date, ))

    if food_to_delete in ('все', 'всё'):
        delete_food(
            database_client=get_boto3_client(
                aws_lambda_mode=request.aws_lambda_mode,
                service_name='dynamodb')[0],
            date=target_date,
            list_of_food_to_delete_dicts=all_food_for_date,
            list_of_all_food_dicts=all_food_for_date,
            user_id=request.user_guid,
        )

        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=f'Вся еда удалена за {target_date}',
            tts='Удалено',
            end_session=False,
            buttons=[],
        )

    # Delete food by number
    string_from_tokens = ' '.join(request.tokens)
    search = re.search(r'номер (\d+)', string_from_tokens)
    if search:
        food_number = int(float(search.groups()[0]))
        if food_number <= 0:
            return construct_yandex_response_from_yandex_request(
                yandex_request=request,
                text=f'Неправильный номер {food_number}',
                tts=f'Неправильный номер {food_number}',
                end_session=False,
                buttons=[],
            )

        if food_number > len(all_food_for_date):
            return construct_yandex_response_from_yandex_request(
                yandex_request=request,
                text=f'За дату {target_date} найдено '
                f'только {len(all_food_for_date)} приемов пищи, '
                f'не могу удалить {food_number}',
                tts=f'Неправильный номер {food_number}',
                end_session=False,
                buttons=[],
            )
        food_to_delete = [
            all_food_for_date[food_number - 1],
        ]
        delete_food(
            database_client=get_boto3_client(
                aws_lambda_mode=request.aws_lambda_mode,
                service_name='dynamodb')[0],
            date=target_date,
            list_of_food_to_delete_dicts=food_to_delete,
            list_of_all_food_dicts=all_food_for_date,
            user_id=request.user_guid,
        )

        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=f'Еда номер {food_number} удалена',
            tts='Удалено',
            end_session=False,
            buttons=[],
        )

    matching_food = []
    for food in all_food_for_date:
        if (food['utterance']
                and food_to_delete.strip() == food['utterance'].replace(
                    ',', '').strip()):
            matching_food.append(food)

    if len(matching_food) == 0:
        return respond_request(request=request,
                               responding_function=functools.partial(
                                   respond_food_to_delete_not_found,
                                   date=target_date,
                                   food_to_delete_name=food_to_delete,
                                   found_foods=all_food_for_date))

    if len(matching_food) > 1:
        return construct_yandex_response_from_yandex_request(
            yandex_request=request,
            text=f'Несколько значений '
            f'подходят: {[i["utterance"] for i in matching_food]}. '
            f'Уточните, какое удалить? Можно удалить по номеру, сказав '
            f'"Удали номер 1", например',
            tts='Несколько значений подходят.',
            end_session=False,
            buttons=[],
        )

    delete_food(
        database_client=get_boto3_client(
            aws_lambda_mode=request.aws_lambda_mode,
            service_name='dynamodb')[0],
        date=target_date,
        list_of_food_to_delete_dicts=matching_food,
        list_of_all_food_dicts=all_food_for_date,
        user_id=request.user_guid,
    )

    return construct_yandex_response_from_yandex_request(
        yandex_request=request,
        text=f'"{food_to_delete}" удалено',
        tts='Удалено',
        end_session=False,
        buttons=[],
    )