open schedule deeplinks in full viewer

This commit is contained in:
Server 2026-08-31 20:53:25 +00:00
parent d8538de649
commit 4ad160e46d
4 changed files with 42 additions and 13 deletions

View file

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

View file

@ -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:

View file

@ -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"<b>{target['name']}</b>\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"Расписание <b>{target['name']}</b> сохранено",
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"Расписание <b>{target['name']}</b> удалено из сохраненных",
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
),
)

View file

@ -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(