async def menu_select_category(call: CallbackQuery, state: FSMContext):
    await call.answer()

    host = await _get_host(call.message, state)
    if not host:
        return

    if call.data == 'keywords':
        job_filters = database.get_filters(
            user_id=call.from_user.id, host=host, query='keywords') or []
        if len(job_filters) > 0:
            msg = ('Текущий список ключевых слов: <b>' +
                   ', '.join(job_filters[0]['keywords'].split(',')) + '</b>.')
        else:
            msg = 'Текущий список ключевых слов <b>пуст</b>.'

        msg += ('\n\nВведите <b>ключевые слова</b> для поиска '
                '(через запятую без пробелов):')

        await Menu.input_keywords.set()
        await call.message.edit_text(text=msg,
                                     reply_markup=menu.get_back(),
                                     parse_mode=ParseMode.HTML)
    else:
        await show_select_category(call.message, call.from_user.id, host)
async def input_keywords_error(message: Message, state: FSMContext):
    await message.answer(
        f'{EMO_NO_ENTRY} <i>Неправильный формат запроса по ключевым словам!'
        '\nКлючевые слова следует вводить через запятую без пробелов. \n'
        'Длина ключевого слова от 3 до 16 символов (букв, цифр и символа "_").'
        '\nКоличество ключевых слов - от 1 до 16.</i>'
        '\n\nПовторите ввод:',
        reply_markup=menu.get_back(),
        parse_mode=ParseMode.HTML)
async def info(call: CallbackQuery, state: FSMContext):
    await call.answer()

    settings = database.get_settings(call.from_user.id) or {}

    msg = 'Отправка оповещений через Telegram '
    if settings.get('active'):
        msg += '<b>активирована</b>.'
    else:
        msg += '<b>отключена</b>.'

    msg += '\nТекущий e-mail: '
    if settings.get('email'):
        msg += f'<b>{settings["email"]}</b>.'
    else:
        msg += '<b>не задан</b>.'

    msg += '\nОтправка оповещений на e-mail '
    if settings.get('email_active'):
        msg += '<b>активирована</b>.'
    else:
        msg += '<b>отключена</b>.'

    for host in fl_parser.HOSTS:
        msg += '\n\n\n<b>Настройки фильтров для сайта '
        msg += f'{fl_parser.host_to_hashtag(host)}</b>.'

        job_filters = database.get_filters(
            user_id=call.from_user.id, host=host, query='keywords') or []
        msg += f'\n\n{EMO_KEY} Поиск по ключевым словам:\n'
        if len(job_filters) > 0:
            msg += ('<b>' + ', '.join(job_filters[0]['keywords'].split(',')) +
                    '</b>.')
        else:
            msg += '<b>не настроен</b>.'

        job_filters = database.get_filters(
            user_id=call.from_user.id, host=host, query='categories') or []
        msg += f'\n\n{EMO_CLIPBOARD} Поиск по категориям:\n'
        if len(job_filters) > 0:
            titles = fl_parser.get_all_titles(host)
            cat_ids = (job_filters[0]['categories'] +
                       job_filters[0]['subcategories'])
            msg += '<b>'
            msg += ', '.join([f'"{titles[cat_id]}"' for cat_id in cat_ids])
            msg += '</b>.'
        else:
            msg += '<b>не настроен</b>.'

    await Menu.info.set()
    await call.message.edit_text(text=msg,
                                 reply_markup=menu.get_back(),
                                 parse_mode=ParseMode.HTML)
async def menu_input_email(call: CallbackQuery, state: FSMContext):
    await call.answer()

    settings = database.get_settings(call.from_user.id) or {}
    if settings.get('email'):
        msg = f'Текущий e-mail: <b>{settings["email"]}</b>.'
    else:
        msg = 'Текущий e-mail <b>не задан</b>.'

    msg += '\n\nВведите <b>e-mail</b> для оповещений о новых проектах:'

    await Menu.input_email.set()
    await call.message.edit_text(text=msg,
                                 reply_markup=menu.get_back(),
                                 parse_mode=ParseMode.HTML)
async def input_email(message: Message, state: FSMContext):
    if message.entities:
        for entity in message.entities:
            if entity['type'] == 'email':
                first = entity['offset']
                last = entity['offset'] + entity['length']
                database.save_settings(message.from_user.id,
                                       email=message.text[first:last])
                await show_root(
                    message,
                    message.from_user.id,
                    info_text=f'{EMO_INFORMATION} <i>E-mail для оповещений '
                    'сохранён!</i>\n\n',
                    edit_message=False)
                return

    await message.answer(
        f'{EMO_NO_ENTRY} <i>Неправильный формат e-mail!</i>'
        '\n\nПовторите ввод:',
        reply_markup=menu.get_back(),
        parse_mode=ParseMode.HTML)