bot/bot/main/register_user.py
2026-09-14 12:07:27 +00:00

148 lines
5.2 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.

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),
)