├── .gitignore ├── README.md ├── pom.xml ├── screenshots ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg └── 7.jpg └── src └── main ├── docker ├── Dockerfile ├── docker-compose.yml ├── variables-bot.env └── variables-spring.env ├── java └── ru │ └── booking │ └── bot │ ├── BookingBot2Application.java │ ├── bot │ ├── Bot.java │ ├── BotService.java │ ├── BotServiceImpl.java │ ├── Button.java │ ├── Runner.java │ └── UpdateUtil.java │ ├── command │ ├── Command.java │ ├── CommandContainer.java │ ├── CommandName.java │ ├── KeyboardMaker.java │ └── impl │ │ ├── AddObject.java │ │ ├── EditObject.java │ │ ├── MyBookings.java │ │ ├── NewBooking.java │ │ └── Start.java │ ├── models │ ├── Booking.java │ ├── BookingObject.java │ ├── Type.java │ └── User.java │ ├── repository │ ├── BookingObjectRepository.java │ ├── BookingRepository.java │ ├── TypeRepository.java │ └── UserRepository.java │ └── service │ ├── BookingObjectService.java │ ├── BookingService.java │ ├── TypeService.java │ └── UserService.java └── resources └── application.properties /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | /target 3 | /.idea/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Booking bot 2 | Телеграм бот для бронирования чего угодно: переговорки, инвентарь, слоты на запись к специалисту и тд. 3 | 4 | Java 17, Spring boot, PostgreSQL 5 | 6 | Реализованы две роли: 7 | 8 | - Пользователь – может забронировать что-то, посмотреть свои брони и отменить. 9 | 10 | - Администратор – функционал пользователя, плюс возможность добавлять, редактировать и удалять объекты для бронирования. 11 | 12 | Команды бота разделены по классам, реализующим общий интерфейс, так что можно легко добавлять новые пользовательские сценарии, не изменяя имеющиеся классы. 13 | 14 | #### Регистрация нового пользователя. Сохраняется в базу данных вместе с Telegram user id. 15 | 16 |
17 | 18 | #### Бронирование 19 | 20 |
21 | 22 | 23 | #### Добавление объекта в каталог и редактирование прав пользователя (доступно только администратору) 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 3.1.3 9 | 10 | 11 | ru.booking 12 | BookingBot 13 | 0.0.1-SNAPSHOT 14 | BookingBot 15 | BookingBot 16 | 17 | 17 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-data-jpa 23 | 24 | 25 | org.postgresql 26 | postgresql 27 | runtime 28 | 29 | 30 | org.projectlombok 31 | lombok 32 | true 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-test 37 | test 38 | 39 | 40 | org.telegram 41 | telegrambots-spring-boot-starter 42 | 5.4.0.1 43 | 44 | 45 | 46 | 47 | 48 | 49 | org.springframework.boot 50 | spring-boot-maven-plugin 51 | 52 | 53 | 54 | org.projectlombok 55 | lombok 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /screenshots/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/1.jpg -------------------------------------------------------------------------------- /screenshots/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/2.jpg -------------------------------------------------------------------------------- /screenshots/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/3.jpg -------------------------------------------------------------------------------- /screenshots/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/4.jpg -------------------------------------------------------------------------------- /screenshots/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/5.jpg -------------------------------------------------------------------------------- /screenshots/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/6.jpg -------------------------------------------------------------------------------- /screenshots/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/d25b2d15bacf57bd89651b65ac3f3a0f8a554bc3/screenshots/7.jpg -------------------------------------------------------------------------------- /src/main/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM amazoncorretto:17 2 | COPY ../../../target/BookingBot-0.0.1-SNAPSHOT.jar booking_bot.jar 3 | EXPOSE 8080 4 | ENTRYPOINT ["java", "-jar", "booking_bot.jar"] -------------------------------------------------------------------------------- /src/main/docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | app: 5 | build: . 6 | ports: 7 | - "8080:8080" 8 | depends_on: 9 | - db 10 | env_file: 11 | - variables-spring.env 12 | - variables-bot.env 13 | db: 14 | image: 'postgres:13.1-alpine' 15 | environment: 16 | - POSTGRES_USER=postgres 17 | - POSTGRES_PASSWORD=postgres 18 | - POSTGRES_DB=postgres 19 | ports: 20 | - "5432:5432" 21 | volumes: 22 | - postgres-data:/var/lib/postgresql/data 23 | 24 | volumes: 25 | postgres-data: -------------------------------------------------------------------------------- /src/main/docker/variables-bot.env: -------------------------------------------------------------------------------- 1 | BOT_USERNAME= 2 | BOT_TOKEN= 3 | 4 | BOT_ADMIN_USERNAME= 5 | BOT_DEFAULT_START_TIME=09.00 6 | BOT_DEFAULT_END_TIME=18.00 7 | BOT_IMAGES_DIR=images -------------------------------------------------------------------------------- /src/main/docker/variables-spring.env: -------------------------------------------------------------------------------- 1 | SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres 2 | SPRING_DATASOURCE_USERNAME=postgres 3 | SPRING_DATASOURCE_PASSWORD=postgres 4 | SPRING_JPA_HIBERNATE_DDL_AUTO=update 5 | SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQLDialect -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/BookingBot2Application.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class BookingBot2Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(BookingBot2Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/bot/Bot.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.bot; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.stereotype.Component; 6 | import org.telegram.telegrambots.bots.TelegramLongPollingBot; 7 | import org.telegram.telegrambots.meta.api.objects.Update; 8 | import ru.booking.bot.command.Command; 9 | import ru.booking.bot.command.CommandContainer; 10 | 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | @RequiredArgsConstructor 15 | @Component 16 | public class Bot extends TelegramLongPollingBot { 17 | 18 | @Value("${bot.username}") 19 | private String botUsername; 20 | 21 | @Value("${bot.token}") 22 | private String botToken; 23 | 24 | private final CommandContainer commandContainer; 25 | private final Map currentUserCommands = new HashMap<>(); 26 | 27 | @Override 28 | public void onUpdateReceived(Update update) { 29 | Long userId = UpdateUtil.getUserId(update); 30 | String input = UpdateUtil.getInput(update); 31 | 32 | boolean isFinished = false; 33 | if (commandContainer.hasCommand(input)) { // user starts new command 34 | Command command = commandContainer.getCommand(input); 35 | currentUserCommands.put(userId, command); 36 | isFinished = command.execute(update, true); 37 | } else if (currentUserCommands.containsKey(userId)) { // user continues some command 38 | isFinished = currentUserCommands.get(userId).execute(update, false); 39 | } 40 | 41 | if (isFinished) { 42 | currentUserCommands.remove(userId); 43 | } 44 | } 45 | 46 | @Override 47 | public String getBotUsername() { 48 | return botUsername; 49 | } 50 | 51 | @Override 52 | public String getBotToken() { 53 | return botToken; 54 | } 55 | } -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/bot/BotService.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.bot; 2 | 3 | import org.telegram.telegrambots.meta.api.methods.send.SendPhoto; 4 | import org.telegram.telegrambots.meta.api.objects.Update; 5 | import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboard; 6 | import org.telegram.telegrambots.meta.exceptions.TelegramApiException; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | public interface BotService { 12 | 13 | void sendText(Long chatId, String text); 14 | void sendWithKeyboard(Long chatId, String text, List