from aiogram import types, Dispatcher from aiogram.filters import Command from models.state import BotState from services.schedule_service import ScheduleService from utils.antispam import is_chat_spam, saving from storage.message_storage import save_message from storage.users_storage import set_group, get_group from aiogram.utils.keyboard import InlineKeyboardBuilder VALID_GROUPS = [ "603Т", "33мд", "32мд", "31тс", "30тс", "29то", "28то", "27д", "26д", "25тм", "24тм", "23д", "22мд", "21мд", "20тс", "19тс", "18то", "17то", "16д", "15д", "14тм", "13тм", "12д", "11мд", "10мд", "8тс", "7то", "7Ст", "6то", "6Сб", "5д", "5Cа", "4Сб", "3тм", "3Са", "2тм", "2Cб", "1Са", "600Р", "601Р", "602д" ] def register_handlers(dp: Dispatcher, state: BotState): @dp.message(Command("rasp")) @saving async def send_schedule(message: types.Message): """Отправка расписания (текст)""" if is_chat_spam(message.chat.id, state): await message.answer("НЕ СПАМЬТЕ!!!") return args = message.text.split(maxsplit=2) # Определяем группу if len(args) > 1: group = args[1].strip() else: group = get_group(message.from_user.id) # Определяем смещение по дню day_offset = int(args[2]) if len(args) > 2 and args[2].isdigit() else 0 schedule_service = ScheduleService() text, url, day, month = await schedule_service.get_schedule(group, day_offset) msg = await message.answer(text, parse_mode="Markdownv2") save_message(msg.chat.id, msg.message_id) @dp.message(Command("prasp")) @saving async def send_schedule(message: types.Message): """Отправка расписания""" if is_chat_spam(message.chat.id, state): await message.answer("НЕ СПАМЬТЕ!!!") return args = message.text.split(maxsplit=2) if len(args) > 1: group = args[1].strip() else: group = get_group(message.from_user.id) day_offset = int(args[2]) if len(args) > 2 and args[2].isdigit() else 0 schedule_service = ScheduleService() clip_png, url, day, mouth = await schedule_service.get_pschedule( group, day_offset ) if clip_png: save_message(message.chat.id, message.message_id) msg = await message.answer_photo( types.BufferedInputFile(clip_png, filename=f"{group}.png"), caption=f"Расписание для {group} на {day}.{mouth:02d}", ) save_message(message.chat.id, msg.message_id) state.file_id_cache[group.lower()] = msg.photo[-1].file_id else: await message.answer(f"Не удалось найти расписание для {group}") @dp.message(Command("set")) @saving async def set(message: types.Message): # создаём клавиатуру builder = InlineKeyboardBuilder() for group in VALID_GROUPS: builder.button(text=group, callback_data=f"set_group:{group}") builder.adjust(5) # количество кнопок в строке await message.answer( "Выбери группу из списка:", reply_markup=builder.as_markup() ) @dp.callback_query(lambda c: c.data.startswith("set_group:")) async def process_group_choice(callback: types.CallbackQuery): group = callback.data.split(":")[1] set_group(callback.from_user.id, group) # редактируем сообщение: убираем клавиатуру await callback.message.edit_reply_markup(reply_markup=None) await callback.message.answer(f"✅ Группа установлена: {group}") await callback.answer()