From 721d234ec189a0666fb1175be0156c0fb07f7b67 Mon Sep 17 00:00:00 2001 From: Marchenko Dmitriy Date: Sun, 26 Oct 2025 18:54:50 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5,=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=83=D1=8F=D0=B7?= =?UTF-8?q?=D0=B2=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 143 ++++++++++++++++++++++++- src/main/java/ru/urfu/Application.java | 4 +- src/main/java/ru/urfu/Bot.java | 19 ++++ src/main/java/ru/urfu/DiscordBot.java | 14 ++- src/main/java/ru/urfu/Handler.java | 20 ++++ src/main/java/ru/urfu/MarkHandler.java | 20 ++++ src/main/java/ru/urfu/TelegramBot.java | 14 ++- src/test/java/MarkHandlerTest.java | 35 ++++++ 8 files changed, 258 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ru/urfu/Bot.java create mode 100644 src/main/java/ru/urfu/Handler.java create mode 100644 src/main/java/ru/urfu/MarkHandler.java create mode 100644 src/test/java/MarkHandlerTest.java diff --git a/pom.xml b/pom.xml index 570a9b0..af272a6 100644 --- a/pom.xml +++ b/pom.xml @@ -15,20 +15,31 @@ 6.9.7.1 3.2.9 + 6.0.0 + + 3.19.0 + 4.1.128.Final + 1.19.0 + 4.33.0 - org.telegram telegrambots - com.discord4j discord4j-core + + + org.junit.jupiter + junit-jupiter + test + + @@ -45,7 +56,133 @@ ${discord4j.version} + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + io.netty + netty-transport + ${netty.version} + + + + io.netty + netty-transport-classes-epoll + ${netty.version} + + + + io.netty + netty-transport-native-unix-common + ${netty.version} + + + + io.netty + netty-transport-native-epoll + ${netty.version} + linux-x86_64 + + + + io.netty + netty-codec + ${netty.version} + + + + io.netty + netty-buffer + ${netty.version} + + + + io.netty + netty-common + ${netty.version} + + + + io.netty + netty-handler + ${netty.version} + + + + io.netty + netty-resolver + ${netty.version} + + + + io.netty + netty-codec-dns + ${netty.version} + + + + io.netty + netty-codec-http + ${netty.version} + + + + io.netty + netty-codec-http2 + ${netty.version} + + + + io.netty + netty-codec-socks + ${netty.version} + + + + io.netty + netty-resolver-dns + ${netty.version} + + + + io.netty + netty-handler-proxy + ${netty.version} + + + + io.netty + netty-resolver-dns-classes-macos + ${netty.version} + + + + io.netty + netty-resolver-dns-native-macos + ${netty.version} + osx-x86_64 + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + - \ No newline at end of file diff --git a/src/main/java/ru/urfu/Application.java b/src/main/java/ru/urfu/Application.java index 0e9049b..b805659 100644 --- a/src/main/java/ru/urfu/Application.java +++ b/src/main/java/ru/urfu/Application.java @@ -8,11 +8,11 @@ public class Application { public static void main(String[] args) { String telegramBotName = System.getenv("telegram_botName"); String telegramToken = System.getenv("telegram_token"); - new TelegramBot(telegramBotName, telegramToken) + new TelegramBot(telegramBotName, telegramToken, new MarkHandler()) .start(); String discordToken = System.getenv("discord_token"); - new DiscordBot(discordToken) + new DiscordBot(discordToken, new MarkHandler()) .start(); /* diff --git a/src/main/java/ru/urfu/Bot.java b/src/main/java/ru/urfu/Bot.java new file mode 100644 index 0000000..ac4f745 --- /dev/null +++ b/src/main/java/ru/urfu/Bot.java @@ -0,0 +1,19 @@ +package ru.urfu; + +/** + * Интерфейс бота + *
+ * Каждый бот должен реализовывать этот интерфейс. + * Бот должен уметь запускаться. + * В дальнейшем сюда можно добавить методы для остановки, + * получения состояния работы, а также имени бота и т.д. + * @see TelegramBot + * @see DiscordBot + * + */ +public interface Bot { + /** + * Запустить бота + */ + void start(); +} diff --git a/src/main/java/ru/urfu/DiscordBot.java b/src/main/java/ru/urfu/DiscordBot.java index b7eccf5..206db3a 100644 --- a/src/main/java/ru/urfu/DiscordBot.java +++ b/src/main/java/ru/urfu/DiscordBot.java @@ -10,19 +10,23 @@ /** * Дискорд бот */ -public class DiscordBot { +public class DiscordBot implements Bot{ private final String token; private GatewayDiscordClient client; - public DiscordBot(String token) { + private final Handler handler; + + public DiscordBot(String token, Handler handler) { this.token = token; + this.handler = handler; } /** * Запустить Дискорд бота */ + @Override public void start() { client = DiscordClient.create(token).login().block(); if (client == null) { @@ -40,7 +44,11 @@ public void start() { if (isUser) { String chatId = eventMessage.getChannelId().asString(); String messageFromUser = eventMessage.getContent(); - // TODO обработайте сообщение от пользователя (messageFromUser) + String reply = handler.handle(messageFromUser); + + if (reply != null && !reply.isEmpty()) { + sendMessage(chatId, reply); + } } }); System.out.println("Discord бот запущен"); diff --git a/src/main/java/ru/urfu/Handler.java b/src/main/java/ru/urfu/Handler.java new file mode 100644 index 0000000..dacc220 --- /dev/null +++ b/src/main/java/ru/urfu/Handler.java @@ -0,0 +1,20 @@ +package ru.urfu; + +/** + * Базовый интерфейс для обработчиков сообщений от пользователей + *
+ * Благодаря этому интерфейсу + * можно реализовать несколько разных обработчиков + * и использовать их в разных ботах, а также менять обработчики, + * не меняя код ботов. + * @see TelegramBot + * @see DiscordBot + */ +public interface Handler { + /** + * Обработать сообщение от пользователя + * @param messageFromUser сообщение от пользователя + * @return ответ бота пользователю + */ + String handle(String messageFromUser); +} diff --git a/src/main/java/ru/urfu/MarkHandler.java b/src/main/java/ru/urfu/MarkHandler.java new file mode 100644 index 0000000..84d5518 --- /dev/null +++ b/src/main/java/ru/urfu/MarkHandler.java @@ -0,0 +1,20 @@ +package ru.urfu; + +/** + * Простой обработчик сообщений от пользователей + *
+ * Этот обработчик просто возвращает обратно + * сообщение пользователя, добавляя к нему + * небольшой текст. + */ +public class MarkHandler implements Handler{ + /** + * Обработать сообщение от пользователя + * @param messageFromUser сообщение от пользователя + * @return ответ бота пользователю + */ + @Override + public String handle(String messageFromUser) { + return "Ваше сообщение: '" + messageFromUser + "'"; + } +} diff --git a/src/main/java/ru/urfu/TelegramBot.java b/src/main/java/ru/urfu/TelegramBot.java index 95f0403..5b68e47 100644 --- a/src/main/java/ru/urfu/TelegramBot.java +++ b/src/main/java/ru/urfu/TelegramBot.java @@ -11,18 +11,22 @@ /** * Телеграм бот */ -public class TelegramBot extends TelegramLongPollingBot { +public class TelegramBot extends TelegramLongPollingBot implements Bot{ private final String telegramBotName; - public TelegramBot(String telegramBotName, String token) { + private final Handler handler; + + public TelegramBot(String telegramBotName, String token, Handler handler) { super(token); this.telegramBotName = telegramBotName; + this.handler = handler; } /** * Запустить Телеграмм бота */ + @Override public void start() { try { TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); @@ -39,7 +43,11 @@ public void onUpdateReceived(Update update) { Message updateMessage = update.getMessage(); Long chatId = updateMessage.getChatId(); String messageFromUser = updateMessage.getText(); - // TODO обработайте сообщение от пользователя (messageFromUser) + String reply = handler.handle(messageFromUser); + + if (reply != null && !reply.isEmpty()) { + sendMessage(chatId.toString(), reply); + } } } diff --git a/src/test/java/MarkHandlerTest.java b/src/test/java/MarkHandlerTest.java new file mode 100644 index 0000000..8f1cee3 --- /dev/null +++ b/src/test/java/MarkHandlerTest.java @@ -0,0 +1,35 @@ +import org.junit.jupiter.api.Test; +import ru.urfu.Handler; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Тесты для класса MarkHandler + */ +class MarkHandlerTest { + /** + * Тестирует метод handle класса MarkHandler на корректность возвращаемого ответа + * в случае, когда входящее сообщение не пустое. + */ + @Test + void handleReturnsExpectedResponseWithInputMessage() { + Handler handler = new ru.urfu.MarkHandler(); + String inputMessage = "Hello, Bot!"; + String expectedResponse = "Ваше сообщение: 'Hello, Bot!'"; + String actualResponse = handler.handle(inputMessage); + assertEquals(expectedResponse, actualResponse); + } + + /** + * Тестирует метод handle класса MarkHandler на корректность возвращаемого ответа + * в случае, когда входящее сообщение пустое. + */ + @Test + void handleReturnsExpectedResponseWithoutInputMessage() { + Handler handler = new ru.urfu.MarkHandler(); + String inputMessage = ""; + String expectedResponse = "Ваше сообщение: ''"; + String actualResponse = handler.handle(inputMessage); + assertEquals(expectedResponse, actualResponse); + } +} \ No newline at end of file From 223d6464a713c1a6f3f59fdb683ca1c44e304af5 Mon Sep 17 00:00:00 2001 From: Marchenko Dmitriy Date: Sat, 1 Nov 2025 14:57:54 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 108 +----------------- src/main/java/ru/urfu/Application.java | 7 +- src/main/java/ru/urfu/Bot.java | 19 --- src/main/java/ru/urfu/DiscordBot.java | 3 +- src/main/java/ru/urfu/Handler.java | 17 +-- src/main/java/ru/urfu/MarkHandler.java | 20 ---- src/main/java/ru/urfu/TelegramBot.java | 3 +- ...{MarkHandlerTest.java => HandlerTest.java} | 21 ++-- 8 files changed, 26 insertions(+), 172 deletions(-) delete mode 100644 src/main/java/ru/urfu/Bot.java delete mode 100644 src/main/java/ru/urfu/MarkHandler.java rename src/test/java/{MarkHandlerTest.java => HandlerTest.java} (57%) diff --git a/pom.xml b/pom.xml index af272a6..61de144 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ 6.0.0 3.19.0 - 4.1.128.Final + 1.2.11 1.19.0 4.33.0 @@ -37,7 +37,6 @@ org.junit.jupiter junit-jupiter - test @@ -60,6 +59,7 @@ org.junit.jupiter junit-jupiter ${junit-jupiter.version} + test @@ -69,107 +69,9 @@ - io.netty - netty-transport - ${netty.version} - - - - io.netty - netty-transport-classes-epoll - ${netty.version} - - - - io.netty - netty-transport-native-unix-common - ${netty.version} - - - - io.netty - netty-transport-native-epoll - ${netty.version} - linux-x86_64 - - - - io.netty - netty-codec - ${netty.version} - - - - io.netty - netty-buffer - ${netty.version} - - - - io.netty - netty-common - ${netty.version} - - - - io.netty - netty-handler - ${netty.version} - - - - io.netty - netty-resolver - ${netty.version} - - - - io.netty - netty-codec-dns - ${netty.version} - - - - io.netty - netty-codec-http - ${netty.version} - - - - io.netty - netty-codec-http2 - ${netty.version} - - - - io.netty - netty-codec-socks - ${netty.version} - - - - io.netty - netty-resolver-dns - ${netty.version} - - - - io.netty - netty-handler-proxy - ${netty.version} - - - - io.netty - netty-resolver-dns-classes-macos - ${netty.version} - - - - io.netty - netty-resolver-dns-native-macos - ${netty.version} - osx-x86_64 + io.projectreactor.netty + reactor-netty-http + ${reactor-netty-http.version} diff --git a/src/main/java/ru/urfu/Application.java b/src/main/java/ru/urfu/Application.java index b805659..17398e4 100644 --- a/src/main/java/ru/urfu/Application.java +++ b/src/main/java/ru/urfu/Application.java @@ -6,13 +6,15 @@ public class Application { public static void main(String[] args) { + Handler handler = new Handler(); + String telegramBotName = System.getenv("telegram_botName"); String telegramToken = System.getenv("telegram_token"); - new TelegramBot(telegramBotName, telegramToken, new MarkHandler()) + new TelegramBot(telegramBotName, telegramToken, handler) .start(); String discordToken = System.getenv("discord_token"); - new DiscordBot(discordToken, new MarkHandler()) + new DiscordBot(discordToken, handler) .start(); /* @@ -20,5 +22,4 @@ public static void main(String[] args) { и все должны работать одинаково */ } - } diff --git a/src/main/java/ru/urfu/Bot.java b/src/main/java/ru/urfu/Bot.java deleted file mode 100644 index ac4f745..0000000 --- a/src/main/java/ru/urfu/Bot.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.urfu; - -/** - * Интерфейс бота - *
- * Каждый бот должен реализовывать этот интерфейс. - * Бот должен уметь запускаться. - * В дальнейшем сюда можно добавить методы для остановки, - * получения состояния работы, а также имени бота и т.д. - * @see TelegramBot - * @see DiscordBot - * - */ -public interface Bot { - /** - * Запустить бота - */ - void start(); -} diff --git a/src/main/java/ru/urfu/DiscordBot.java b/src/main/java/ru/urfu/DiscordBot.java index 206db3a..6a1dd9a 100644 --- a/src/main/java/ru/urfu/DiscordBot.java +++ b/src/main/java/ru/urfu/DiscordBot.java @@ -10,7 +10,7 @@ /** * Дискорд бот */ -public class DiscordBot implements Bot{ +public class DiscordBot { private final String token; @@ -26,7 +26,6 @@ public DiscordBot(String token, Handler handler) { /** * Запустить Дискорд бота */ - @Override public void start() { client = DiscordClient.create(token).login().block(); if (client == null) { diff --git a/src/main/java/ru/urfu/Handler.java b/src/main/java/ru/urfu/Handler.java index dacc220..b0b191a 100644 --- a/src/main/java/ru/urfu/Handler.java +++ b/src/main/java/ru/urfu/Handler.java @@ -1,20 +1,13 @@ package ru.urfu; /** - * Базовый интерфейс для обработчиков сообщений от пользователей - *
- * Благодаря этому интерфейсу - * можно реализовать несколько разных обработчиков - * и использовать их в разных ботах, а также менять обработчики, - * не меняя код ботов. - * @see TelegramBot - * @see DiscordBot + * Обработчик сообщений от пользователя */ -public interface Handler { +public class Handler { /** * Обработать сообщение от пользователя - * @param messageFromUser сообщение от пользователя - * @return ответ бота пользователю */ - String handle(String messageFromUser); + public String handle(String messageFromUser) { + return "Ваше сообщение: '" + messageFromUser + "'"; + } } diff --git a/src/main/java/ru/urfu/MarkHandler.java b/src/main/java/ru/urfu/MarkHandler.java deleted file mode 100644 index 84d5518..0000000 --- a/src/main/java/ru/urfu/MarkHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.urfu; - -/** - * Простой обработчик сообщений от пользователей - *
- * Этот обработчик просто возвращает обратно - * сообщение пользователя, добавляя к нему - * небольшой текст. - */ -public class MarkHandler implements Handler{ - /** - * Обработать сообщение от пользователя - * @param messageFromUser сообщение от пользователя - * @return ответ бота пользователю - */ - @Override - public String handle(String messageFromUser) { - return "Ваше сообщение: '" + messageFromUser + "'"; - } -} diff --git a/src/main/java/ru/urfu/TelegramBot.java b/src/main/java/ru/urfu/TelegramBot.java index 5b68e47..76df107 100644 --- a/src/main/java/ru/urfu/TelegramBot.java +++ b/src/main/java/ru/urfu/TelegramBot.java @@ -11,7 +11,7 @@ /** * Телеграм бот */ -public class TelegramBot extends TelegramLongPollingBot implements Bot{ +public class TelegramBot extends TelegramLongPollingBot { private final String telegramBotName; @@ -26,7 +26,6 @@ public TelegramBot(String telegramBotName, String token, Handler handler) { /** * Запустить Телеграмм бота */ - @Override public void start() { try { TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); diff --git a/src/test/java/MarkHandlerTest.java b/src/test/java/HandlerTest.java similarity index 57% rename from src/test/java/MarkHandlerTest.java rename to src/test/java/HandlerTest.java index 8f1cee3..7d127a1 100644 --- a/src/test/java/MarkHandlerTest.java +++ b/src/test/java/HandlerTest.java @@ -1,3 +1,4 @@ +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import ru.urfu.Handler; @@ -6,18 +7,20 @@ /** * Тесты для класса MarkHandler */ -class MarkHandlerTest { +class HandlerTest { + private Handler handler; + + @BeforeEach + void setUp() { + handler = new Handler(); + } /** * Тестирует метод handle класса MarkHandler на корректность возвращаемого ответа * в случае, когда входящее сообщение не пустое. */ @Test void handleReturnsExpectedResponseWithInputMessage() { - Handler handler = new ru.urfu.MarkHandler(); - String inputMessage = "Hello, Bot!"; - String expectedResponse = "Ваше сообщение: 'Hello, Bot!'"; - String actualResponse = handler.handle(inputMessage); - assertEquals(expectedResponse, actualResponse); + assertEquals("Ваше сообщение: 'привет'", handler.handle("привет")); } /** @@ -26,10 +29,6 @@ void handleReturnsExpectedResponseWithInputMessage() { */ @Test void handleReturnsExpectedResponseWithoutInputMessage() { - Handler handler = new ru.urfu.MarkHandler(); - String inputMessage = ""; - String expectedResponse = "Ваше сообщение: ''"; - String actualResponse = handler.handle(inputMessage); - assertEquals(expectedResponse, actualResponse); + assertEquals("Ваше сообщение: ''", handler.handle("")); } } \ No newline at end of file