148 lines
5.2 KiB
Python
148 lines
5.2 KiB
Python
import json
|
||
|
||
from telebot.types import Message, ReplyKeyboardRemove
|
||
from telebot.util import quick_markup
|
||
|
||
import config
|
||
from models import logger
|
||
from models.bot import Markup_v1 as Markup, bot, send
|
||
from models.schedule import (
|
||
ScheduleAPIError,
|
||
find_main_groups,
|
||
group_exists,
|
||
group_target,
|
||
search_targets,
|
||
)
|
||
from models.user import getAllUsers, validate
|
||
from utils import convert
|
||
|
||
|
||
@bot.message_handler(commands=["start"])
|
||
def start(message: Message):
|
||
user = validate(message)
|
||
message.text = str(message.text)
|
||
|
||
payload = message.text.split()[-1]
|
||
if payload.startswith("_s"):
|
||
query = payload
|
||
search_target_kind = ({
|
||
't': 'teacher',
|
||
'r': 'room',
|
||
'g': 'group'
|
||
}).get(query[2:3])
|
||
if not search_target_kind:
|
||
return send(message, "Не удалось определить тип расписания по ссылке.")
|
||
search_query = convert.decode(query[3:])
|
||
try:
|
||
results = search_targets(search_target_kind, search_query, limit=10)
|
||
except ScheduleAPIError as error:
|
||
logger.error("Schedule", f"[{user.id}] {error}")
|
||
return send(message, "Сервер расписания сейчас недоступен. Попробуй открыть ссылку позже.")
|
||
if not results:
|
||
return send(message, "Это расписание больше не найдено на сервере.")
|
||
from bot.schedule.search import open_schedule_viewer
|
||
|
||
return open_schedule_viewer(message, results[0], from_search=False)
|
||
|
||
|
||
if user.group and "migrate" in message.text:
|
||
user.setState("default")
|
||
logger.log("Bot", f"{user.id} migrated")
|
||
return send(message, "Добро пожаловать снова 💞", reply_markup=Markup.default(user))
|
||
|
||
was_registered = bool(user.group)
|
||
logger.log("Bot", f"[{user.id}] /start detected, Total users: {len(list(getAllUsers()))}")
|
||
json.dump(
|
||
{
|
||
"state": "selectGroup",
|
||
"group": None,
|
||
"active_schedule": None,
|
||
"saved_groups": user.saved_groups,
|
||
"saved_schedules": user.saved_schedules,
|
||
"view_schedule": None,
|
||
"notifications": [],
|
||
"valid": True,
|
||
"user": user.user,
|
||
"usage": user.usage,
|
||
"flags": user.flags,
|
||
},
|
||
open(f"./users/{user.id}.json", "w", encoding="utf-8"),
|
||
ensure_ascii=False,
|
||
indent=4,
|
||
)
|
||
|
||
prefix = (
|
||
"<i>Вы начали процедуру перезапуска бота. Уведомления отключены.</i>\n\n"
|
||
if was_registered
|
||
else ""
|
||
)
|
||
send(
|
||
message,
|
||
prefix + "Напиши название своей группы. Например: <code>АТ-501</code>",
|
||
reply_markup=ReplyKeyboardRemove(),
|
||
)
|
||
|
||
|
||
@bot.message_handler(content_types=["text"], func=lambda message: "нету ⚠" in message.text)
|
||
def notFoundHandler(message: Message):
|
||
bot.reply_to(
|
||
message,
|
||
"""
|
||
<b>Не расстраивайся!</b>
|
||
<i>Напиши разработчику, если твоей группы нет в расписании.</i>
|
||
""",
|
||
reply_markup=quick_markup(
|
||
{
|
||
"Написать разработчику 💞": {"url": "https://t.me/m/Gg00FvJmZDM6"},
|
||
"Перезапустить бота 🤖": {"url": config.TELEGRAM_URL + "?start=r"},
|
||
},
|
||
row_width=1,
|
||
),
|
||
)
|
||
|
||
|
||
def _finish_registration(message: Message, group_name: str) -> None:
|
||
user = validate(message)
|
||
user.save_schedule(group_target(group_name))
|
||
user.valid = True
|
||
user.setState("default")
|
||
send(
|
||
message,
|
||
"""
|
||
<b>Приятного использования!</b>
|
||
Здесь можно посмотреть расписание и настроить уведомления о парах.
|
||
|
||
<i>Изменить группу можно через /start.</i>
|
||
""",
|
||
reply_markup=Markup.default(user),
|
||
)
|
||
|
||
|
||
@bot.message_handler(
|
||
content_types=["text"], func=lambda message: validate(message).state == "selectGroup"
|
||
)
|
||
def selectGroupState(message: Message):
|
||
query = (message.text or "").strip()
|
||
try:
|
||
matches = find_main_groups(query)
|
||
if len(matches) == 1 and group_exists(query):
|
||
return _finish_registration(message, matches[0])
|
||
except ScheduleAPIError as error:
|
||
logger.error("Schedule", f"[{message.from_user.id}] {error}")
|
||
return send(
|
||
message,
|
||
"Сервер расписания сейчас недоступен. Попробуй отправить название группы позже.",
|
||
)
|
||
|
||
if not matches:
|
||
return send(
|
||
message,
|
||
"Похожих групп не нашлось. Проверь название и попробуй ещё раз.",
|
||
reply_markup=Markup.selectGroup([]),
|
||
)
|
||
|
||
send(
|
||
message,
|
||
"Выбери свою группу из самых похожих вариантов или введи название точнее.",
|
||
reply_markup=Markup.selectGroup(matches),
|
||
)
|