Перейти к содержанию

Расписание уроков

Самостоятельный парсер школьного расписания.

Содержит компоненты, связанные с получением расписания. Такие как получение расписание, его кеширование, отслеживание изменений, сборка индекс и поиск по расписанию.

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

Индекс уроков.

Загружает индекс уроков из файла. Индекс урока предоставляет изменённый словарь расписания, где вместо ключа используется название урока, а не класс.

Индексы удобно использовать при поиске данных из расписания. К примеру если быстро нужно найти урок и посмотреть где, когда и для кого он проводится.

    {
        "матем": [ // Урок ...
            { // Понедельник ...
                "204" { // Кабинет
                    "8в" [ // класс
                        3 // Номер урока
                    ]
                }
            },
            {}, // Вторник ...
            {}, // Среда ...
            // ...
        ]
    }

c_index: ClassIndex property

Индекс кабинетов.

Загружает индекс кабинетов из файла. Индекс кабинетов предоставляет изменённый словарь расписания, где вместо ключа используется название кабинета, а не класс.

Удобно использовать для получения информации о кабинете. Какой урок, когда, для кого проходит в том или ином кабинете. Используется в функции поиска информации по кабинетам.

{
    "204": [ // Кабинет
        { // Понедельник ...
            "матем" { // Какой урок проходит
                "8в" [ // класс для которого проходит
                    3 // Номер урока в расписании
                ]
            }
        },
        {}, // Вторник ...
        {}, // Среда ...
        // ...
    ]
}

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)