def choose_week(message, bot, storage, tz, last_msg=None):
    global aud_list
    chat_id = message.chat.id
    message = message.text

    if ('На текущую неделю' == message or 'На следующую неделю' == message):
        request_word = aud_list[chat_id][1]

        request_aud = storage.get_schedule_aud(request_word)

        # Если есть запрос для группы, то формируем расписание для группы, а если нет, то для препода
        schedule = request_aud[0]

        if not schedule:
            schedule_processing.sending_schedule_is_not_available_search(
                message=message, chat_id=chat_id, bot=bot)
            return

        schedule = schedule['schedule']
        week = find_week()

        # меняем неделю
        if message == 'На следующую неделю':
            week = 'odd' if week == 'even' else 'even'

        week_name = 'четная' if week == 'odd' else 'нечетная'
        aud = request_word
        schedule_str = full_schedule_in_str_prep(schedule, week=week, aud=aud)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_str, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        bot.send_message(chat_id=chat_id,
                         text=f'Расписание {request_word}\n'
                         f'Неделя: {week_name}',
                         reply_markup=keyboards.make_keyboard_start_menu())

        # Отправка расписания
        schedule_processing.sending_schedule(bot=bot,
                                             chat_id=chat_id,
                                             schedule_str=schedule_str)

        bot.clear_step_handler_by_chat_id(chat_id=chat_id)
