Дело было вечером, делать было нечего.
Крайне неудобно было смотреть на расписание, как на скрине ниже (ни уведомлений, ни адаптации под мобильные экраны, ни стабильной работы самого сайта), в своей шараге, поэтому я сделал бота в телеграме, который умеет его парсить, сравнивать и присылать уведомление об изменениях.
На данный момент работает только в пределах 4 корпуса. Ссылка: t.me/maiq-timetable-bot
Таким образом, вот это:
Превратилось в это:
Сложности возникают разве что с sqlx и его проверкой sql-запросов. Решается указанием DATABASE_URL или SQLX_OFFLINE 1.
Для
maiq-botнеобходимо указатьTELOXIDE_TOKEN
Дляmaiq-dbнеобходимо указатьSQLITE_PATH.DATABASE_URLиспользует sqlx для проверки запросов и не обязателен для билда, но тогда надо указатьSQLX_OFFLINE 1, аSQLITE_PATH- реальный файл .sqlite
docker
docker build -t maiq-bot .
docker run -v <PATH>:/var/sqlite.db -e RUST_LOG=info -e RUST_LOG_STYLE=always -e SQLITE_PATH=/var/sqlite.db -e TELOXIDE_TOKEN=<token> -dit maiq-botmaiq-parser
Содержит в себе определения структур для таблицы расписания (Snapshot -> Group -> Lecture), парсер html-таблицы и парсером данных из этой таблицы.
maiq-db
Слой для работы с базой данных. Втупую сохраняет и выдаёт данные из sqlite.
maiq-bot
Использует оба вышеописанных крейта для работы, представляет собой бота в телеге, который может реагировать на команды/callback-query, сохранять группы пользователя и отправлять ему уведомления.
В директории maiq-bot/replies хранятся темплейты для ответов бота.
maiq-cli
Бесполезная штука, которая изначально планировалась, как cli-утилита для вывода расписания, но разве это кому-то надо?
В директории .changes находится человекочитаемый лог изменений, maiq-bot умеет его отображать.
В необходимости этой секции я сомневаюсь ещё больше, чем в необходимости существования maiq-cli, но тем не менее приглашаю в issues и pull requests, все остальные вопросы - в телегу
Изначально этот репозиторий был разделён на три - maiq-web-api, maiq-parser и maiq-bot. Быстро выяснилось, что такая архитектура неудобная, нерасширяемая, громоздкая, ещё и кушает больше ресурсов. Переписал и теперь это монорепо, а эти трое - в архиве на память.

