import datetime import re from aiogram import Bot from aiogram.types import KeyboardButton, Message, ReplyKeyboardMarkup from DB import UseDB from get import fetch_timetable_data, get_timetable_for_day def get_group_id(user_id: int) -> int | None: """ Функция для получения id группы по id пользователя :param user_id: int - id пользователя :return: int | None - либо id группы полученный по id пользователя или ничего """ db = UseDB("users") if db.find_document({"user_id": user_id}): return db.find_document({"user_id": user_id})[0]["group_id"] else: return None async def on_notification(msg: Message) -> None: """ Функция для отправки уведомлений пользователя по времени :param msg: Message - объект сообщения от пользователя :return: None """ time_on_notification = msg.text.split()[1] pattern = r'^([01]?[0-9]|2[0-3]):([0-5]?[0-9])$' if re.match(pattern, time_on_notification): time_obj = datetime.datetime.strptime(time_on_notification, "%H:%M") db = UseDB("users") db.update_document( {"user_id": msg.from_user.id}, {"notification": time_obj} ) await msg.answer(f"Отлично, время теперь установленно на: {time_obj}") else: await msg.answer( "Формат времени не правильный. " "Правильный формат команды: /on_notification часы:минуты." ) async def set_group(msg: Message) -> None: """ Функция для установки группы пользователя :param msg: Message - объект сообщения от пользователя :return: None """ try: group_id = int(msg.text.split()[1]) except ValueError: await msg.answer( "Указанная вами группа не найдена. " "Пожалуйста, проверьте корректность номера группы." ) return response = fetch_timetable_data(group_id) if "404" in str(response) or "500" in str(response): await msg.answer( "Указанная вами группа не найдена. " "Пожалуйста, проверьте корректность номера группы." ) else: db = UseDB("users") if db.find_document({"user_id": msg.from_user.id}): db.update_document( {"user_id": msg.from_user.id}, {"group_id": group_id} ) else: db.insert_document( { "user_id": msg.from_user.id, "group_id": group_id, "notification": "off" } ) kb = [ [KeyboardButton(text="сегодня")], [KeyboardButton(text="завтра")], [KeyboardButton(text="послезавтра")] ] keyboard = ReplyKeyboardMarkup(keyboard=kb, resize_keyboard=True) await msg.answer("Я сохранил группу для вас.", reply_markup=keyboard) async def timetable_for_day(msg: Message, shift: int = 0) -> None: """ Функция для отправки сообщения пользователю со сдвигом на некоторое количество дней :param msg: Message - объект сообщения от пользователя :param shift: int - на сколько дней вперёд пытается пользователь получить расписание :return: None """ group_id = get_group_id(msg.from_user.id) if group_id is None: await msg.answer( "Кажется, вашего пользователя нет в нашей базе данных." "Чтобы начать работу, пожалуйста, укажите вашу группу с " "помощью команды: /set_group номер_группы." ) return for text in get_timetable_for_day(group_id, shift): await msg.answer(text) async def timetable_day(user_id: int, group_id: int, bot: Bot) -> None: """ Функция для отправки сообщения пользователю по уведомлению :param user_id: int - id пользователя :param group_id: int - id группы пользователя :param bot: Bot - бот, с помощью которого можно отправлять сообщения :return: None """ for text in get_timetable_for_day(group_id, 1): await bot.send_message(chat_id=user_id, text=text)