From 8bd24a31e601f5e8298a07c8cb440bc08fa7b393 Mon Sep 17 00:00:00 2001
From: oleksandrpetrov <petrov.oleksandr35@gmail.com>
Date: Mon, 21 Mar 2022 15:21:49 +0100
Subject: [PATCH 1/5] Telegram api dependencies add

---
 api/build.gradle                                   | 14 ++++++++++++--
 .../sp/bot_builder/base_bot/BaseTelegramBot.java   |  6 ++++++
 settings.gradle                                    |  1 -
 3 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java

diff --git a/api/build.gradle b/api/build.gradle
index bad823a..ccf35dc 100644
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -8,6 +8,9 @@ repositories {
     mavenCentral()
 }
 
+def telegram_version = '5.7.1'
+def junit_version = '5.8.2'
+
 dependencies {
     implementation 'org.mongodb:mongodb-driver-sync:4.4.1'
     implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
@@ -19,12 +22,19 @@ dependencies {
     implementation 'org.hibernate:hibernate-core:5.6.5.Final'
     implementation 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'
     implementation 'org.springframework.data:spring-data-mongodb:3.3.1'
+
+    // Telegram api
+    implementation "org.telegram:telegrambots:$telegram_version"
+    implementation "org.telegram:telegrambotsextensions:$telegram_version"
+
+    // Test spring dependencies
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
     testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo'
     testImplementation 'org.springframework.security:spring-security-test'
 
-    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
-    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
+    // Junit tests
+    testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_version"
+    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit_version"
 }
 
 test {
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
new file mode 100644
index 0000000..17648bf
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
@@ -0,0 +1,6 @@
+package cz.cvut.fit.sp.bot_builder.base_bot;
+
+import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot;
+
+public class BaseTelegramBot extends TelegramLongPollingCommandBot {
+}
diff --git a/settings.gradle b/settings.gradle
index 3a06b4c..513851e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,4 +1,3 @@
 rootProject.name = 'bot_builder'
 include 'base', 'api', 'authentication'
-include 'authentication'
 
-- 
GitLab


From 51224ba6301e485c292d531be776ea2aaa7337f3 Mon Sep 17 00:00:00 2001
From: oleksandrpetrov <petrov.oleksandr35@gmail.com>
Date: Mon, 21 Mar 2022 15:26:18 +0100
Subject: [PATCH 2/5] Add Lombok and log4j dependencies

---
 api/build.gradle                                  |  8 ++++++++
 .../sp/bot_builder/base_bot/BaseTelegramBot.java  | 15 +++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/api/build.gradle b/api/build.gradle
index ccf35dc..0cc3475 100644
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -10,6 +10,8 @@ repositories {
 
 def telegram_version = '5.7.1'
 def junit_version = '5.8.2'
+def lombok_version = '1.18.22'
+def log4j_version = '1.2.17'
 
 dependencies {
     implementation 'org.mongodb:mongodb-driver-sync:4.4.1'
@@ -27,6 +29,12 @@ dependencies {
     implementation "org.telegram:telegrambots:$telegram_version"
     implementation "org.telegram:telegrambotsextensions:$telegram_version"
 
+    // Lombok
+    implementation "org.projectlombok:lombok:$lombok_version"
+
+    // Logger log4j
+    implementation "log4j:log4j:$log4j_version"
+
     // Test spring dependencies
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
     testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo'
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
index 17648bf..28f9053 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
@@ -1,6 +1,21 @@
 package cz.cvut.fit.sp.bot_builder.base_bot;
 
 import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot;
+import org.telegram.telegrambots.meta.api.objects.Update;
 
 public class BaseTelegramBot extends TelegramLongPollingCommandBot {
+    @Override
+    public String getBotUsername() {
+        return null;
+    }
+
+    @Override
+    public void processNonCommandUpdate(Update update) {
+
+    }
+
+    @Override
+    public String getBotToken() {
+        return null;
+    }
 }
-- 
GitLab


From 76d64e76f216c0b515ab193f85c297056e72b716 Mon Sep 17 00:00:00 2001
From: oleksandrpetrov <petrov.oleksandr35@gmail.com>
Date: Tue, 22 Mar 2022 00:56:48 +0100
Subject: [PATCH 3/5] Base telegram bot classes implementation

---
 api/build.gradle                              |  2 +-
 .../bot_builder/base_bot/BaseTelegramBot.java | 37 ++++++++++++++++--
 .../base_bot/BaseTextBotHandler.java          | 39 +++++++++++++++++++
 .../base_bot/BaseTextHandlerInterface.java    | 21 ++++++++++
 .../base_bot/ChatBotTextAnswer.java           | 27 +++++++++++++
 .../sp/bot_builder/base_bot/UserRequest.java  | 12 ++++++
 6 files changed, 134 insertions(+), 4 deletions(-)
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java

diff --git a/api/build.gradle b/api/build.gradle
index 0cc3475..25a2f54 100644
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -10,7 +10,7 @@ repositories {
 
 def telegram_version = '5.7.1'
 def junit_version = '5.8.2'
-def lombok_version = '1.18.22'
+def lombok_version = '1.18.10'
 def log4j_version = '1.2.17'
 
 dependencies {
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
index 28f9053..04217f6 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
@@ -1,21 +1,52 @@
 package cz.cvut.fit.sp.bot_builder.base_bot;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot;
 import org.telegram.telegrambots.meta.api.objects.Update;
 
+import java.util.List;
+import java.util.logging.Logger;
+
+@AllArgsConstructor
+@NoArgsConstructor
 public class BaseTelegramBot extends TelegramLongPollingCommandBot {
+
+    private static final Logger logger = Logger.getLogger(BaseTelegramBot.class.toString());
+
+
+
+    @Getter
+    @Setter
+    private String username;
+    @Getter
+    @Setter
+    private String token;
+
     @Override
     public String getBotUsername() {
-        return null;
+        return username;
     }
 
     @Override
     public void processNonCommandUpdate(Update update) {
-
+        // Todo implement command update....
     }
 
     @Override
     public String getBotToken() {
-        return null;
+        return token;
+    }
+
+    @Override
+    public void onRegister() {
+        super.onRegister();
+    }
+
+    @Override
+    public void onUpdatesReceived(List<Update> updates) {
+        super.onUpdatesReceived(updates);
     }
 }
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java
new file mode 100644
index 0000000..a89bc44
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java
@@ -0,0 +1,39 @@
+package cz.cvut.fit.sp.bot_builder.base_bot;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
+import org.telegram.telegrambots.meta.api.objects.Message;
+
+import java.util.List;
+import java.util.Optional;
+
+@AllArgsConstructor
+@NoArgsConstructor
+public abstract class BaseTextBotHandler implements BaseTextHandlerInterface {
+
+    @Getter
+    @Setter
+    private List<UserRequest> botCommands;
+
+    @Override
+    public Optional<SendMessage> executeRequest(Long chatId, String username, Message message) {
+        // Try to find user request in available requests list
+        Optional<UserRequest> request = botCommands.stream().filter(
+                (req) -> req.equals(new UserRequest(message.getText()))).findFirst();
+        if (request.isEmpty()) {
+            // Request not found...
+            return Optional.empty();
+        }
+
+        return produceAnswer(request.get());
+    }
+
+    @Override
+    public Optional<SendMessage> produceAnswer(UserRequest request) {
+        // Todo implement produce answer method...
+        return Optional.empty();
+    }
+}
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java
new file mode 100644
index 0000000..16bd26a
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java
@@ -0,0 +1,21 @@
+package cz.cvut.fit.sp.bot_builder.base_bot;
+
+import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
+import org.telegram.telegrambots.meta.api.objects.Message;
+
+import java.util.Optional;
+
+public interface BaseTextHandlerInterface {
+    /**
+     * Identify user response and execute its command
+     * @param chatId - current active telegram chatId to response
+     * @param username - username of sender
+     * @param message - sender's request
+     */
+    Optional<SendMessage> executeRequest(Long chatId, String username, Message message);
+
+    /**
+     * Produce answer for user command
+     */
+    Optional<SendMessage> produceAnswer(UserRequest request);
+}
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java
new file mode 100644
index 0000000..de660ba
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java
@@ -0,0 +1,27 @@
+package cz.cvut.fit.sp.bot_builder.base_bot;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
+
+@AllArgsConstructor
+public class ChatBotTextAnswer {
+    @Getter
+    @Setter
+    private String chatId;
+    @Getter
+    @Setter
+    private String username;
+    @Getter
+    @Setter
+    private String answer;
+
+    public SendMessage convertToMessage() {
+        SendMessage msg = new SendMessage();
+        msg.setChatId(chatId);
+        msg.setText(answer);
+        return msg;
+    }
+
+}
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java
new file mode 100644
index 0000000..bcc8778
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java
@@ -0,0 +1,12 @@
+package cz.cvut.fit.sp.bot_builder.base_bot;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@AllArgsConstructor
+public class UserRequest {
+    @Getter
+    @Setter
+    private String textRequest;
+}
-- 
GitLab


From 02423f7dd6ad1266519c2b8ad4e1f282d6d74f13 Mon Sep 17 00:00:00 2001
From: oleksandrpetrov <petrov.oleksandr35@gmail.com>
Date: Tue, 22 Mar 2022 01:03:47 +0100
Subject: [PATCH 4/5] Move tg base bot package

---
 base/build.gradle                                 | 15 +++++++++++++++
 .../base}/base_bot/BaseTelegramBot.java           |  4 +---
 .../base}/base_bot/BaseTextBotHandler.java        |  2 +-
 .../base}/base_bot/BaseTextHandlerInterface.java  |  2 +-
 .../base}/base_bot/ChatBotTextAnswer.java         |  2 +-
 .../bot_builder/base}/base_bot/UserRequest.java   |  2 +-
 6 files changed, 20 insertions(+), 7 deletions(-)
 rename {api/src/main/java/cz/cvut/fit/sp/bot_builder => base/src/main/java/cz/cvut/fit/base/bot_builder/base}/base_bot/BaseTelegramBot.java (95%)
 rename {api/src/main/java/cz/cvut/fit/sp/bot_builder => base/src/main/java/cz/cvut/fit/base/bot_builder/base}/base_bot/BaseTextBotHandler.java (95%)
 rename {api/src/main/java/cz/cvut/fit/sp/bot_builder => base/src/main/java/cz/cvut/fit/base/bot_builder/base}/base_bot/BaseTextHandlerInterface.java (92%)
 rename {api/src/main/java/cz/cvut/fit/sp/bot_builder => base/src/main/java/cz/cvut/fit/base/bot_builder/base}/base_bot/ChatBotTextAnswer.java (91%)
 rename {api/src/main/java/cz/cvut/fit/sp/bot_builder => base/src/main/java/cz/cvut/fit/base/bot_builder/base}/base_bot/UserRequest.java (78%)

diff --git a/base/build.gradle b/base/build.gradle
index df216b0..3753ad4 100644
--- a/base/build.gradle
+++ b/base/build.gradle
@@ -6,10 +6,25 @@ repositories {
     mavenCentral()
 }
 
+def telegram_version = '5.7.1'
+def lombok_version = '1.18.10'
+def log4j_version = '1.2.17'
+
 dependencies {
     implementation 'org.hibernate:hibernate-core:5.6.5.Final'
     implementation 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'
     implementation 'org.springframework.data:spring-data-mongodb:3.3.1'
+
+    // Telegram api
+    implementation "org.telegram:telegrambots:$telegram_version"
+    implementation "org.telegram:telegrambotsextensions:$telegram_version"
+
+    // Lombok
+    implementation "org.projectlombok:lombok:$lombok_version"
+
+    // Logger log4j
+    implementation "log4j:log4j:$log4j_version"
+
     testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
     testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
 }
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java
similarity index 95%
rename from api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
rename to base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java
index 04217f6..ad69496 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTelegramBot.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java
@@ -1,4 +1,4 @@
-package cz.cvut.fit.sp.bot_builder.base_bot;
+package cz.cvut.fit.base.bot_builder.base.base_bot;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -16,8 +16,6 @@ public class BaseTelegramBot extends TelegramLongPollingCommandBot {
 
     private static final Logger logger = Logger.getLogger(BaseTelegramBot.class.toString());
 
-
-
     @Getter
     @Setter
     private String username;
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java
similarity index 95%
rename from api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java
rename to base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java
index a89bc44..efa7261 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextBotHandler.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java
@@ -1,4 +1,4 @@
-package cz.cvut.fit.sp.bot_builder.base_bot;
+package cz.cvut.fit.base.bot_builder.base.base_bot;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java
similarity index 92%
rename from api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java
rename to base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java
index 16bd26a..3b13ed5 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/BaseTextHandlerInterface.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java
@@ -1,4 +1,4 @@
-package cz.cvut.fit.sp.bot_builder.base_bot;
+package cz.cvut.fit.base.bot_builder.base.base_bot;
 
 import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
 import org.telegram.telegrambots.meta.api.objects.Message;
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java
similarity index 91%
rename from api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java
rename to base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java
index de660ba..6c2fff2 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/ChatBotTextAnswer.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java
@@ -1,4 +1,4 @@
-package cz.cvut.fit.sp.bot_builder.base_bot;
+package cz.cvut.fit.base.bot_builder.base.base_bot;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java
similarity index 78%
rename from api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java
rename to base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java
index bcc8778..bd4229f 100644
--- a/api/src/main/java/cz/cvut/fit/sp/bot_builder/base_bot/UserRequest.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java
@@ -1,4 +1,4 @@
-package cz.cvut.fit.sp.bot_builder.base_bot;
+package cz.cvut.fit.base.bot_builder.base.base_bot;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
-- 
GitLab


From 44816b18086264c6959d5ee15963e7af5b462662 Mon Sep 17 00:00:00 2001
From: oleksandrpetrov <petrov.oleksandr35@gmail.com>
Date: Thu, 24 Mar 2022 00:13:38 +0100
Subject: [PATCH 5/5] Base TelegramTextBot implementation

---
 api/build.gradle                              |  4 +-
 .../text_bot/BaseTextBotHandler.java          | 44 +++++++++++++++
 .../bot_builder/text_bot/TelegramTextBot.java | 54 +++++++++++++++++++
 .../bot_builder/text_bot/TextBotFactory.java  | 25 +++++++++
 .../base/base_bot/BaseBotFactory.java         |  7 +++
 .../base/base_bot/BaseTelegramBot.java        | 32 ++++++-----
 .../base/base_bot/BaseTextBotHandler.java     | 39 --------------
 .../base_bot/BaseTextHandlerInterface.java    |  8 +--
 .../bot_builder/base/base_bot/BotType.java    |  5 ++
 .../base/base_bot/ChatBotTextAnswer.java      | 20 +++----
 .../base/base_bot/UserRequest.java            | 11 ++--
 11 files changed, 169 insertions(+), 80 deletions(-)
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/BaseTextBotHandler.java
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TelegramTextBot.java
 create mode 100644 api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TextBotFactory.java
 create mode 100644 base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseBotFactory.java
 delete mode 100644 base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java
 create mode 100644 base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BotType.java

diff --git a/api/build.gradle b/api/build.gradle
index 25a2f54..4ed4fc3 100644
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -10,10 +10,11 @@ repositories {
 
 def telegram_version = '5.7.1'
 def junit_version = '5.8.2'
-def lombok_version = '1.18.10'
+def lombok_version = '1.18.22'
 def log4j_version = '1.2.17'
 
 dependencies {
+    implementation project(":base")
     implementation 'org.mongodb:mongodb-driver-sync:4.4.1'
     implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
     implementation 'org.springframework.boot:spring-boot-starter-data-rest'
@@ -31,6 +32,7 @@ dependencies {
 
     // Lombok
     implementation "org.projectlombok:lombok:$lombok_version"
+    annotationProcessor "org.projectlombok:lombok:$lombok_version"
 
     // Logger log4j
     implementation "log4j:log4j:$log4j_version"
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/BaseTextBotHandler.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/BaseTextBotHandler.java
new file mode 100644
index 0000000..f8c8b0f
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/BaseTextBotHandler.java
@@ -0,0 +1,44 @@
+package cz.cvut.fit.sp.bot_builder.text_bot;
+
+import cz.cvut.fit.base.bot_builder.base.base_bot.BaseTextHandlerInterface;
+import cz.cvut.fit.base.bot_builder.base.base_bot.ChatBotTextAnswer;
+import cz.cvut.fit.base.bot_builder.base.base_bot.UserRequest;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
+import org.telegram.telegrambots.meta.api.objects.Message;
+
+import java.util.Map;
+import java.util.Optional;
+
+@Getter
+@Setter
+@RequiredArgsConstructor
+public class BaseTextBotHandler implements BaseTextHandlerInterface {
+
+    @NonNull
+    private Map<UserRequest, ChatBotTextAnswer> botCommands;
+
+    @Override
+    public Optional<SendMessage> executeRequest(String chatId, String username, Message message) {
+        // Try to find user request in available requests list
+        Optional<Map.Entry<UserRequest, ChatBotTextAnswer>> request
+                = botCommands
+                .entrySet()
+                .stream()
+                .filter((req) -> req.getKey().equals(new UserRequest(message.getText()))).findFirst();
+        if (request.isEmpty()) {
+            // Request not found...
+            return Optional.empty();
+        }
+
+        return produceAnswer(request.get(), chatId);
+    }
+
+    @Override
+    public Optional<SendMessage> produceAnswer(Map.Entry<UserRequest, ChatBotTextAnswer> requestOptional, String chatId) {
+        return Optional.ofNullable(requestOptional.getValue().convertToMessage(chatId));
+    }
+}
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TelegramTextBot.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TelegramTextBot.java
new file mode 100644
index 0000000..80ef185
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TelegramTextBot.java
@@ -0,0 +1,54 @@
+package cz.cvut.fit.sp.bot_builder.text_bot;
+
+import cz.cvut.fit.base.bot_builder.base.base_bot.BaseTelegramBot;
+import cz.cvut.fit.base.bot_builder.base.base_bot.ChatBotTextAnswer;
+import cz.cvut.fit.base.bot_builder.base.base_bot.UserRequest;
+import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
+import org.telegram.telegrambots.meta.api.objects.Message;
+import org.telegram.telegrambots.meta.api.objects.Update;
+import org.telegram.telegrambots.meta.api.objects.User;
+import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TelegramTextBot extends BaseTelegramBot {
+
+    private final BaseTextBotHandler textBotHandler;
+
+    public TelegramTextBot(Map<UserRequest, ChatBotTextAnswer> commands, String botName, String token) {
+        super(botName, token);
+        this.textBotHandler = new BaseTextBotHandler(commands);
+    }
+
+    public TelegramTextBot(String botName, String token) {
+        super(botName, token);
+        this.textBotHandler = new BaseTextBotHandler(new HashMap<>());
+    }
+
+    @Override
+    public void processNonCommandUpdate(Update update) {
+        Message message = update.getMessage();
+
+        SendMessage answer = textBotHandler
+                .executeRequest(message.getChatId().toString()
+                        , getUsername(message), message)
+                .orElse(new SendMessage());
+
+        try {
+            execute(answer);
+        } catch (TelegramApiException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private String getUsername(Message message) {
+        User user = message.getFrom();
+        String username = user.getUserName();
+        if (username == null) {
+            return defaultUsername;
+        }
+        return username;
+    }
+}
diff --git a/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TextBotFactory.java b/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TextBotFactory.java
new file mode 100644
index 0000000..149e084
--- /dev/null
+++ b/api/src/main/java/cz/cvut/fit/sp/bot_builder/text_bot/TextBotFactory.java
@@ -0,0 +1,25 @@
+package cz.cvut.fit.sp.bot_builder.text_bot;
+
+import cz.cvut.fit.base.bot_builder.base.base_bot.BaseBotFactory;
+import cz.cvut.fit.base.bot_builder.base.base_bot.BotType;
+import cz.cvut.fit.base.bot_builder.base.base_bot.ChatBotTextAnswer;
+import cz.cvut.fit.base.bot_builder.base.base_bot.UserRequest;
+import lombok.AllArgsConstructor;
+import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot;
+
+import java.util.Map;
+
+@AllArgsConstructor
+public class TextBotFactory implements BaseBotFactory<TelegramLongPollingCommandBot> {
+
+    private Map<UserRequest, ChatBotTextAnswer> userCommands;
+
+    public TelegramLongPollingCommandBot getBot(BotType type, String botName, String token) {
+        switch (type) {
+            case TEXT_BOT:
+                return new TelegramTextBot(userCommands, botName, token);
+            default:
+                throw new IllegalStateException("Such bot type is not acceptable%s".formatted(type));
+        }
+    }
+}
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseBotFactory.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseBotFactory.java
new file mode 100644
index 0000000..f059286
--- /dev/null
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseBotFactory.java
@@ -0,0 +1,7 @@
+package cz.cvut.fit.base.bot_builder.base.base_bot;
+
+import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot;
+
+public interface BaseBotFactory<T extends TelegramLongPollingCommandBot> {
+    T getBot(BotType type, String botName, String token);
+}
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java
index ad69496..62882da 100644
--- a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTelegramBot.java
@@ -1,8 +1,6 @@
 package cz.cvut.fit.base.bot_builder.base.base_bot;
 
-import lombok.AllArgsConstructor;
 import lombok.Getter;
-import lombok.NoArgsConstructor;
 import lombok.Setter;
 import org.telegram.telegrambots.extensions.bots.commandbot.TelegramLongPollingCommandBot;
 import org.telegram.telegrambots.meta.api.objects.Update;
@@ -10,29 +8,29 @@ import org.telegram.telegrambots.meta.api.objects.Update;
 import java.util.List;
 import java.util.logging.Logger;
 
-@AllArgsConstructor
-@NoArgsConstructor
-public class BaseTelegramBot extends TelegramLongPollingCommandBot {
 
-    private static final Logger logger = Logger.getLogger(BaseTelegramBot.class.toString());
+@Getter
+@Setter
+public abstract class BaseTelegramBot extends TelegramLongPollingCommandBot {
 
-    @Getter
-    @Setter
-    private String username;
-    @Getter
-    @Setter
-    private String token;
+    protected static final Logger logger = Logger.getLogger(BaseTelegramBot.class.toString());
 
-    @Override
-    public String getBotUsername() {
-        return username;
+    protected static final String defaultUsername = "Unknown";
+
+    private final String botName;
+    private final String token;
+
+    protected BaseTelegramBot(String botName, String token) {
+        this.botName = botName;
+        this.token = token;
     }
 
     @Override
-    public void processNonCommandUpdate(Update update) {
-        // Todo implement command update....
+    public String getBotUsername() {
+        return botName;
     }
 
+
     @Override
     public String getBotToken() {
         return token;
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java
deleted file mode 100644
index efa7261..0000000
--- a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextBotHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package cz.cvut.fit.base.bot_builder.base.base_bot;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
-import org.telegram.telegrambots.meta.api.objects.Message;
-
-import java.util.List;
-import java.util.Optional;
-
-@AllArgsConstructor
-@NoArgsConstructor
-public abstract class BaseTextBotHandler implements BaseTextHandlerInterface {
-
-    @Getter
-    @Setter
-    private List<UserRequest> botCommands;
-
-    @Override
-    public Optional<SendMessage> executeRequest(Long chatId, String username, Message message) {
-        // Try to find user request in available requests list
-        Optional<UserRequest> request = botCommands.stream().filter(
-                (req) -> req.equals(new UserRequest(message.getText()))).findFirst();
-        if (request.isEmpty()) {
-            // Request not found...
-            return Optional.empty();
-        }
-
-        return produceAnswer(request.get());
-    }
-
-    @Override
-    public Optional<SendMessage> produceAnswer(UserRequest request) {
-        // Todo implement produce answer method...
-        return Optional.empty();
-    }
-}
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java
index 3b13ed5..3d13301 100644
--- a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BaseTextHandlerInterface.java
@@ -3,19 +3,19 @@ package cz.cvut.fit.base.bot_builder.base.base_bot;
 import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
 import org.telegram.telegrambots.meta.api.objects.Message;
 
+import java.util.Map;
 import java.util.Optional;
 
 public interface BaseTextHandlerInterface {
     /**
      * Identify user response and execute its command
-     * @param chatId - current active telegram chatId to response
-     * @param username - username of sender
+     *
      * @param message - sender's request
      */
-    Optional<SendMessage> executeRequest(Long chatId, String username, Message message);
+    Optional<SendMessage> executeRequest(String chatId, String username, Message message);
 
     /**
      * Produce answer for user command
      */
-    Optional<SendMessage> produceAnswer(UserRequest request);
+    Optional<SendMessage> produceAnswer(Map.Entry<UserRequest, ChatBotTextAnswer> requestOptional, String chatId);
 }
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BotType.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BotType.java
new file mode 100644
index 0000000..fb8418f
--- /dev/null
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/BotType.java
@@ -0,0 +1,5 @@
+package cz.cvut.fit.base.bot_builder.base.base_bot;
+
+public enum BotType {
+    TEXT_BOT
+}
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java
index 6c2fff2..0dc8b5c 100644
--- a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/ChatBotTextAnswer.java
@@ -1,23 +1,17 @@
 package cz.cvut.fit.base.bot_builder.base.base_bot;
 
-import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
 
-@AllArgsConstructor
-public class ChatBotTextAnswer {
-    @Getter
-    @Setter
-    private String chatId;
-    @Getter
-    @Setter
-    private String username;
-    @Getter
-    @Setter
-    private String answer;
+import javax.validation.constraints.NotNull;
 
-    public SendMessage convertToMessage() {
+@Getter
+@Setter
+@RequiredArgsConstructor
+public record ChatBotTextAnswer(@NotNull String answer) {
+    public SendMessage convertToMessage(@NotNull String chatId) {
         SendMessage msg = new SendMessage();
         msg.setChatId(chatId);
         msg.setText(answer);
diff --git a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java
index bd4229f..e0923e7 100644
--- a/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java
+++ b/base/src/main/java/cz/cvut/fit/base/bot_builder/base/base_bot/UserRequest.java
@@ -1,12 +1,11 @@
 package cz.cvut.fit.base.bot_builder.base.base_bot;
 
-import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 
-@AllArgsConstructor
-public class UserRequest {
-    @Getter
-    @Setter
-    private String textRequest;
+@Getter
+@Setter
+@RequiredArgsConstructor
+public record UserRequest(String textRequest) {
 }
-- 
GitLab