├── .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