Skip to content

Timur-SA/ScheduleBot

Repository files navigation

ScheduleBot

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


Установка

  1. Перейти в корень проекта:
...\Downloads> cd .\ScheduleBot\
  1. Активировать venv:
...\ScheduleBot> .\Scripts\Activate
  1. Установить зависимости:
(ScheduleBot) ...\ScheduleBot> pip install -r .\requirements.txt
  1. Указать токен:
#./=BOT=/config.py
from aiogram import Bot

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

Important

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

  1. Запуск:
(ScheduleBot) ...\ScheduleBot> python ".\=BOT=\main.py"
  1. Бот запущен!

Important

При стандартном токене, бот доступен по ссылке: https://t.me/SiriusUniversitySchedule_Bot (@SiriusUniversitySchedule_Bot)

Технические решения

Aiogram

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

JSON

Простота формата и его абсолютная универсальность повиляла на выбор именно этого типа данных для их хранения, записи и чтения.

Структура:

global.json:

{
	"2025-07-15":
	[
		{
			"time": "09:00",
			"name": "Доброе утро, Сириус!",
			"group": ".ALL"
		},
		{
			"time": "13:00",
			"name": "Вебинар",
			"group": ".ALL"
		}
	]
}

Note

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

{uid}.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

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

Footnotes

  1. Удалить напоминание из списка (/today и /tomorrow)

Releases

No releases published

Packages

 
 
 

Contributors