From 4ad160e46d66e01a24c7eb25cb9f1490534db9a6 Mon Sep 17 00:00:00 2001
From: Server <10.9.8.204@example.com>
Date: Mon, 31 Aug 2026 20:53:25 +0000
Subject: [PATCH] open schedule deeplinks in full viewer
---
bot/main/home.py | 2 +-
bot/main/register_user.py | 26 ++++++++++++++++++++++----
bot/schedule/search.py | 22 +++++++++++++++-------
models/bot.py | 5 ++++-
4 files changed, 42 insertions(+), 13 deletions(-)
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(