146 lines
5.5 KiB
Python
146 lines
5.5 KiB
Python
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 off_notification(msg: Message) -> None:
|
|
"""
|
|
Функция для отключения отправки уведомлений пользователя по времени
|
|
|
|
:param msg: Message - объект сообщения от пользователя
|
|
|
|
:return: None
|
|
"""
|
|
db = UseDB("users")
|
|
db.del_document({"user_id": msg.from_user.id})
|
|
await msg.answer(
|
|
"Отлично, теперь уведомления не буду вам отправляться. "
|
|
"Не забудьте в сентябре обратно их включить."
|
|
)
|
|
|
|
|
|
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)
|