From bc8d74fd288ea2982c5aacaf1ac16eece5f9376a Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sun, 6 Sep 2026 16:17:48 +0200 Subject: [PATCH] feat(schedule): per-user class picker, parser fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix parser: capture tr attrs via finditer, strip HTML comments before cell parse (was leaving '-->' in subject names) - store class choice in redis: user:{id}:schedule_class (private) and chat:{id}:schedule_class (groups, admin-only via /setclass) - /schedule renders day for stored class, /setclass sets it directly - drop teacher emoji, format grade as "N клас" --- edu_master/webinar-checker/checker.py | 190 +++++++++++++++++++------- 1 file changed, 138 insertions(+), 52 deletions(-) diff --git a/edu_master/webinar-checker/checker.py b/edu_master/webinar-checker/checker.py index 7adcc5b..011a5a5 100644 --- a/edu_master/webinar-checker/checker.py +++ b/edu_master/webinar-checker/checker.py @@ -518,11 +518,28 @@ def get_schedule_class_keyboard(classes: list): return InlineKeyboardMarkup(rows) +def _get_chat_class(chat, user_id) -> str | None: + """Get stored schedule class for a private user or a group chat.""" + if chat.type == 'private': + return redis_client.get(f'user:{user_id}:schedule_class') + return redis_client.get(f'chat:{chat.id}:schedule_class') + + +def _set_chat_class(chat, user_id, class_num) -> None: + """Save schedule class for a private user or a group chat.""" + if chat.type == 'private': + redis_client.set(f'user:{user_id}:schedule_class', str(class_num)) + else: + redis_client.set(f'chat:{chat.id}:schedule_class', str(class_num)) + + def _parse_schedule_cell(cell_html: str) -> list: """Parse a single schedule cell, returning list of {subject, note, teacher}.""" lessons = [] parts = re.split(r'', cell_html, flags=re.IGNORECASE) for part in parts: + part = re.sub(r'', '', part, flags=re.DOTALL) + part = re.sub(r'