├── .gitignore ├── screenshots ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg └── 7.jpg ├── src └── main │ ├── docker │ ├── variables-bot.env │ ├── Dockerfile │ ├── variables-spring.env │ └── docker-compose.yml │ ├── java │ └── ru │ │ └── booking │ │ └── bot │ │ ├── repository │ │ ├── UserRepository.java │ │ ├── TypeRepository.java │ │ ├── BookingObjectRepository.java │ │ └── BookingRepository.java │ │ ├── bot │ │ ├── Button.java │ │ ├── UpdateUtil.java │ │ ├── BotService.java │ │ ├── Runner.java │ │ ├── Bot.java │ │ └── BotServiceImpl.java │ │ ├── command │ │ ├── Command.java │ │ ├── CommandName.java │ │ ├── CommandContainer.java │ │ ├── impl │ │ │ ├── Start.java │ │ │ ├── MyBookings.java │ │ │ ├── AddObject.java │ │ │ ├── EditObject.java │ │ │ └── NewBooking.java │ │ └── KeyboardMaker.java │ │ ├── models │ │ ├── Type.java │ │ ├── User.java │ │ ├── BookingObject.java │ │ └── Booking.java │ │ ├── BookingBot2Application.java │ │ └── service │ │ ├── TypeService.java │ │ ├── BookingObjectService.java │ │ ├── BookingService.java │ │ └── UserService.java │ └── resources │ └── application.properties ├── README.md └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | /target 3 | /.idea/ 4 | -------------------------------------------------------------------------------- /screenshots/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/1.jpg -------------------------------------------------------------------------------- /screenshots/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/2.jpg -------------------------------------------------------------------------------- /screenshots/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/3.jpg -------------------------------------------------------------------------------- /screenshots/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/4.jpg -------------------------------------------------------------------------------- /screenshots/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/5.jpg -------------------------------------------------------------------------------- /screenshots/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/6.jpg -------------------------------------------------------------------------------- /screenshots/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EtoMisha/Booking_bot/HEAD/screenshots/7.jpg -------------------------------------------------------------------------------- /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/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/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/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.repository; 2 | 3 | import org.springframework.data.repository.CrudRepository; 4 | import ru.booking.bot.models.User; 5 | 6 | public interface UserRepository extends CrudRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/bot/Button.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.bot; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Button { 7 | String label; 8 | String callBack; 9 | 10 | public Button(String callBack, String label) { 11 | this.callBack = callBack; 12 | this.label = label; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/command/Command.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.command; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.telegram.telegrambots.meta.api.objects.Update; 5 | 6 | public interface Command { 7 | boolean execute(Update update, boolean isBeginning); 8 | CommandName getName(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/models/Type.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.models; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.Data; 5 | 6 | @Data 7 | @Entity 8 | @Table(name = "types") 9 | public class Type { 10 | 11 | @Id 12 | @GeneratedValue(strategy = GenerationType.IDENTITY) 13 | private Long id; 14 | private String name; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/repository/TypeRepository.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.repository; 2 | 3 | import jakarta.annotation.Nonnull; 4 | import org.springframework.data.repository.CrudRepository; 5 | import ru.booking.bot.models.Type; 6 | 7 | import java.util.List; 8 | 9 | public interface TypeRepository extends CrudRepository { 10 | 11 | @Nonnull 12 | List findAll(); 13 | } 14 | -------------------------------------------------------------------------------- /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/repository/BookingObjectRepository.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.repository; 2 | 3 | import org.springframework.data.repository.CrudRepository; 4 | import ru.booking.bot.models.BookingObject; 5 | 6 | import java.util.List; 7 | 8 | public interface BookingObjectRepository extends CrudRepository { 9 | List findByTypeId(long id); 10 | List findByName(String name); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/models/User.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.models; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.Id; 5 | import jakarta.persistence.OneToMany; 6 | import jakarta.persistence.Table; 7 | import lombok.Data; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @Entity 13 | @Table(name = "users") 14 | public class User { 15 | 16 | @Id 17 | private Long id; 18 | private String username; 19 | private boolean isAdmin; 20 | 21 | @OneToMany 22 | private List bookings; 23 | } 24 | -------------------------------------------------------------------------------- /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/java/ru/booking/bot/bot/UpdateUtil.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.bot; 2 | 3 | import org.telegram.telegrambots.meta.api.objects.Update; 4 | 5 | public class UpdateUtil { 6 | public static long getUserId(Update update) { 7 | return update.hasCallbackQuery() 8 | ? update.getCallbackQuery().getMessage().getChatId() 9 | : update.getMessage().getChatId(); 10 | } 11 | 12 | public static String getInput(Update update) { 13 | return update.hasCallbackQuery() 14 | ? update.getCallbackQuery().getData() 15 | : update.getMessage().getText(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/command/CommandName.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.command; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import ru.booking.bot.command.impl.*; 6 | 7 | @RequiredArgsConstructor 8 | @Getter 9 | public enum CommandName { 10 | 11 | ADD_OBJECT("Добавить объект", AddObject.class), 12 | EDIT_OBJECT("Редактировать объект", EditObject.class), 13 | MY_BOOKINGS("Мои бронирования", MyBookings.class), 14 | NEW_BOOKING("Забронировать", NewBooking.class), 15 | START("/start", Start.class); 16 | 17 | private final String text; 18 | private final Class className; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/repository/BookingRepository.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.repository; 2 | 3 | import jakarta.annotation.Nonnull; 4 | import org.springframework.data.repository.CrudRepository; 5 | import ru.booking.bot.models.Booking; 6 | import ru.booking.bot.models.BookingObject; 7 | 8 | import java.time.LocalDateTime; 9 | import java.util.List; 10 | 11 | public interface BookingRepository extends CrudRepository { 12 | @Nonnull 13 | List findAll(); 14 | List findByTimeStartBetweenAndBookingObject(LocalDateTime fromTime, LocalDateTime toTime, BookingObject object); 15 | List findByUserId(long userId); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/ru/booking/bot/models/BookingObject.java: -------------------------------------------------------------------------------- 1 | package ru.booking.bot.models; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.Data; 5 | 6 | import java.time.LocalTime; 7 | 8 | @Data 9 | @Entity 10 | @Table(name = "booking_objects") 11 | public class BookingObject { 12 | 13 | @Id 14 | @GeneratedValue(strategy = GenerationType.IDENTITY) 15 | private Long id; 16 | private String name; 17 | private String description; 18 | private String image; 19 | private LocalTime availableFrom; 20 | private LocalTime availableTo; 21 | 22 | @ManyToOne 23 | private Type type; 24 | 25 | public String getFullText() { 26 | return name + (description == null ? "" : ("\n" + description)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /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