def get_schedule(bot, message, storage, tz):
    chat_id = message.chat.id
    data = message.text
    user = storage.get_user(chat_id=chat_id)

    if 'Расписание 🗓' == data and user.get('group'):
        bot.send_message(
            chat_id=chat_id,
            text='Выберите период\n',
            reply_markup=keyboards.make_keyboard_choose_schedule())
        statistics.add(action='Расписание', storage=storage, tz=tz)

    if ('На текущую неделю' == data
            or 'На следующую неделю' == data) and user.get('group'):
        # Если курс нуль, тогда это преподаватель
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule(group=group)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule_prep(group=group)
        if not schedule or schedule['schedule'] == []:
            bot.send_message(
                chat_id=chat_id,
                text='Расписание временно недоступно\nПопробуйте позже⏱')
            statistics.add(action=data, storage=storage, tz=tz)
            return

        schedule = schedule['schedule']
        week = find_week()

        # меняем неделю
        if data == 'На следующую неделю':
            week = 'odd' if week == 'even' else 'even'

        week_name = 'четная' if week == 'odd' else 'нечетная'

        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            schedule_str = full_schedule_in_str(schedule, week=week)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            schedule_str = full_schedule_in_str_prep(schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_str, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        bot.send_message(chat_id=chat_id,
                         text=f'Расписание {group}\n'
                         f'Неделя: {week_name}',
                         reply_markup=keyboards.make_keyboard_start_menu())
        # Отправка расписания
        schedule_processing.sending_schedule(bot=bot,
                                             chat_id=chat_id,
                                             schedule_str=schedule_str)

        statistics.add(action=data, storage=storage, tz=tz)

    elif 'Расписание на сегодня 🍏' == data and user.get('group'):
        # Если курс нуль, тогда это преподаватель
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule(group=group)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule_prep(group=group)
        if not schedule:
            bot.send_message(chat_id=chat_id,
                             text='Расписание временно недоступно🚫😣\n'
                             'Попробуйте позже⏱',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Расписание на сегодня',
                           storage=storage,
                           tz=tz)
            return
        schedule = schedule['schedule']
        week = find_week()
        # Если курс нуль, тогда это преподаватель
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            schedule_one_day = get_one_day_schedule_in_str(schedule=schedule,
                                                           week=week)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            schedule_one_day = get_one_day_schedule_in_str_prep(
                schedule=schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_one_day, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        if not schedule_one_day:
            bot.send_message(chat_id=chat_id, text='Сегодня пар нет 😎')
            return
        bot.send_message(chat_id=chat_id, text=f'{schedule_one_day}')
        statistics.add(action='Расписание на сегодня', storage=storage, tz=tz)

    elif 'Экзамены' in data and user.get('group'):
        # Если курс нуль, тогда это преподаватель

        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = groups_exam(group=group)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = groups_exam(group=group)

        if not schedule:
            bot.send_message(chat_id=chat_id,
                             text='Расписание экзаменов отсутствует😇\n'
                             'Попробуйте позже⏱',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Экзамены', storage=storage, tz=tz)
            return

        # schedule = schedule['schedule']

        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            schedule_exams = schedule_view_exams(schedule=schedule)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            schedule_exams = schedule_view_exams(schedule=schedule)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_exams, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)

            return

        schedule_processing.sending_schedule(bot=bot,
                                             chat_id=chat_id,
                                             schedule_str=schedule_exams)

        statistics.add(action='Экзамены', storage=storage, tz=tz)

    elif 'Расписание на завтра 🍎' == data and user.get('group'):
        # Если курс нуль, тогда это преподаватель
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule(group=group)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule_prep(group=group)
        if not schedule:
            bot.send_message(chat_id=chat_id,
                             text='Расписание временно недоступно🚫😣\n'
                             'Попробуйте позже⏱',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Расписание на завтра',
                           storage=storage,
                           tz=tz)
            return
        schedule = schedule['schedule']
        week = find_week()
        if datetime.today().isoweekday() == 7:
            if week == 'odd':
                week = 'even'
            elif week == 'even':
                week = 'odd'
            else:
                week = 'all'

        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            schedule_next_day = get_next_day_schedule_in_str(schedule=schedule,
                                                             week=week)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            schedule_next_day = get_next_day_schedule_in_str_prep(
                schedule=schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_next_day, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        if not schedule_next_day:
            bot.send_message(chat_id=chat_id, text='Завтра пар нет 😎')
            return
        bot.send_message(chat_id=chat_id, text=f'{schedule_next_day}')
        statistics.add(action='Расписание на завтра', storage=storage, tz=tz)

    elif 'Ближайшая пара ⏱' in data and user.get('group'):
        bot.send_message(chat_id=chat_id,
                         text='Ближайшая пара',
                         reply_markup=keyboards.make_keyboard_nearlesson())
        statistics.add(action='Ближайшая пара', storage=storage, tz=tz)
        return

    elif 'Текущая' in data and user.get('group'):
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule(group=group)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule_prep(group=group)
        if not schedule:
            bot.send_message(chat_id=chat_id,
                             text='Расписание временно недоступно🚫😣\n'
                             'Попробуйте позже⏱',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Текущая', storage=storage, tz=tz)
            return
        schedule = schedule['schedule']
        week = find_week()

        now_lessons = get_now_lesson(schedule=schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(now_lessons, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        # если пар нет
        if not now_lessons:
            bot.send_message(chat_id=chat_id,
                             text='Сейчас пары нет, можете отдохнуть)',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Текущая', storage=storage, tz=tz)
            return

        # Студент
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            now_lessons_str = get_now_lesson_in_str_stud(now_lessons)

        # Преподаватель
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            now_lessons_str = get_now_lesson_in_str_prep(now_lessons)

        # Проверяем, что расписание сформировалось
        if isinstance(now_lessons_str, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        bot.send_message(chat_id=chat_id,
                         text=f'🧠Текущая пара🧠\n'
                         f'{now_lessons_str}',
                         reply_markup=keyboards.make_keyboard_start_menu())

        statistics.add(action='Текущая', storage=storage, tz=tz)

    elif 'Следующая' in data and user.get('group'):
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule(group=group)
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            group = storage.get_user(chat_id=chat_id)['group']
            schedule = storage.get_schedule_prep(group=group)
        if not schedule:
            bot.send_message(chat_id=chat_id,
                             text='Расписание временно недоступно🚫😣\n'
                             'Попробуйте позже⏱',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Следующая', storage=storage, tz=tz)
            return
        schedule = schedule['schedule']
        week = find_week()

        near_lessons = get_near_lesson(schedule=schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(near_lessons, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        # если пар нет
        if not near_lessons:
            bot.send_message(chat_id=chat_id,
                             text='Сегодня больше пар нет 😎',
                             reply_markup=keyboards.make_keyboard_start_menu())
            statistics.add(action='Следующая', storage=storage, tz=tz)
            return

        # Студент
        if storage.get_user(chat_id=chat_id)['course'] != 'None':
            near_lessons_str = get_now_lesson_in_str_stud(near_lessons)

        # Преподаватель
        elif storage.get_user(chat_id=chat_id)['course'] == 'None':
            near_lessons_str = get_now_lesson_in_str_prep(near_lessons)

        # Проверяем, что расписание сформировалось
        if isinstance(near_lessons_str, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        bot.send_message(chat_id=chat_id,
                         text=f'🧠Ближайшая пара🧠\n'
                         f'{near_lessons_str}',
                         reply_markup=keyboards.make_keyboard_start_menu())

        statistics.add(action='Следующая', storage=storage, tz=tz)
Beispiel #3
0
async def search(bot: Bot, ans: Message, storage):
    """Стейт для работы поиска"""
    # Чат ID пользователя
    chat_id = ans.from_id
    # Данные ввода
    data = ans.text
    # Соответствия по группам
    all_found_groups = []
    # Соответствия для преподов
    all_found_prep = []
    # Задаём состояние для первой страницы
    page = 1
    # Логирование для информации в рил-тайм
    logger.info(f'Inline button data: {data}')
    # Условие для первичного входа пользователя
    if (storage.get_search_list(ans.text) or storage.get_search_list_prep(ans.text)) \
            and Condition_request[chat_id] == []:
        # Результат запроса по группам
        request_group = storage.get_search_list(ans.text)
        # Результат запроса по преподам
        request_prep = storage.get_search_list_prep(ans.text)
        # Циклы нужны для общего поиска. Здесь мы удаляем старые ключи в обоих реквестах и создаём один общий ключ, как для групп, так и для преподов
        for i in request_group:
            i['search'] = i.pop('name')
        for i in request_prep:
            i['search'] = i.pop('prep_short_name')
        # Записываем слово, которое ищем
        request_word = ans.text
        # Склеиваем результаты двух запросов для общего поиска
        request = request_group + request_prep
        # Отправляем в функцию данные для создания клавиатуры
        keyboard = keyboards.make_keyboard_search_group(page, request)
        # Эти циклы записывают группы и преподов в нижнем регистре для удобной работы с ними
        for i in request_group:
            all_found_groups.append(i['search'].lower())
        for i in request_prep:
            all_found_prep.append(i['search'].lower())
        # Создаём общий список
        all_found_results = all_found_groups + all_found_prep
        # Формируем полный багаж для пользователя
        list_search = [page, request_word, all_found_results]
        # Записываем все данные под ключом пользователя
        Condition_request[chat_id] = list_search
        # Выводим результат поиска с клавиатурой (кливиатур формируется по поисковому запросу)
        await ans.answer("Результат поиска", keyboard=keyboard)

    # Здесь уловия для выхода в основное меню
    elif ans.text == "Основное меню":
        del Condition_request[ans.from_id]
        await ans.answer("Основное меню",
                         keyboard=keyboards.make_keyboard_start_menu())
        await bot.state_dispenser.delete(ans.peer_id)

    # Здесь уловие для слова "Дальше"
    elif ans.text == "Дальше":
        page = Condition_request[ans.from_id][0]
        Condition_request[ans.from_id][0] += 1
        request_word = Condition_request[ans.from_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)
        for i in request_group:
            i['search'] = i.pop('name')
        for i in request_prep:
            i['search'] = i.pop('prep_short_name')
        request = request_group + request_prep
        request = request[26 * page:]
        keyboard = keyboards.make_keyboard_search_group(page + 1, request)
        await ans.answer(f"Страница {page + 1}", keyboard=keyboard)

    # По аналогии со словом "<==Назад", только обратный процесс
    elif ans.text == "<==Назад":
        Condition_request[ans.from_id][0] -= 1
        page = Condition_request[ans.from_id][0]
        request_word = Condition_request[ans.from_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)
        for i in request_group:
            i['search'] = i.pop('name')
        for i in request_prep:
            i['search'] = i.pop('prep_short_name')
        request = request_group + request_prep
        request = request[26 * (page - 1):]
        keyboard = keyboards.make_keyboard_search_group(page, request)
        await ans.answer(f"Страница {page}", keyboard=keyboard)

    # Условие для вывода расписания для группы и преподавателя по неделям
    elif ('На текущую неделю' == data or 'На следующую неделю' == data):
        group = Condition_request[ans.from_id][1]
        request_word = Condition_request[ans.from_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)
        # Если есть запрос для группы, то формируем расписание для группы, а если нет, то для препода
        if request_group:
            schedule = storage.get_schedule(group=group)
        elif request_prep:
            schedule = request_prep[0]

        if schedule['schedule'] == []:
            await ans.answer(
                'Расписание временно недоступно\nПопробуйте позже⏱')
            return

        schedule = schedule['schedule']
        week = find_week()

        # меняем неделю
        if data == 'На следующую неделю':
            week = 'odd' if week == 'even' else 'even'

        week_name = 'четная' if week == 'odd' else 'нечетная'
        if request_group:
            schedule_str = full_schedule_in_str(schedule, week=week)
        elif request_prep:
            schedule_str = full_schedule_in_str_prep(schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_str, APIError):
            await schedule_processing.sending_schedule_is_not_available(ans=ans
                                                                        )
            await bot.state_dispenser.delete(ans.peer_id)
            return

        await ans.answer(f'Расписание {group}\n'
                         f'Неделя: {week_name}',
                         keyboard=keyboards.make_keyboard_start_menu())
        # Отправка расписания
        await schedule_processing.sending_schedule(ans=ans,
                                                   schedule_str=schedule_str)

        await bot.state_dispenser.delete(ans.peer_id)

    elif 'Экзамены' == data:
        group = Condition_request[ans.from_id][1]
        request_word = Condition_request[ans.from_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)

        # Объявляем переменную с расписанием экзаменов группы или препода
        if request_group:
            schedule_str = groups_exam(group)
        elif request_prep:
            schedule_str = groups_exam(group)

        # При отсутствии расписания выводится соответствующее предупреждение
        if schedule_str == 0:
            await ans.answer(
                'Расписание экзаменов отсутствует😇\nПопробуйте позже⏱')
            return

        # Задаем расписанию экзаменов вид для подачи пользователю
        schedule_exams = schedule_view_exams(schedule=schedule_str)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_str, APIError):
            await schedule_processing.sending_schedule_is_not_available(ans=ans
                                                                        )
            await bot.state_dispenser.delete(ans.peer_id)
            return

        # Отправка расписания
        await schedule_processing.sending_schedule(ans=ans,
                                                   schedule_str=schedule_exams)

        await bot.state_dispenser.delete(ans.peer_id)

    # Условия для завершения поиска, тобишь окончательный выбор пользователя
    elif (storage.get_search_list(ans.text) or storage.get_search_list_prep(ans.text)) and ans.text.lower() in \
            (i for i in Condition_request[ans.from_id][2]):
        choose = ans.text
        Condition_request[ans.from_id][1] = choose
        request_word = Condition_request[ans.from_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)
        for i in request_group:
            i['search'] = i.pop('name')
        for i in request_prep:
            i['search'] = i.pop('prep_short_name')
        if request_group:
            await ans.answer(
                f"Выберите неделю для группы {choose}",
                keyboard=keyboards.make_keyboard_choose_schedule())
        elif request_prep:
            await ans.answer(
                f"Выберите неделю для преподавателя {request_prep[0]['prep']}",
                keyboard=keyboards.
                make_keyboard_choose_schedule_for_aud_search())
        else:
            return
    # Общее исключения для разных случаем, которые могу сломать бота. (Практически копия первого IF)
    else:
        if Condition_request[ans.from_id] and storage.get_search_list(
                ans.text) or storage.get_search_list_prep(ans.text):
            request_group = storage.get_search_list(ans.text)
            request_prep = storage.get_search_list_prep(ans.text)
            for i in request_group:
                i['search'] = i.pop('name')
            for i in request_prep:
                i['search'] = i.pop('prep_short_name')
            request_word = ans.text
            request = request_group + request_prep
            keyboard = keyboards.make_keyboard_search_group(page, request)
            for i in request_group:
                all_found_groups.append(i['search'].lower())
            for i in request_prep:
                all_found_prep.append(i['search'].lower())
            all_found_results = all_found_groups + all_found_prep
            list_search = [page, request_word, all_found_results]
            Condition_request[chat_id] = list_search
            await ans.answer("Результат поиска", keyboard=keyboard)

        else:
            if len(Condition_request[chat_id]) == 3:
                Condition_request[chat_id][1] = ''
                await ans.answer('Поиск не дал результатов 😕')
                return
            else:
                await ans.answer('Поиск не дал результатов 😕')
                return
Beispiel #4
0
def search(message, bot, storage, tz, last_msg=None):
    """Регистрация преподавателя"""
    global Condition_request
    data = message
    chat_id = message.chat.id
    message = message.text
    all_found_groups = []
    all_found_prep = []
    page = 0

    if data.content_type == 'sticker':
        message = ''

    if last_msg:
        try:
            bot.delete_message(last_msg.chat.id, last_msg.message_id)
        except Exception as e:
            pass

    if storage.get_search_list(message) or storage.get_search_list_prep(
            message):
        # Результат запроса по группам
        request_group = storage.get_search_list(message)
        # Результат запроса по преподам
        request_prep = storage.get_search_list_prep(message)
        # Циклы нужны для общего поиска. Здесь мы удаляем старые ключи в обоих реквестах и создаём один общий ключ,
        # как для групп, так и для преподов
        for i in request_group:
            i['found_prep'] = i.pop('name')
        for i in request_prep:
            i['found_prep'] = i.pop('prep_short_name')
        # Записываем слово, которое ищем
        request_word = message
        # Склеиваем результаты двух запросов для общего поиска
        request = request_group + request_prep
        last_request = request[-1]
        # Отправляем в функцию данные для создания клавиатуры
        # Эти циклы записывают группы и преподов в нижнем регистре для удобной работы с ними
        for i in request_group:
            all_found_groups.append(i['found_prep'].lower())
        for i in request_prep:
            all_found_prep.append(i['found_prep'].lower())
        # Создаём общий список
        all_found_results = all_found_groups + all_found_prep
        # Формируем полный багаж для пользователя
        list_search = [page, request_word, all_found_results]
        # Записываем все данные под ключом пользователя
        Condition_request[chat_id] = list_search
        # Выводим результат поиска с клавиатурой (кливиатур формируется по поисковому запросу)
        if len(request) > 10:
            requests = request[:10 * (page + 1)]
            more_than_10 = True
            msg = bot.send_message(
                chat_id=chat_id,
                text='Результат поиска',
                reply_markup=keyboards.make_keyboard_search_group(
                    last_request=last_request,
                    page=page,
                    more_than_10=more_than_10,
                    requests=requests))
            bot.register_next_step_handler(msg,
                                           search,
                                           bot=bot,
                                           storage=storage,
                                           tz=tz,
                                           last_msg=msg)

        else:
            msg = bot.send_message(
                chat_id=chat_id,
                text='Результат поиска',
                reply_markup=keyboards.make_keyboard_search_group(
                    last_request=last_request,
                    page=page,
                    more_than_10=False,
                    requests=request))
            bot.register_next_step_handler(msg,
                                           search,
                                           bot=bot,
                                           storage=storage,
                                           tz=tz,
                                           last_msg=msg)

    elif ('На текущую неделю' == message or 'На следующую неделю' == message):
        group = Condition_request[chat_id][1]
        request_word = Condition_request[chat_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)
        # Если есть запрос для группы, то формируем расписание для группы, а если нет, то для препода
        if request_group:
            schedule = storage.get_schedule(group=group)
        elif request_prep:
            schedule = request_prep[0]
        if not schedule:
            bot.send_message(
                chat_id=chat_id,
                text='Расписание временно недоступно\nПопробуйте позже⏱')
            return

        schedule = schedule['schedule']
        week = find_week()

        # меняем неделю
        if message == 'На следующую неделю':
            week = 'odd' if week == 'even' else 'even'

        week_name = 'четная' if week == 'odd' else 'нечетная'
        if request_group:
            schedule_str = full_schedule_in_str(schedule, week=week)
        elif request_prep:
            schedule_str = full_schedule_in_str_prep(schedule, week=week)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_str, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        bot.send_message(chat_id=chat_id,
                         text=f'Расписание {group}\n'
                         f'Неделя: {week_name}',
                         reply_markup=keyboards.make_keyboard_start_menu())
        # Отправка расписания
        schedule_processing.sending_schedule(bot=bot,
                                             chat_id=chat_id,
                                             schedule_str=schedule_str)

        bot.clear_step_handler_by_chat_id(chat_id=chat_id)

    elif 'Экзамены' == message:
        group = Condition_request[chat_id][1]
        request_word = Condition_request[chat_id][1]
        request_group = storage.get_search_list(request_word)
        request_prep = storage.get_search_list_prep(request_word)

        # Объявляем переменную с расписанием экзаменов группы или препода
        if request_group:
            schedule_str = groups_exam(group)
        elif request_prep:
            schedule_str = groups_exam(group)

        # При отсутствии расписания выводится соответствующее предупреждение
        if not schedule_str:
            bot.send_message(
                chat_id=chat_id,
                text='Расписание экзаменов отсутствует😇\nПопробуйте позже⏱')
            return

        # Задаем расписанию экзаменов вид для подачи пользователю
        schedule_exams = schedule_view_exams(schedule=schedule_str)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_exams, APIError):
            schedule_processing.sending_schedule_is_not_available(
                bot=bot, chat_id=chat_id)
            return

        # Отправка расписания
        schedule_processing.sending_schedule(bot=bot,
                                             chat_id=chat_id,
                                             schedule_str=schedule_exams)

        bot.clear_step_handler_by_chat_id(chat_id=chat_id)

    elif 'Основное меню' == message:
        bot.send_message(chat_id=chat_id,
                         text='Основное меню',
                         reply_markup=keyboards.make_keyboard_start_menu())

        bot.clear_step_handler_by_chat_id(chat_id=chat_id)

        return

    else:
        msg = bot.send_message(
            chat_id=chat_id,
            text='Проверьте правильность ввода 😞',
            reply_markup=keyboards.make_keyboard_main_menu())
        bot.register_next_step_handler(msg,
                                       search,
                                       bot=bot,
                                       storage=storage,
                                       tz=tz,
                                       last_msg=msg)

    return
Beispiel #5
0
async def search(bot: Bot, ans: Message, storage):
    """Стейт поиска по аудиториям"""
    global aud_list
    # Чат ID пользователя
    chat_id = ans.from_id
    # Данные ввода
    data = ans.text
    # Соответствия по группам
    all_found_aud = []
    # Соответствия для преподов
    # Задаём состояние для первой страницы
    page = 1
    prep_list = []
    all_results = []

    if not storage.get_schedule_aud(data) and len(ans.text.replace(' ',
                                                                   '')) < 15:
        # Отправляем запросы в базу посимвольно
        for item in data:
            # Получаем все результаты запроса на каждый символ
            request_item_all = storage.get_schedule_aud(item)
            # Проходим по каждому результату запроса одного символа
            for i in range(len(request_item_all)):
                # Обращаемся к результатам у которых есть ключ "aud"
                request_item = request_item_all[i]['aud']
                # Записывем все совпадения (Значения ключа "aud")
                prep_list.append(request_item)
                request_item = []

            request_item_all = []

        # Выделение наиболее повторяющихся элементов(а). Фактически результат запроса пользователя.
        qty_most_common = 0
        prep_list_set = set(prep_list)
        for item in prep_list_set:
            qty = prep_list.count(item)
            if qty > qty_most_common:
                qty_most_common = qty
                # Переменная с результатом сортировки
            if ans.text.replace(' ', '').lower() in item.replace('-',
                                                                 '').lower():
                all_results.append(item.lower())

    # Условие для первичного входа пользователя
    if storage.get_schedule_aud(
            data) and aud_list[chat_id] == [] and not all_results:
        # Результат запроса по аудам
        request_aud = storage.get_schedule_aud(data)
        # Циклы нужны для общего поиска. Здесь мы удаляем старые ключи в обоих реквестах и создаём один общий ключ, как для групп, так и для преподов
        for i in request_aud:
            i['search'] = i.pop('aud')
        # Записываем слово, которое ищем
        request_word = data
        # Отправляем в функцию данные для создания клавиатуры
        keyboard = keyboards.make_keyboard_search_group(page, request_aud)
        # Эти циклы записывают группы и преподов в нижнем регистре для удобной работы с ними
        for i in request_aud:
            all_found_aud.append(i['search'].lower())
        # Формируем полный багаж для пользователя
        list_search = [page, request_word, all_found_aud]
        # Записываем все данные под ключом пользователя
        aud_list[chat_id] = list_search
        # Выводим результат поиска с клавиатурой (кливиатур формируется по поисковому запросу)
        await ans.answer("Результат поиска", keyboard=keyboard)
        return

    if all_results and aud_list[chat_id] == []:
        all_found_aud = all_results
        request_word = data
        keyboard = keyboards.make_keyboard_search_group(page, all_found_aud)
        list_search = [page, request_word, all_found_aud]
        aud_list[chat_id] = list_search
        await ans.answer("Результат поиска", keyboard=keyboard)

    # Здесь уловия для выхода в основное меню
    elif data == "Основное меню":
        del aud_list[ans.from_id]
        await ans.answer("Основное меню",
                         keyboard=keyboards.make_keyboard_start_menu())
        await bot.state_dispenser.delete(ans.peer_id)

    # Здесь уловие для слова "Дальше"
    elif data == "Дальше":
        page = aud_list[ans.from_id][0]
        aud_list[ans.from_id][0] += 1
        request_word = aud_list[ans.from_id][1]
        request_aud = storage.get_schedule_aud(request_word)
        for i in request_aud:
            i['search'] = i.pop('aud')
        request_aud = request_aud[26 * page:]
        keyboard = keyboards.make_keyboard_search_group(page + 1, request_aud)
        await ans.answer(f"Страница {page + 1}", keyboard=keyboard)

    # По аналогии со словом "<==Назад", только обратный процесс
    elif data == "<==Назад":
        aud_list[ans.from_id][0] -= 1
        page = aud_list[ans.from_id][0]
        request_word = aud_list[ans.from_id][1]
        request_aud = storage.get_schedule_aud(request_word)
        for i in request_aud:
            i['search'] = i.pop('aud')
        request_aud = request_aud[26 * (page - 1):]
        keyboard = keyboards.make_keyboard_search_group(page, request_aud)
        await ans.answer(f"Страница {page}", keyboard=keyboard)

    # Условие для вывода расписания для группы и преподавателя по неделям
    elif ('На текущую неделю' == data or 'На следующую неделю' == data):
        group = aud_list[ans.from_id][1]
        request_word = aud_list[ans.from_id][1]
        request_aud = storage.get_schedule_aud(request_word)
        # Если есть запрос для группы, то формируем расписание для группы, а если нет, то для препода
        schedule = request_aud[0]

        if schedule['schedule'] == []:
            await schedule_processing.sending_schedule_is_not_available(ans=ans
                                                                        )
            return

        schedule = schedule['schedule']
        week = find_week()

        # меняем неделю
        if data == 'На следующую неделю':
            week = 'odd' if week == 'even' else 'even'

        week_name = 'четная' if week == 'odd' else 'нечетная'

        aud = request_word

        schedule_str = full_schedule_in_str_prep(schedule, week=week, aud=aud)

        # Проверяем, что расписание сформировалось
        if isinstance(schedule_str, APIError):
            await schedule_processing.sending_schedule_is_not_available(ans=ans
                                                                        )
            await bot.state_dispenser.delete(ans.peer_id)
            return

        await ans.answer(f'Расписание {group}\n'
                         f'Неделя: {week_name}',
                         keyboard=keyboards.make_keyboard_start_menu())

        # Отправка расписания
        await schedule_processing.sending_schedule(ans=ans,
                                                   schedule_str=schedule_str)

        await bot.state_dispenser.delete(ans.peer_id)

    # Условия для завершения поиска, тобишь окончательный выбор пользователя
    elif storage.get_schedule_aud(data) and data.lower() in (
            i for i in aud_list[ans.from_id][2]):
        choose = data
        aud_list[ans.from_id][1] = choose
        request_word = aud_list[ans.from_id][1]
        request_aud = storage.get_schedule_aud(request_word)
        for i in request_aud:
            i['search'] = i.pop('aud')

        await ans.answer(
            f"Выберите неделю для аудитории {choose}",
            keyboard=keyboards.make_keyboard_choose_schedule_for_aud_search())

        return
    # Для того, чтобы во время найденного запроса можно было повторить поиск
    else:
        if aud_list[ans.from_id] and storage.get_schedule_aud(data):

            # Результат запроса по аудам
            request_aud = storage.get_schedule_aud(data)
            # Циклы нужны для общего поиска. Здесь мы удаляем старые ключи в обоих реквестах и создаём один общий ключ, как для групп, так и для преподов
            for i in request_aud:
                i['search'] = i.pop('aud')
            # Записываем слово, которое ищем
            request_word = data
            # Отправляем в функцию данные для создания клавиатуры
            keyboard = keyboards.make_keyboard_search_group(page, request_aud)
            # Эти циклы записывают группы и преподов в нижнем регистре для удобной работы с ними
            for i in request_aud:
                all_found_aud.append(i['search'].lower())
            # Формируем полный багаж для пользователя
            list_search = [page, request_word, all_found_aud]
            # Записываем все данные под ключом пользователя
            aud_list[chat_id] = list_search
            # Выводим результат поиска с клавиатурой (кливиатур формируется по поисковому запросу)
            await ans.answer("Результат поиска", keyboard=keyboard)

        else:
            try:
                if len(aud_list[chat_id]) == 3:
                    aud_list[chat_id] = []

            finally:
                if all_results:
                    keyboard = keyboards.make_keyboard_search_group(
                        page, all_results)
                    await ans.answer("Результат поиска", keyboard=keyboard)
                else:
                    await ans.answer(
                        'Поиск не дал результатов 😕',
                        keyboard=keyboards.make_keyboard_main_menu())
                    return