Files
myfirstprogram/handlers/schedule.py
T
2025-11-23 23:17:00 +03:00

102 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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Сб", "", "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_pschedule(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) # количество кнопок в строке
msg = await message.answer(
"Выбери группу из списка:",
reply_markup=builder.as_markup()
)
save_message(msg.chat.id, msg.message_id)
@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)
msg = await callback.message.answer(f"✅ Группа установлена: {group}")
save_message(msg.chat.id, msg.message_id)
await callback.answer()