mikesafonov / operator-bot Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
Сейчас реализован процесс определения дежурного на один день. Это не во всех случаях удобно, т.к., например, нет возможности узнать когда пользователь будет дежурить следующий раз.
Поэтому предлагаю реализовать генерацию расписания дежурств на несколько дней. Процесс аналогичный существующему: запускается по крону процесс, берет количество дней которое необходимо сгенерировать и для каждого дня, начиная с текущего, запускает генерацию одного дня.
Параметр количества дней для генерации необходимо хранить в специальной таблице БД, чтобы можно было менять без перезапускать приложения.
На данный момент бот умеет только отвечать на сообщения пользователя. Необходимо реализовать возможность, чтобы бот мог отправлять сам сообщения пользователям.
Для этого необходимо отдельно создать бин DefaultAbsSender и использовать его для отправки сообщений.
Например, когда бот определил дежурного, он должен ему об этом сообщить.
Помимо непосредственного уведомления человека, что он сегодня дежурит, хотелось бы, чтобы бот слал такие уведомления в отдельный чат.
Так же хочется видеть команду по типу:
/who
Команда будет возвращать информацию по текущему дежурному, если в чате будет слишком сообщений и оповещение уйдёт далеко.
Необходимо нарисовать с помощью plantuml диаграмму активности для процесса определения дежурного.
Данный процесс будет запускаться по расписанию ежедневно и определять кто дежурный сегодня. Стоит сразу учесть, что определять необходимо среди пользователей, которые активные (см поле статус в табличке пользователей) (считаем что у пользователя может быть два статуса - активен и заблокирован).
Процесс должен быть таким, чтобы пользователи дежурили равномерно, не было дежурств подряд или через день.
Класс, который определяет дежурного (DefinitionServiceImpl), должен учитывать выходные дни (суббота и воскресенье). Для этих дней не нужно назначать дежурного.
Необходимо сконфигурировать чтобы в проекте было мутационное тестирование.
Сделать это можно с помощью gradle плагина - https://gradle-pitest-plugin.solidsoft.info/
Необходимо реализовать команду для получения дежурного. Например, /duty
.
При получении данной команды бот должен:
Необходимо разработать некий абстрактный механизм обработки различных команд, которые присылаются боту.
Каждая команда характеризуется следующим набором характеристик:
/who
./who
доступна всем внутренним пользователям независимо администратор это или нет, а команда /help
доступна любым пользователям, в том числе и не авторизированным)/who
бот должен найти пользователя, который дежурит и прислать сообщение с его ФИО пользователю).Соответственно, т.к. мы знаем какие команды поддерживает наш бот, то должны хранить некий реестр команд.
При получении текстового сообщения, необходимо определить какая команда пришла (предлагаю этот процесс сразу вынести в отдельный класс), далее проверить есть ли у пользователя соответствующие полномочия для выполнения данной команды и, если проверка успешна, выполнить команду.
Необходимо написать unit тест для сервиса авторизации, написанного ранее.
Для написания unit тестов необходимо использовать библиотеку junit.
Предлагаю выделить в отдельный класс процесс проверки авторизации в боте. Данный класс должен возвращать некий объект у которого будут методы:
Если пользователь не известен, то метод авторизации должен бросать некоторое исключение.
Код самого бота необходимо адаптировать под использование данного класса.
Ежедневно в некоторое время должен запускаться процесс определения дежурного. Диаграмма этого процесса была нарисована ранее.
Также необходимо новый код покрыть unit тестами.
Необходимо добавить две таблицы в БД в которых будут храниться:
Эти дни необходимо учитывать в процесс определения дежурного. Соответственно, если день в списке выходных, то для него дежурный не назначается, а если день рабочий, то назначается.
Кроме этого, необходимо реализовать HTTP API для управления этими справочниками (добавить, удалить, получить с учетом постраничного вывода (Pageable))
Необходимо сделать в конфигурационном файле свойство с массивом chatId пользователей-администраторов. Для них в будущем буду доступны дополнительные команды.
Обработку сообщения бота необходимо изменить так, чтобы с администратором бот здоровался иначе чем с обычным пользователем.
После выполнения #1 необходимо написать SQL миграции для создания структуры БД.
Для миграций предлагаю использовать Flywaydb, Flywaydb + Spring Boot
Необходимо выбрать (на своё усмотрение) библиотеку для логирования и настроить её так, чтобы:
Дальше необходимо по существующему коду добавить логирование ошибок (в error), информации для дебага (например, какой пользователь был назначен дежурным и так далее)
Необходимо нарисовать диаграмму структуры данных для будущего бота.
Нам необходимо хранить следующую информацию:
Воспользоваться предлагаю dbdiagram.io. В репозиторий в папку docs/db
можно будет приложить код диаграммы.
Необходимо создать телеграм бота, который на первоначальном этапе будет возвращать присланное ему сообщение (эхо-бот). Для этого нужно:
Необходимо создать сущности и репозитории для работы с теми таблицами БД, которые были спроектированы и созданы в миграциях ранее.
После этого необходимо модифицировать существующего бота так, чтобы при получении сообщения он проверял пришел запрос от известного пользователя или нет. Если пользователь ему не известен, то бот должен отвечать некоторым сообщением. Например, "Я тебя не знаю, брысь!".
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.