diff --git a/config.py b/config.py index 24f1969..7e1461f 100644 --- a/config.py +++ b/config.py @@ -131,46 +131,45 @@ LESSON_SCHEDULE = { "lower": _LESSON_WEEK, } +# SCHEDULE — тайминг перекуров для /break, построен из фактических пар в +# _LESSON_WEEK, а не задаётся руками, чтобы не рассинхронизироваться при +# правках расписания (раньше здесь была отдельная захардкоженная таблица, +# которая не обновилась вместе с LESSON_SCHEDULE и врала на днях с занятиями). +# Каждая пара (95 мин) состоит из двух академ. часов по 45 мин с 5-минутным +# перекуром между ними; между парами перекур — фактический зазор по PAIR_TIMES. +def _time_to_minutes(t: time) -> int: + return t.hour * 60 + t.minute + + +def _minutes_to_time(m: int) -> time: + return make_time(m // 60, m % 60) + + +def _build_day_schedule(pairs: list[int]) -> list[tuple[time, time, int | None]]: + entries = [] + for idx, pair in enumerate(pairs): + start_t, end_t = PAIR_TIMES[pair] + start_m = _time_to_minutes(start_t) + end_m = _time_to_minutes(end_t) + mid_m = start_m + 45 + second_start_m = mid_m + 5 + entries.append((start_t, _minutes_to_time(mid_m), 5)) + if idx == len(pairs) - 1: + entries.append((_minutes_to_time(second_start_m), end_t, None)) + else: + next_start_t, _ = PAIR_TIMES[pairs[idx + 1]] + gap = _time_to_minutes(next_start_t) - end_m + entries.append((_minutes_to_time(second_start_m), end_t, gap)) + return entries + + +def _pairs_for_day(day_lessons: list[dict]) -> list[int]: + return sorted({item["pair"] for item in day_lessons if item.get("pair") is not None}) + + SCHEDULE = { - 0: [ # Понедельник - (make_time(9, 50), make_time(10, 35), 5), - (make_time(10, 40), make_time(11, 25), 30), - (make_time(11, 55), make_time(12, 40), 5), - (make_time(12, 45), make_time(13, 30), 15), - (make_time(13, 45), make_time(14, 30), 5), - (make_time(14, 35), make_time(15, 20), 30), - (make_time(15, 50), make_time(16, 35), 5), - (make_time(16, 40), make_time(17, 25), None), - ], - 1: [ # Вторник - (make_time(9, 50), make_time(10, 35), 5), - (make_time(10, 40), make_time(11, 25), 30), - (make_time(11, 55), make_time(12, 40), 5), - (make_time(12, 45), make_time(13, 30), 15), - (make_time(13, 45), make_time(14, 30), 5), - (make_time(14, 35), make_time(15, 20), None), - ], - 2: [], # Среда - 3: [ # Четверг - (make_time(8, 0), make_time(8, 45), 5), - (make_time(8, 50), make_time(9, 35), 15), - (make_time(9, 50), make_time(10, 35), 5), - (make_time(10, 40), make_time(11, 25), 30), - (make_time(11, 55), make_time(12, 40), 5), - (make_time(12, 45), make_time(13, 30), 15), - (make_time(13, 45), make_time(14, 30), 5), - (make_time(14, 35), make_time(15, 20), 30), - (make_time(15, 50), make_time(16, 35), 5), - (make_time(16, 40), make_time(17, 25), None), - ], - 4: [ # Пятница - (make_time(9, 50), make_time(10, 35), 5), - (make_time(10, 40), make_time(11, 25), 30), - (make_time(11, 55), make_time(12, 40), 5), - (make_time(12, 45), make_time(13, 30), 15), - (make_time(13, 45), make_time(14, 30), 5), - (make_time(14, 35), make_time(15, 20), None), - ], + day: _build_day_schedule(_pairs_for_day(lessons)) + for day, lessons in _LESSON_WEEK.items() } # --- Остальное ---