99 lines
3.9 KiB
Python
99 lines
3.9 KiB
Python
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()
|