Расписание уроков
Самостоятельный парсер школьного расписания.
Содержит компоненты, связанные с получением расписания. Такие как получение расписание, его кеширование, отслеживание изменений, сборка индекс и поиск по расписанию.
LessonIndex = dict[str, list[dict[str, dict[str, list[int]]]]]
module-attribute
ClassIndex = dict[str, list[dict[str, dict[str, list[int]]]]]
module-attribute
SearchRes = list[list[list[str]]]
module-attribute
ScheduleDict
Bases: TypedDict
Описывает что собой представляет словарь расписание.
hash: str
instance-attribute
last_parse: int
instance-attribute
lessons: dict[str, list[list[str]]]
instance-attribute
Schedule(schedule: dict[str, list[list[str]]], hash: str, loaded_at: int, l_index: LessonIndex, c_index: ClassIndex, updates: list[UpdateData])
Предоставляет доступ к расписанию уроков.
В первую очередь занимается получение расписания из гугл таблиц. Отслеживает изменения в расписании и записывает их в файл. Вы можете получить расписание для конкретного класса, произвести полный поиск по урокам или кабинетам, использую фильтры, получить список изменений в расписании, также с возможностью отфильтровать результаты поиска. Также предоставляет доступ к индексам расписания.
hash = hash
instance-attribute
loaded_at = loaded_at
instance-attribute
schedule: dict[str, list[list[str]]]
property
Получает расписание уроков.
Если расписание уроков пустое или таймер истёк, запускает процесс обновления.
Процесс обновления:
- Загрузка файла расписания.
- Если не удалось, передвигаем метку обновления.
- Сравниваем хеши расписаний.
- Если различаются:
- Разбирает расписание из файла.
- Обновляем индексы расписания.
- Сравниваем и записывает изменения в расписании.
- Сдвигаем временную метку следующего обновления.
Расписание уроков представляет собой словарь:
hash: Хеш сумма расписания уроков.last_parse: UnixTime последней проверки расписания.next_parse: UnixTime следующей проверки расписания.lessons: Сам словарь расписаний уроков по классам.
l_index: LessonIndex
property
Индекс уроков.
Загружает индекс уроков из файла. Индекс урока предоставляет изменённый словарь расписания, где вместо ключа используется название урока, а не класс.
Индексы удобно использовать при поиске данных из расписания. К примеру если быстро нужно найти урок и посмотреть где, когда и для кого он проводится.
c_index: ClassIndex
property
Индекс кабинетов.
Загружает индекс кабинетов из файла. Индекс кабинетов предоставляет изменённый словарь расписания, где вместо ключа используется название кабинета, а не класс.
Удобно использовать для получения информации о кабинете. Какой урок, когда, для кого проходит в том или ином кабинете. Используется в функции поиска информации по кабинетам.
updates: list[UpdateData] | None
property
Список изменений в расписании.
Загружает полный список изменений из файла. Список изменений представляет собой перечень последних 30-ти зафиксированных изменений. Включая время начала и конца временного промежутка, когда эти изменения были зафиксированы.
Если вы хотите получить не все обновления или хотите отфильтровать результаты намерения при помощи Намерения, то воспользуйтесь методом get_updates.
Пример одной из записей:
{
"start_time": 1703479133.752195,
"end_time": 1703486843.468643,
"updates": [ // Дни недели
{
"5а": [ // Классы ...
[ // Изменение в расписании
"тфк:110", // Старый урок:класс
"None:110" // Новый урок:класс
],
null, // Если уроки не изменились
// И так далее...
],
},
{}, // Вторник ...
{}, // Среда ...
// ...
]
}
lessons(cl: str | None = None) -> list[list[str]]
Получает полное расписание уроков для указанного класса.
.. deprecated:: 5.8 Данный метод может быть переработан
- Поскольку он зависит от внутреннего аттрибута класса.
- Не поддерживает намерения для фильтрации результата.
Возвращает полное расписание уроков для указанного класса. Если не указать класс, берёт класс из аттрибута расписания. Если такого класса в расписании нету, то вернёт пустое расписание на неделю. Обратите внимание, что даже при неправильном классе результат вернётся корректный.
get_updates(intent: Intent, offset: int | None = None) -> list[UpdateData]
Получает список изменений расписания.
Это более продвинутый метод получения записей об изменениях в расписании. Проходится по всему списку изменений, возвращая необходимые вам результаты. Для уточнения результатов используется Намерение. К примеру чтобы получить все изменения для одного класса. Или посмотреть как изменялось расписание в определённый день.
Помимо этого вы можете передавать временную метку обновления, начиная с которой будет производиться поиск изменений. Это используется при отправке именно новых обновлений в расписании пользователей.
Ежели ваша цель - просто получить список всех изменений в
расписании, то воспользуйтесь аттрибутом updates.
search(target: str, intent: Intent, cabinets: bool | None = False) -> SearchRes
Производит поиск в расписании по индексу расписания.
Сама же цель - название кабинета/урока. Для уточнения результатов поиска используются намерения. Например чтобы получить результаты на определённый день. Ну или к примеру в определённых кабинетах, если речь об уроке.
Поиск немного изменяется в зависимости от режима.
+----------+---------+---------+ | cabinets | obj | another | +==========+=========+=========+ | false | lesson | cabinet | +----------+---------+---------+ | true | cabinet | lesson | +----------+---------+---------+
Результат поиска возвращает подобный расписанию формат.
[ // Дни
[ // Уроки (по умолчанию 8)
[ // Найденные результаты
"{cl}",
"{obj}",
"{cl}:{obj}",
"..."
],
[], // Если список пустой - ничего не найдено
// Дальше все прочие уроки.
],
[], // Вторник ...
// Среда ...
]
Формат строки результата зависит от некоторых условий:
{cl}- Если в намерении 1 кабинет и указаны уроки.{obj}- Если в намерении 1 класс (опускаем описание класса).{cl}:{obj}- Для всех прочих случаев.
construct_intent(cl: Iterable[str] | str = (), days: Iterable[int] | int = (), lessons: Iterable[str] | str = (), cabinets: Iterable[str] | str = ()) -> Intent
Создаёт новое намерение для текущего расписания.
Сокращение для Intent.construct().
.. code-block:: python
# Можно использовать любой вариант
i = Intent.construct(sc, ...)
i = sc.construct_intent(...)
parse_intent(args: Iterable[str]) -> Intent
Парсит намерение из строковых аргументов.
Сокращение для Intent.parse()
.. code-block:: python
# Можно использовать любой вариант
i = Intent.parse(sc, args)
i = sc.parse_intent(args)