diff --git a/bot/main/home.py b/bot/main/home.py index 1cfa40e..bc9ec28 100644 --- a/bot/main/home.py +++ b/bot/main/home.py @@ -18,7 +18,7 @@ def sendBrokenMessage(message: Message): @bot.message_handler(content_types = ['text'], func = lambda m: m.text == Strings.back_to_home) def returnToDefaultState(message: Message): u = validate(message) - if not u.active_target: + if not u.active_target and u.state != 'scheduleDeepLink': from bot.schedule.search import open_search return open_search(message, u) diff --git a/bot/main/register_user.py b/bot/main/register_user.py index d41c779..b9cac5f 100644 --- a/bot/main/register_user.py +++ b/bot/main/register_user.py @@ -6,7 +6,13 @@ 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 +from models.schedule import ( + ScheduleAPIError, + find_main_groups, + group_exists, + group_target, + search_targets, +) from models.user import getAllUsers, validate from utils import convert @@ -16,15 +22,27 @@ def start(message: Message): user = validate(message) message.text = str(message.text) - if "_s" in message.text: - query = message.text.split(' ')[-1] + 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:]) - return send(message, f'search: {search_target_kind} - {search_query}') + 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: diff --git a/bot/schedule/search.py b/bot/schedule/search.py index b1ef2f9..0ab56cd 100644 --- a/bot/schedule/search.py +++ b/bot/schedule/search.py @@ -38,14 +38,18 @@ def open_search(message: Message, user: User | None = None) -> None: ) -def open_schedule_viewer(message: Message, target: ScheduleTarget) -> None: +def open_schedule_viewer( + message: Message, target: ScheduleTarget, from_search: bool = True +) -> None: user = validate(message) user.view_target = target - user.setState("scheduleSearch") + user.setState("scheduleSearch" if from_search else "scheduleDeepLink") send( message, f"{target['name']}\nВыбери нужный день или неделю", - reply_markup=Markup.schedule(user.is_saved(target), from_search=True), + reply_markup=Markup.schedule( + user.is_saved(target), from_search=from_search, include_today=not from_search + ), ) @@ -128,10 +132,12 @@ def search_query(message: Message): @bot.message_handler( - content_types=["text"], func=lambda message: validate(message).state == "scheduleSearch" + content_types=["text"], + func=lambda message: validate(message).state in {"scheduleSearch", "scheduleDeepLink"}, ) def search_schedule_viewer(message: Message): user = validate(message) + from_search = user.state == "scheduleSearch" target = user.view_target if not target: return open_search(message, user) @@ -141,14 +147,14 @@ def search_schedule_viewer(message: Message): return send( message, f"Расписание {target['name']} сохранено", - reply_markup=Markup.schedule(True, from_search=True), + reply_markup=Markup.schedule(True, from_search=from_search, include_today=not from_search), ) if message.text == Strings.delete: user.remove_schedule(target) return send( message, f"Расписание {target['name']} удалено из сохраненных", - reply_markup=Markup.schedule(False, from_search=True), + reply_markup=Markup.schedule(False, from_search=from_search, include_today=not from_search), ) result = render_schedule_action(user, target, message.text or "") @@ -156,5 +162,7 @@ def search_schedule_viewer(message: Message): return send( message, result, - reply_markup=Markup.schedule(user.is_saved(target), from_search=True), + reply_markup=Markup.schedule( + user.is_saved(target), from_search=from_search, include_today=not from_search + ), ) diff --git a/models/bot.py b/models/bot.py index 4dc7763..6449df9 100644 --- a/models/bot.py +++ b/models/bot.py @@ -166,12 +166,15 @@ class Markup_v1: return markup @staticmethod - def schedule(is_saved: bool, from_search: bool = False) -> ReplyKeyboardMarkup: + def schedule( + is_saved: bool, from_search: bool = False, include_today: bool = False + ) -> ReplyKeyboardMarkup: even_week = datetime.datetime.now(ZoneInfo('Europe/Moscow')).isocalendar().week % 2 == 0 markup = ReplyKeyboardMarkup(resize_keyboard=True) markup.add(Strings.back_to_search if from_search else Strings.back_to_home, row_width=1) if from_search: markup.add(Strings.delete if is_saved else Strings.save, row_width=1) + if from_search or include_today: markup.add(Strings.today, Strings.tomorrow, row_width=2) markup.add(*Strings.weekdays, row_width=5) markup.add(