An open API service indexing awesome lists of open source software.

https://github.com/timur-sa/schedulebot

Made for Sirius IT-Round.
https://github.com/timur-sa/schedulebot

aiogram apscheduler json python sqlalchemy telegram

Last synced: 2 months ago
JSON representation

Made for Sirius IT-Round.

Awesome Lists containing this project

README

          

# ScheduleBot
Telegram-бот с возможностью получения напоминаний про события, а также создания своих.
**Сделано для ИТ-Раунда.**
**Автор: Степанов Тимур**

---
# Установка
1) Перейти в корень проекта:
```shell
...\Downloads> cd .\ScheduleBot\
```

2) Активировать venv:
```shell
...\ScheduleBot> .\Scripts\Activate
```

3) Установить зависимости:
```shell
(ScheduleBot) ...\ScheduleBot> pip install -r .\requirements.txt
```

4) Указать токен:
```python
#./=BOT=/config.py
from aiogram import Bot

bot = Bot(token="ТОКЕН")
```

> [!IMPORTANT]
> Тестовый токен уже указан, шаг 4 **РЕКОМЕНДУЕТСЯ** пропустить.
> Токен будет доступен в рамках конкурса, после окончания проверки проектного этапа токен перестанет действовать

5) Запуск:
```shell
(ScheduleBot) ...\ScheduleBot> python ".\=BOT=\main.py"
```

6) Бот запущен!
> [!IMPORTANT]
> При стандартном токене, бот доступен по ссылке: https://t.me/SiriusUniversitySchedule_Bot (@SiriusUniversitySchedule_Bot)

# Технические решения
## Aiogram
Используется асинхронная библиотека для мессенджера Telegram.
Выбор обусловлен популярностью библиотеки, широким функционалом, большим количеством документации/обучающих материалов, а также: возможностью улучшения быстродействия программы в будущем.
Имеется ввиду полный переход на асинхронные библиотеки, функции, а также распараллеливание задач.

## JSON
Простота формата и его абсолютная универсальность повиляла на выбор именно этого типа данных для их хранения, записи и чтения.
### Структура:
**global.json:**
```JSON
{
"2025-07-15":
[
{
"time": "09:00",
"name": "Доброе утро, Сириус!",
"group": ".ALL"
},
{
"time": "13:00",
"name": "Вебинар",
"group": ".ALL"
}
]
}
```

> [!NOTE]
> В данных уже существуют группы пользователей, но их обработка не производится. Если реализовать проверку на принадлежность к группе, то появиться возможность создавать события для отдельных классов учеников, групп студентов и т.п.

**{uid}.json:**
```JSON
{
"2025-07-14":
[
{
"time": "10:00",
"name": "Дедлайн по ИТ-Раунду!"
}
]
}
```

> [!NOTE]
> Можно значительно ускорить работу с данными, заменив массив словарей на словарь (день, ключ - дата) со словарями (события, ключ - время).
> Сейчас для получения доступа к определённому событию необходимо получить доступ ко дню (за **O(1)**) и к самому событию (за **O(n)**, где **n** - максимальное количество событий в одном дне).
> При изменении структуры доступ будет осуществляться за **O(1)**

## APScheduler и SQLAlchemy
Для отправления сообщений в определённое время (напоминания), используется библиотека APScheduler, которая хранит все запланированные задачи в БД SQLite, доступ к которой осуществляется через SQLAlchemy.
Такой выбор обусловлен надёжностью и автономностью APScheduler, а также тем, что хранение запланированных задач уже полностью реализовано в библиотеке.

## Структура проекта
### =BOT=: (в порядке разработки)
- **main.py** - Запуск бота, APScheduler
Реализовано базовое логирование состояния бота

- **handlers.py** - Обработка сообщений и команд.
Реализована работа с FSM, валидация аргументов команд с помощью регулярных выражений.
Доступные функции см. в блоке "## Функционал"

- **data.py** - Работа с JSON.
Реализовано хранение, запись, изменение и чтение данных.

- **keyboards.py** - Клавиатуры для удобного ввода
Добавляет возможность подтверждения рискованных операций (удаление данных).

- **reminders.py** - Планирование выполнения функций с помощью APScheduler.
Позволяет боту присылать сообщения самостоятельно в заданное время.

- **config.py** - Доступ к токену и к корню проекта.
### =BOT=/DataTables:
**global.json** - События
**{uid}.json** - Напоминания
**notifications.sqlite** - БД для APScheduler
## Функционал
Реализованы все обязательные функции из ТЗ.
Полный список команд:
- **/start**
- **/today**
- **/tomorrow**
- **/add** {Название из нескольких слов} {ГГГГ-ММ-ДД} {чч:мм}
- **/del (/delete)** {ГГГГ-ММ-ДД} {чч:мм} [^1]
- **/help**
- **/schedule**

[^1]: Удалить напоминание из списка (**/today** и **/tomorrow**)

---
**Исходя из разработанного функционала, считаю разработку MVP успешной.**