/
rnj
/
SuaiTestBot
Обзор
Документация
Войти
/
rnj
/
SuaiTestBot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
bot/utils.py
92 строки
3 KB
Dmitriy Pozdeev
init commit
03 июн 2026, 23:58
03 июн 2026, 23:58
110bad2
Код
Авторство
О чём код?
import re from datetime import date from typing import List, Optional from database.crud import LessonInfo from bot.schedule_slots import ( DAY_NAMES, DAY_NAMES_SHORT, LESSON_TYPE_LABELS, SLOTS, WEEK_LABELS, format_week_day, slot_label, week_type_for_date, ) _MD_V2_CHARS = set(r"_[]()~`>#+-=|{}.!*") def escape_md_v2(text: str) -> str: result = [] for char in str(text): if char in _MD_V2_CHARS: result.append("\\" + char) else: result.append(char) return "".join(result) def validate_email(email: str) -> bool: return bool(re.match(r"^[\w.\-]+@[\w.\-]+\.\w+$", email.strip())) def validate_phone(phone: str) -> bool: return bool(re.match(r"^\+?[\d\s\-()]{7,20}$", phone.strip())) def validate_hours(text: str) -> Optional[int]: try: hours = int(text.strip()) return hours if hours > 0 else None except ValueError: return None def lesson_slot_times(info: LessonInfo) -> tuple: return SLOTS[info.lesson.slot_number] def format_lesson_line(info: LessonInfo) -> str: lesson = info.lesson start, end = lesson_slot_times(info) type_label = LESSON_TYPE_LABELS.get(lesson.lesson_type, lesson.lesson_type) week_lbl = WEEK_LABELS.get(lesson.week_type, lesson.week_type) day_lbl = DAY_NAMES_SHORT[lesson.day_of_week] return ( f"🕐 *{escape_md_v2(str(lesson.slot_number))} пара* " f"\\({escape_md_v2(start.strftime('%H:%M'))}\\-{escape_md_v2(end.strftime('%H:%M'))}\\)\n" f"*{escape_md_v2(info.discipline_name)}*\n" f"📅 {escape_md_v2(day_lbl)}, {escape_md_v2(week_lbl)}\n" f"👤 {escape_md_v2(info.teacher_name)} \\| " f"🏫 {escape_md_v2(lesson.room)} \\| {escape_md_v2(type_label)}" ) def format_day_schedule(title: str, lessons: List[LessonInfo], empty_text: str) -> str: header = f"*{escape_md_v2(title)}*\n\n" if not lessons: return header + escape_md_v2(empty_text) lines = [format_lesson_line(info) for info in lessons] return header + "\n\n".join(lines) def format_week_schedule(lessons: List[LessonInfo], week_type: str) -> str: week_lbl = WEEK_LABELS.get(week_type, week_type) if not lessons: return escape_md_v2(f"На {week_lbl.lower()} неделе занятий нет.") parts = [f"*{escape_md_v2(f'Расписание — {week_lbl} неделя')}*"] current_day = None for info in lessons: d = info.lesson.day_of_week if d != current_day: current_day = d parts.append(f"\n*{escape_md_v2(format_week_day(d))}*") parts.append(format_lesson_line(info)) return "\n\n".join(parts) def schedule_title_for_date(target: date, prefix: str) -> str: week_lbl = WEEK_LABELS.get(week_type_for_date(target), "") day_name = DAY_NAMES[target.weekday()] if target.weekday() <= 5 else "Воскресенье" return f"{prefix} ({day_name}, {target.strftime('%d.%m.%Y')}, {week_lbl})"