From 98bed43267510ea0ea105e2e852caa9ddca1ec3d Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sat, 30 Jul 2022 10:31:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D1=83=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 40 +++++++++- telegram-consumer/pom.xml | 33 ++++++++ .../listen/EventDistributorService.java | 54 +++++++++---- telegram-context/pom.xml | 31 +++++++ .../telegram/context}/EventDistributor.java | 5 +- .../context/SenderStorageService.java | 13 +++ .../telegram/context/TelegramBot.java | 18 +++++ .../telegram/context/TelegramConnect.java | 11 +++ .../telegram/context/TelegramSending.java | 11 +++ telegram-core/pom.xml | 13 ++- .../godfather/telegram/TelegramBot.java | 18 ----- ...amConnect.java => TelegramConnectBot.java} | 45 ++++++----- .../telegram/TelegramDefaultConnect.java | 34 ++++++++ .../telegram/TelegramPollingBot.java | 22 ++--- .../telegram/convert/CommandConvert.java | 50 ++++++++++++ .../telegram/convert/MessageMailConvert.java | 2 +- .../telegram/domain/event/Command.java | 14 ---- .../service/AttachmentServiceImpl.java | 11 ++- .../service/SenderMapStorageService.java | 32 ++++++++ .../service/provider/CommandProvider.java | 18 ----- telegram-domain/pom.xml | 31 +++++++ .../domain/attachment/ContactAttachment.java | 0 .../domain/attachment/DocumentAttachment.java | 10 +-- .../domain/attachment/LinkAttachment.java | 0 .../telegram/domain/attachment/Picture.java | 0 .../attachment/PictureGroupAttachment.java | 0 .../attachment/TelegramAttachmentType.java | 0 .../telegram/domain}/config/ProxyConfig.java | 2 +- .../domain/config/TelegramConnectConfig.java | 8 +- .../telegram/domain/event/Command.java | 80 +++++++++++++++++++ .../telegram/domain/event/Subscribe.java | 2 +- .../telegram/domain/event/Unsubscribe.java | 2 +- .../telegram/domain/files/ByteContainer.java | 10 ++- .../telegram/domain/files/FileContainer.java | 10 ++- .../domain/keyboard/InlineKeyBoard.java | 1 + .../domain/keyboard/MarkupKeyBoard.java | 0 .../domain/keyboard/button/ContactButton.java | 7 +- .../domain/keyboard/button/UrlButton.java | 7 +- .../domain/keyboard/button/WebAppButton.java | 5 +- telegram-sender/pom.xml | 45 +++++++++++ .../telegram/service/SendPreProcessing.java | 0 .../telegram/service/TelegramSender.java | 63 ++++++++++----- .../telegram/utils/KeyBoardConvert.java | 5 +- telegram/pom.xml | 36 +++++++++ 44 files changed, 646 insertions(+), 153 deletions(-) create mode 100644 telegram-consumer/pom.xml rename {telegram-core => telegram-consumer}/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java (59%) create mode 100644 telegram-context/pom.xml rename {telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen => telegram-context/src/main/java/dev/struchkov/godfather/telegram/context}/EventDistributor.java (60%) create mode 100644 telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/SenderStorageService.java create mode 100644 telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramBot.java create mode 100644 telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramConnect.java create mode 100644 telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramSending.java delete mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramBot.java rename telegram-core/src/main/java/dev/struchkov/godfather/telegram/{TelegramConnect.java => TelegramConnectBot.java} (75%) create mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramDefaultConnect.java create mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/CommandConvert.java delete mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java create mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/SenderMapStorageService.java delete mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/provider/CommandProvider.java create mode 100644 telegram-domain/pom.xml rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/ContactAttachment.java (100%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java (83%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/LinkAttachment.java (100%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/Picture.java (100%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/PictureGroupAttachment.java (100%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/TelegramAttachmentType.java (100%) rename {telegram-core/src/main/java/dev/struchkov/godfather/telegram => telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain}/config/ProxyConfig.java (94%) rename telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/TelegramPollingConfig.java => telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramConnectConfig.java (80%) create mode 100644 telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java (96%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java (96%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java (71%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java (80%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java (95%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java (100%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java (72%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java (75%) rename {telegram-core => telegram-domain}/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java (76%) create mode 100644 telegram-sender/pom.xml rename {telegram-core => telegram-sender}/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java (100%) rename {telegram-core => telegram-sender}/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java (55%) rename {telegram-core => telegram-sender}/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java (95%) create mode 100644 telegram/pom.xml diff --git a/pom.xml b/pom.xml index f881ef1..a28fe53 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - dev.struchkov.godfather + dev.struchkov.godfather.telegram telegram-bot - 0.0.23 + 0.0.26 pom telegram-core + telegram-sender + telegram-domain + telegram-consumer + telegram-context + telegram Telegram Bot @@ -33,9 +38,11 @@ UTF-8 UTF-8 - 0.0.18 + 0.0.22 6.1.0 + 1.3.0 + 3.10.1 1.6.13 3.2.1 @@ -45,12 +52,39 @@ + + dev.struchkov.godfather.telegram + telegram-domain + ${project.version} + + + dev.struchkov.godfather.telegram + telegram-context + ${project.version} + + + dev.struchkov.godfather.telegram + telegram-core + ${project.version} + + + + dev.struchkov.godfather + bot-context + ${godfather.core.ver} + dev.struchkov.godfather bot-core ${godfather.core.ver} + + dev.struchkov.haiti + haiti-utils + ${haiti.version} + + org.telegram telegrambots diff --git a/telegram-consumer/pom.xml b/telegram-consumer/pom.xml new file mode 100644 index 0000000..83126cf --- /dev/null +++ b/telegram-consumer/pom.xml @@ -0,0 +1,33 @@ + + + + telegram-bot + dev.struchkov.godfather.telegram + 0.0.26 + + 4.0.0 + + telegram-consumer + + + dev.struchkov.godfather.telegram + telegram-context + + + dev.struchkov.godfather + bot-context + + + dev.struchkov.godfather.telegram + telegram-core + + + + + 17 + 17 + + + \ No newline at end of file diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java b/telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java similarity index 59% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java rename to telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java index 18b00f0..4815850 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java +++ b/telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java @@ -1,18 +1,22 @@ package dev.struchkov.godfather.telegram.listen; import dev.struchkov.godfather.context.domain.content.Mail; -import dev.struchkov.godfather.context.service.EventProvider; -import dev.struchkov.godfather.telegram.TelegramConnect; +import dev.struchkov.godfather.context.service.EventHandler; +import dev.struchkov.godfather.telegram.TelegramConnectBot; +import dev.struchkov.godfather.telegram.context.EventDistributor; import dev.struchkov.godfather.telegram.convert.CallbackQueryConvert; +import dev.struchkov.godfather.telegram.convert.CommandConvert; import dev.struchkov.godfather.telegram.convert.MessageMailConvert; import dev.struchkov.godfather.telegram.convert.SubscribeConvert; import dev.struchkov.godfather.telegram.convert.UnsubscribeConvert; +import dev.struchkov.godfather.telegram.domain.event.Command; import dev.struchkov.godfather.telegram.domain.event.Subscribe; import dev.struchkov.godfather.telegram.domain.event.Unsubscribe; import org.jetbrains.annotations.NotNull; import org.telegram.telegrambots.meta.api.objects.CallbackQuery; import org.telegram.telegrambots.meta.api.objects.ChatMemberUpdated; import org.telegram.telegrambots.meta.api.objects.Message; +import org.telegram.telegrambots.meta.api.objects.MessageEntity; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.api.objects.User; @@ -21,6 +25,8 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; + /** * TODO: Добавить описание класса. * @@ -28,11 +34,11 @@ import java.util.stream.Collectors; */ public class EventDistributorService implements EventDistributor { - private final Map> eventProviderMap; + private final Map> eventProviderMap; - public EventDistributorService(TelegramConnect telegramConnect, List eventProviders) { - this.eventProviderMap = eventProviders.stream().collect(Collectors.groupingBy(EventProvider::getEventType)); - telegramConnect.initEventDistributor(this); + public EventDistributorService(TelegramConnectBot telegramConnectBot, List eventProviders) { + this.eventProviderMap = eventProviders.stream().collect(Collectors.groupingBy(EventHandler::getEventType)); + telegramConnectBot.initEventDistributor(this); } @Override @@ -40,24 +46,34 @@ public class EventDistributorService implements EventDistributor { if (update.getMessage() != null) { final Message message = update.getMessage(); if (!isEvent(message)) { - getEventProvider(Mail.TYPE) - .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.sendEvent(MessageMailConvert.apply(message)))); + if (isCommand(message)) { + getHandler(Command.TYPE) + .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.handle(CommandConvert.apply(message)))); + return; + } else { + getHandler(Mail.TYPE) + .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.handle(MessageMailConvert.apply(message)))); + return; + } } } if (update.getCallbackQuery() != null) { final CallbackQuery callbackQuery = update.getCallbackQuery(); - getEventProvider(Mail.TYPE) - .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.sendEvent(CallbackQueryConvert.apply(callbackQuery)))); + getHandler(Mail.TYPE) + .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.handle(CallbackQueryConvert.apply(callbackQuery)))); + return; } if (update.getMyChatMember() != null) { final ChatMemberUpdated chatMember = update.getMyChatMember(); if ("kicked".equals(chatMember.getNewChatMember().getStatus())) { - getEventProvider(Unsubscribe.TYPE) - .ifPresent(providers -> providers.forEach(provider -> provider.sendEvent(UnsubscribeConvert.apply(chatMember)))); + getHandler(Unsubscribe.TYPE) + .ifPresent(providers -> providers.forEach(provider -> provider.handle(UnsubscribeConvert.apply(chatMember)))); + return; } if ("member".equals(chatMember.getNewChatMember().getStatus())) { - getEventProvider(Subscribe.TYPE) - .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.sendEvent(SubscribeConvert.apply(chatMember)))); + getHandler(Subscribe.TYPE) + .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.handle(SubscribeConvert.apply(chatMember)))); + return; } } } @@ -83,7 +99,15 @@ public class EventDistributorService implements EventDistributor { } } - private Optional> getEventProvider(String type) { + private boolean isCommand(Message message) { + final List entities = message.getEntities(); + if (checkNotEmpty(entities)) { + return "bot_command".equals(entities.get(0).getType()); + } + return false; + } + + private Optional> getHandler(String type) { return Optional.ofNullable(eventProviderMap.get(type)); } diff --git a/telegram-context/pom.xml b/telegram-context/pom.xml new file mode 100644 index 0000000..d4e3974 --- /dev/null +++ b/telegram-context/pom.xml @@ -0,0 +1,31 @@ + + + + telegram-bot + dev.struchkov.godfather.telegram + 0.0.26 + + 4.0.0 + + telegram-context + + + 17 + 17 + + + + + dev.struchkov.godfather + bot-context + + + + org.telegram + telegrambots + + + + \ No newline at end of file diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributor.java b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/EventDistributor.java similarity index 60% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributor.java rename to telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/EventDistributor.java index 40beaf3..2588cbc 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributor.java +++ b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/EventDistributor.java @@ -1,8 +1,9 @@ -package dev.struchkov.godfather.telegram.listen; +package dev.struchkov.godfather.telegram.context; -import org.jetbrains.annotations.NotNull; import org.telegram.telegrambots.meta.api.objects.Update; +import javax.validation.constraints.NotNull; + public interface EventDistributor { void processing(@NotNull Update update); diff --git a/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/SenderStorageService.java b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/SenderStorageService.java new file mode 100644 index 0000000..5ccf566 --- /dev/null +++ b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/SenderStorageService.java @@ -0,0 +1,13 @@ +package dev.struchkov.godfather.telegram.context; + +import java.util.Optional; + +public interface SenderStorageService { + + Optional getLastSendMessage(Long telegramId); + + void saveLastSendMessage(Long telegramId, Integer messageId); + + void removeLastSendMessage(Long telegramId); + +} diff --git a/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramBot.java b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramBot.java new file mode 100644 index 0000000..d413f0e --- /dev/null +++ b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramBot.java @@ -0,0 +1,18 @@ +package dev.struchkov.godfather.telegram.context; + +import org.telegram.telegrambots.meta.bots.AbsSender; + +import javax.validation.constraints.NotNull; + +/** + * TODO: Добавить описание интерфейса. + * + * @author upagge [12.02.2020] + */ +public interface TelegramBot { + + AbsSender getAdsSender(); + + void initEventDistributor(@NotNull EventDistributor eventDistributor); + +} diff --git a/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramConnect.java b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramConnect.java new file mode 100644 index 0000000..f084827 --- /dev/null +++ b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramConnect.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.telegram.context; + +import org.telegram.telegrambots.meta.bots.AbsSender; + +public interface TelegramConnect { + + AbsSender getAbsSender(); + + String getToken(); + +} diff --git a/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramSending.java b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramSending.java new file mode 100644 index 0000000..4024890 --- /dev/null +++ b/telegram-context/src/main/java/dev/struchkov/godfather/telegram/context/TelegramSending.java @@ -0,0 +1,11 @@ +package dev.struchkov.godfather.telegram.context; + +import dev.struchkov.godfather.context.domain.BoxAnswer; +import dev.struchkov.godfather.context.service.sender.Sending; +import org.jetbrains.annotations.NotNull; + +public interface TelegramSending extends Sending { + + void sendNotSave(@NotNull Long personId, @NotNull BoxAnswer boxAnswer); + +} diff --git a/telegram-core/pom.xml b/telegram-core/pom.xml index 98c4f54..ae512a3 100644 --- a/telegram-core/pom.xml +++ b/telegram-core/pom.xml @@ -3,9 +3,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - dev.struchkov.godfather + dev.struchkov.godfather.telegram telegram-bot - 0.0.23 + 0.0.26 telegram-core @@ -14,6 +14,15 @@ Allows you to create bots for Telegram + + dev.struchkov.godfather.telegram + telegram-domain + + + dev.struchkov.godfather.telegram + telegram-context + + dev.struchkov.godfather bot-core diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramBot.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramBot.java deleted file mode 100644 index c8c0c5f..0000000 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramBot.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.struchkov.godfather.telegram; - -import dev.struchkov.godfather.telegram.listen.EventDistributorService; -import org.jetbrains.annotations.NotNull; -import org.telegram.telegrambots.meta.bots.AbsSender; - -/** - * TODO: Добавить описание интерфейса. - * - * @author upagge [12.02.2020] - */ -public interface TelegramBot { - - AbsSender getAdsSender(); - - void initEventDistributor(@NotNull EventDistributorService eventDistributor); - -} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramConnect.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramConnectBot.java similarity index 75% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramConnect.java rename to telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramConnectBot.java index 8cc3f91..d68d08b 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramConnect.java +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramConnectBot.java @@ -1,8 +1,11 @@ package dev.struchkov.godfather.telegram; -import dev.struchkov.godfather.telegram.config.ProxyConfig; -import dev.struchkov.godfather.telegram.config.TelegramPollingConfig; -import dev.struchkov.godfather.telegram.listen.EventDistributorService; +import dev.struchkov.godfather.telegram.context.EventDistributor; +import dev.struchkov.godfather.telegram.context.TelegramBot; +import dev.struchkov.godfather.telegram.context.TelegramConnect; +import dev.struchkov.godfather.telegram.domain.config.ProxyConfig; +import dev.struchkov.godfather.telegram.domain.config.ProxyConfig.Type; +import dev.struchkov.godfather.telegram.domain.config.TelegramConnectConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.telegram.telegrambots.bots.DefaultBotOptions; @@ -19,16 +22,16 @@ import java.net.PasswordAuthentication; * * @author upagge [30.01.2020] */ -public class TelegramConnect { +public class TelegramConnectBot implements TelegramConnect { - private static final Logger log = LoggerFactory.getLogger(TelegramConnect.class); + private static final Logger log = LoggerFactory.getLogger(TelegramConnectBot.class); private TelegramBot telegramBot; - private final TelegramPollingConfig telegramPollingConfig; + private final TelegramConnectConfig telegramConnectConfig; - public TelegramConnect(TelegramPollingConfig telegramPollingConfig) { - this.telegramPollingConfig = telegramPollingConfig; - initLongPolling(telegramPollingConfig); + public TelegramConnectBot(TelegramConnectConfig telegramConnectConfig) { + this.telegramConnectConfig = telegramConnectConfig; + initLongPolling(telegramConnectConfig); } // public TelegramConnect(TelegramWebHookConfig telegramWebHookConfig) { @@ -46,9 +49,9 @@ public class TelegramConnect { // } // } - private void initLongPolling(TelegramPollingConfig telegramPollingConfig) { + private void initLongPolling(TelegramConnectConfig telegramConnectConfig) { - final ProxyConfig proxyConfig = telegramPollingConfig.getProxyConfig(); + final ProxyConfig proxyConfig = telegramConnectConfig.getProxyConfig(); if (proxyConfig != null && proxyConfig.getPassword() != null) { try { Authenticator.setDefault(new Authenticator() { @@ -77,14 +80,13 @@ public class TelegramConnect { botOptions.setProxyType(convertProxyType(proxyConfig.getType())); - final TelegramPollingBot bot = new TelegramPollingBot(telegramPollingConfig, botOptions); - + final TelegramPollingBot bot = new TelegramPollingBot(telegramConnectConfig, botOptions); botapi = new TelegramBotsApi(DefaultBotSession.class); botapi.registerBot(bot); this.telegramBot = bot; } else { - final TelegramPollingBot bot = new TelegramPollingBot(telegramPollingConfig); + final TelegramPollingBot bot = new TelegramPollingBot(telegramConnectConfig); botapi = new TelegramBotsApi(DefaultBotSession.class); botapi.registerBot(bot); this.telegramBot = bot; @@ -94,7 +96,7 @@ public class TelegramConnect { } } - private DefaultBotOptions.ProxyType convertProxyType(ProxyConfig.Type type) { + private DefaultBotOptions.ProxyType convertProxyType(Type type) { switch (type) { case SOCKS5: return DefaultBotOptions.ProxyType.SOCKS5; @@ -107,16 +109,17 @@ public class TelegramConnect { } } - public AbsSender getAdsSender() { - return telegramBot.getAdsSender(); - } - - public void initEventDistributor(EventDistributorService eventDistributor) { + public void initEventDistributor(EventDistributor eventDistributor) { telegramBot.initEventDistributor(eventDistributor); } public String getToken() { - return telegramPollingConfig.getBotToken(); + return telegramConnectConfig.getBotToken(); + } + + @Override + public AbsSender getAbsSender() { + return telegramBot.getAdsSender(); } } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramDefaultConnect.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramDefaultConnect.java new file mode 100644 index 0000000..5eeb327 --- /dev/null +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramDefaultConnect.java @@ -0,0 +1,34 @@ +package dev.struchkov.godfather.telegram; + +import dev.struchkov.godfather.telegram.context.TelegramConnect; +import dev.struchkov.godfather.telegram.domain.config.TelegramConnectConfig; +import org.telegram.telegrambots.bots.DefaultAbsSender; +import org.telegram.telegrambots.bots.DefaultBotOptions; +import org.telegram.telegrambots.meta.bots.AbsSender; + +public class TelegramDefaultConnect implements TelegramConnect { + + private final String botToken; + private final AbsSender absSender; + + public TelegramDefaultConnect(TelegramConnectConfig telegramConnectConfig) { + this.botToken = telegramConnectConfig.getBotToken(); + this.absSender = new DefaultAbsSender(new DefaultBotOptions()) { + @Override + public String getBotToken() { + return botToken; + } + }; + } + + @Override + public AbsSender getAbsSender() { + return absSender; + } + + @Override + public String getToken() { + return botToken; + } + +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramPollingBot.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramPollingBot.java index d567962..647cfb4 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramPollingBot.java +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/TelegramPollingBot.java @@ -1,8 +1,8 @@ package dev.struchkov.godfather.telegram; -import dev.struchkov.godfather.telegram.config.TelegramPollingConfig; -import dev.struchkov.godfather.telegram.listen.EventDistributor; -import dev.struchkov.godfather.telegram.listen.EventDistributorService; +import dev.struchkov.godfather.telegram.context.EventDistributor; +import dev.struchkov.godfather.telegram.context.TelegramBot; +import dev.struchkov.godfather.telegram.domain.config.TelegramConnectConfig; import org.jetbrains.annotations.NotNull; import org.telegram.telegrambots.bots.DefaultBotOptions; import org.telegram.telegrambots.bots.TelegramLongPollingBot; @@ -16,16 +16,16 @@ import org.telegram.telegrambots.meta.bots.AbsSender; */ public class TelegramPollingBot extends TelegramLongPollingBot implements TelegramBot { - private final TelegramPollingConfig telegramPollingConfig; + private final TelegramConnectConfig telegramConnectConfig; private EventDistributor eventDistributor; - public TelegramPollingBot(TelegramPollingConfig telegramPollingConfig, DefaultBotOptions defaultBotOptions) { + public TelegramPollingBot(TelegramConnectConfig telegramConnectConfig, DefaultBotOptions defaultBotOptions) { super(defaultBotOptions); - this.telegramPollingConfig = telegramPollingConfig; + this.telegramConnectConfig = telegramConnectConfig; } - public TelegramPollingBot(TelegramPollingConfig telegramPollingConfig) { - this.telegramPollingConfig = telegramPollingConfig; + public TelegramPollingBot(TelegramConnectConfig telegramConnectConfig) { + this.telegramConnectConfig = telegramConnectConfig; } @Override @@ -37,12 +37,12 @@ public class TelegramPollingBot extends TelegramLongPollingBot implements Telegr @Override public String getBotUsername() { - return telegramPollingConfig.getBotUsername(); + return telegramConnectConfig.getBotUsername(); } @Override public String getBotToken() { - return telegramPollingConfig.getBotToken(); + return telegramConnectConfig.getBotToken(); } @Override @@ -51,7 +51,7 @@ public class TelegramPollingBot extends TelegramLongPollingBot implements Telegr } @Override - public void initEventDistributor(@NotNull EventDistributorService eventDistributor) { + public void initEventDistributor(@NotNull EventDistributor eventDistributor) { this.eventDistributor = eventDistributor; } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/CommandConvert.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/CommandConvert.java new file mode 100644 index 0000000..e3835bb --- /dev/null +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/CommandConvert.java @@ -0,0 +1,50 @@ +package dev.struchkov.godfather.telegram.convert; + +import dev.struchkov.godfather.telegram.domain.event.Command; +import dev.struchkov.haiti.utils.Strings; +import org.telegram.telegrambots.meta.api.objects.Chat; +import org.telegram.telegrambots.meta.api.objects.Message; +import org.telegram.telegrambots.meta.api.objects.MessageEntity; + +import java.util.List; + +import static dev.struchkov.haiti.context.exception.ConvertException.convertException; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; +import static dev.struchkov.haiti.utils.Inspector.isNotEmpty; +import static dev.struchkov.haiti.utils.Inspector.isTrue; + +public class CommandConvert { + + private CommandConvert() { + utilityClass(); + } + + public static Command apply(Message message) { + final List entities = message.getEntities(); + isNotEmpty(entities, convertException("Ошибка преобразования сообщения в команду. В сообщении не обнаружена команда.")); + + final MessageEntity messageEntity = entities.get(0); + isTrue("bot_command".equals(messageEntity.getType()), convertException("Ошибка преобразования сообщения в команду. В сообщении не обнаружена команда.")); + + final String commandValue = messageEntity.getText(); + String commandArg = message.getText().replace(commandValue, ""); + if (checkNotEmpty(commandArg)) { + commandArg = commandArg.substring(1); + } + + final Command command = new Command(); + command.setValue(commandValue); + command.setCommandType(commandValue.replace("/", "")); + command.setArg(Strings.EMPTY.equals(commandArg) ? null : commandArg); + command.setRawValue(message.getText()); + + final Chat chat = message.getChat(); + + command.setFirstName(chat.getFirstName()); + command.setLastName(chat.getLastName()); + command.setPersonId(chat.getId()); + return command; + } + +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/MessageMailConvert.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/MessageMailConvert.java index 6389403..6d1e71d 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/MessageMailConvert.java +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/MessageMailConvert.java @@ -105,7 +105,7 @@ public final class MessageMailConvert { attachment.setFileId(document.getFileId()); attachment.setFileSize(document.getFileSize()); attachment.setFileName(document.getFileName()); - attachment.setFileType(document.getMimeType()); + attachment.setMimeType(document.getMimeType()); return Optional.of(attachment); } return Optional.empty(); diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java deleted file mode 100644 index ed71139..0000000 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.struchkov.godfather.telegram.domain.event; - -import dev.struchkov.godfather.context.domain.event.Event; - -public class Command implements Event { - - public static final String TYPE = "CMD"; - - @Override - public String getType() { - return TYPE; - } - -} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/AttachmentServiceImpl.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/AttachmentServiceImpl.java index 9dd00e7..b79b689 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/AttachmentServiceImpl.java +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/AttachmentServiceImpl.java @@ -1,6 +1,6 @@ package dev.struchkov.godfather.telegram.service; -import dev.struchkov.godfather.telegram.TelegramConnect; +import dev.struchkov.godfather.telegram.context.TelegramConnect; import dev.struchkov.godfather.telegram.domain.attachment.DocumentAttachment; import dev.struchkov.godfather.telegram.domain.attachment.Picture; import dev.struchkov.godfather.telegram.domain.files.ByteContainer; @@ -35,7 +35,7 @@ public class AttachmentServiceImpl { private String folderPathForFiles; public AttachmentServiceImpl(TelegramConnect telegramConnect) { - this.absSender = telegramConnect.getAdsSender(); + this.absSender = telegramConnect.getAbsSender(); this.botToken = telegramConnect.getToken(); } @@ -54,14 +54,13 @@ public class AttachmentServiceImpl { log.error(e.getMessage()); } } - } public FileContainer uploadFile(@NotNull DocumentAttachment documentAttachment) { isNotNull(documentAttachment); try { final File file = downloadFile(documentAttachment); - return new FileContainer(documentAttachment.getFileName(), file); + return new FileContainer(documentAttachment.getFileName(), documentAttachment.getMimeType(), file); } catch (Exception e) { log.error(e.getMessage(), e); } @@ -72,7 +71,7 @@ public class AttachmentServiceImpl { isNotNull(documentAttachment); try { final byte[] bytes = downloadBytes(documentAttachment); - return new ByteContainer(documentAttachment.getFileName(), bytes); + return new ByteContainer(documentAttachment.getFileName(), documentAttachment.getMimeType(), bytes); } catch (Exception e) { log.error(e.getMessage(), e); } @@ -83,7 +82,7 @@ public class AttachmentServiceImpl { isNotNull(picture); try { final byte[] bytes = downloadBytes(picture); - return new ByteContainer(null, bytes); + return new ByteContainer(null, "image/jpeg", bytes); } catch (Exception e) { log.error(e.getMessage(), e); } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/SenderMapStorageService.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/SenderMapStorageService.java new file mode 100644 index 0000000..e0ef71c --- /dev/null +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/SenderMapStorageService.java @@ -0,0 +1,32 @@ +package dev.struchkov.godfather.telegram.service; + +import dev.struchkov.godfather.telegram.context.SenderStorageService; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +public class SenderMapStorageService implements SenderStorageService { + + private final Map lastMessageId = new HashMap<>(); + + @Override + public Optional getLastSendMessage(Long telegramId) { + return Optional.ofNullable(lastMessageId.get(telegramId)); + } + + @Override + public void saveLastSendMessage(@NotNull Long telegramId, @NotNull Integer messageId) { + isNotNull(telegramId); + lastMessageId.put(telegramId, messageId); + } + + @Override + public void removeLastSendMessage(Long telegramId) { + lastMessageId.remove(telegramId); + } + +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/provider/CommandProvider.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/provider/CommandProvider.java deleted file mode 100644 index 3b7a77a..0000000 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/provider/CommandProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.struchkov.godfather.telegram.service.provider; - -import dev.struchkov.godfather.context.service.EventProvider; -import dev.struchkov.godfather.telegram.domain.event.Command; - -public class CommandProvider implements EventProvider { - - @Override - public void sendEvent(Command event) { - - } - - @Override - public String getEventType() { - return Command.TYPE; - } - -} diff --git a/telegram-domain/pom.xml b/telegram-domain/pom.xml new file mode 100644 index 0000000..72c9025 --- /dev/null +++ b/telegram-domain/pom.xml @@ -0,0 +1,31 @@ + + + + telegram-bot + dev.struchkov.godfather.telegram + 0.0.26 + + 4.0.0 + + telegram-domain + + + 17 + 17 + + + + + dev.struchkov.godfather + bot-context + + + + org.telegram + telegrambots + + + + \ No newline at end of file diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/ContactAttachment.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/ContactAttachment.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/ContactAttachment.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/ContactAttachment.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java similarity index 83% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java index 617786d..b91abdf 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/DocumentAttachment.java @@ -7,7 +7,7 @@ public class DocumentAttachment extends Attachment { private String fileId; private Long fileSize; private String fileName; - private String fileType; + private String mimeType; public String getFileId() { return fileId; @@ -33,12 +33,12 @@ public class DocumentAttachment extends Attachment { this.fileName = fileName; } - public String getFileType() { - return fileType; + public String getMimeType() { + return mimeType; } - public void setFileType(String fileType) { - this.fileType = fileType; + public void setMimeType(String mimeType) { + this.mimeType = mimeType; } @Override diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/LinkAttachment.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/LinkAttachment.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/LinkAttachment.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/LinkAttachment.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/Picture.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/Picture.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/Picture.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/Picture.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/PictureGroupAttachment.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/PictureGroupAttachment.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/PictureGroupAttachment.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/PictureGroupAttachment.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/TelegramAttachmentType.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/TelegramAttachmentType.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/TelegramAttachmentType.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/TelegramAttachmentType.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/ProxyConfig.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/ProxyConfig.java similarity index 94% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/ProxyConfig.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/ProxyConfig.java index 61ac458..eb8c32d 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/ProxyConfig.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/ProxyConfig.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.telegram.config; +package dev.struchkov.godfather.telegram.domain.config; /** * TODO: Добавить описание класса. diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/TelegramPollingConfig.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramConnectConfig.java similarity index 80% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/TelegramPollingConfig.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramConnectConfig.java index fc1e24e..49a3642 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/config/TelegramPollingConfig.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramConnectConfig.java @@ -1,23 +1,23 @@ -package dev.struchkov.godfather.telegram.config; +package dev.struchkov.godfather.telegram.domain.config; /** * TODO: Добавить описание класса. * * @author upagge [18.08.2019] */ -public class TelegramPollingConfig { +public class TelegramConnectConfig { private String botUsername; private String botToken; private ProxyConfig proxyConfig; - public TelegramPollingConfig(String botUsername, String botToken) { + public TelegramConnectConfig(String botUsername, String botToken) { this.botUsername = botUsername; this.botToken = botToken; } - public TelegramPollingConfig() { + public TelegramConnectConfig() { } public void setBotUsername(String botUsername) { diff --git a/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java new file mode 100644 index 0000000..254909f --- /dev/null +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java @@ -0,0 +1,80 @@ +package dev.struchkov.godfather.telegram.domain.event; + +import dev.struchkov.godfather.context.domain.event.Event; + +import java.util.Optional; + +public class Command implements Event { + + public static final String TYPE = "CMD"; + + private String value; + private String commandType; + private String arg; + private String rawValue; + + private String firstName; + private String lastName; + private Long personId; + + public void setValue(String value) { + this.value = value; + } + + public void setCommandType(String commandType) { + this.commandType = commandType; + } + + public void setArg(String arg) { + this.arg = arg; + } + + public void setRawValue(String rawValue) { + this.rawValue = rawValue; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public String getValue() { + return value; + } + + public Optional getArg() { + return Optional.ofNullable(arg); + } + + public String getCommandType() { + return commandType; + } + + public String getRawValue() { + return rawValue; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public Long getPersonId() { + return personId; + } + + @Override + public String getEventType() { + return TYPE; + } +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java similarity index 96% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java index 3db70f6..099da27 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Subscribe.java @@ -46,7 +46,7 @@ public class Subscribe implements Event { } @Override - public String getType() { + public String getEventType() { return TYPE; } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java similarity index 96% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java index fee2d2e..6b3a743 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Unsubscribe.java @@ -46,7 +46,7 @@ public class Unsubscribe implements Event { } @Override - public String getType() { + public String getEventType() { return TYPE; } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java similarity index 71% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java index 49f6cad..8ec6ae0 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/files/ByteContainer.java @@ -2,13 +2,15 @@ package dev.struchkov.godfather.telegram.domain.files; public class ByteContainer { - public static final ByteContainer EMPTY = new ByteContainer(null, null); + public static final ByteContainer EMPTY = new ByteContainer(null, null, null); private final String fileName; + private final String mimeType; private final byte[] bytes; - public ByteContainer(String fileName, byte[] bytes) { + public ByteContainer(String fileName, String mimeType, byte[] bytes) { this.fileName = fileName; + this.mimeType = mimeType; this.bytes = bytes; } @@ -24,6 +26,10 @@ public class ByteContainer { return bytes; } + public String getMimeType() { + return mimeType; + } + public boolean isNotEmpty() { return bytes != null && bytes.length > 0; } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java similarity index 80% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java index 957ef41..f6758f6 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/files/FileContainer.java @@ -9,16 +9,18 @@ import java.nio.file.Files; public class FileContainer { - public static final FileContainer EMPTY = new FileContainer(null, null); + public static final FileContainer EMPTY = new FileContainer(null, null, null); private static final Logger log = LoggerFactory.getLogger(FileContainer.class); private final String fileName; private final File file; + private final String mimeType; - public FileContainer(String fileName, File file) { + public FileContainer(String fileName, String mimeType, File file) { this.fileName = fileName; this.file = file; + this.mimeType = mimeType; } public static FileContainer empty() { @@ -33,6 +35,10 @@ public class FileContainer { return file; } + public String getMimeType() { + return mimeType; + } + public boolean isNotEmpty() { return file != null; } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java similarity index 95% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java index fc87c63..de92a4d 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java @@ -3,6 +3,7 @@ package dev.struchkov.godfather.telegram.domain.keyboard; import dev.struchkov.godfather.context.domain.keyboard.KeyBoard; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine; +import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoardLine; import java.util.ArrayList; import java.util.List; diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java similarity index 72% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java index d7a03c2..3727830 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ContactButton.java @@ -1,6 +1,7 @@ package dev.struchkov.godfather.telegram.domain.keyboard.button; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; +import org.jetbrains.annotations.NotNull; /** * Запрашивает у пользователя его контактный номер. @@ -11,10 +12,14 @@ public class ContactButton implements KeyBoardButton { private final String label; - public ContactButton(String label) { + private ContactButton(String label) { this.label = label; } + public static ContactButton contactButton(@NotNull String label) { + return new ContactButton(label); + } + public String getLabel() { return label; } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java similarity index 75% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java index c45e839..15fd779 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/UrlButton.java @@ -1,20 +1,21 @@ package dev.struchkov.godfather.telegram.domain.keyboard.button; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; +import org.jetbrains.annotations.NotNull; public class UrlButton implements KeyBoardButton { public static final String TYPE = "URL"; - private String label; - private String url; + private final String label; + private final String url; public UrlButton(String label, String url) { this.label = label; this.url = url; } - public static UrlButton buttonUrl(String label, String url) { + public static UrlButton urlButton(@NotNull String label, @NotNull String url) { return new UrlButton(label, url); } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java similarity index 76% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java rename to telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java index a2368de..f2ec90f 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/WebAppButton.java @@ -1,6 +1,7 @@ package dev.struchkov.godfather.telegram.domain.keyboard.button; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; +import org.jetbrains.annotations.NotNull; public class WebAppButton implements KeyBoardButton { @@ -9,12 +10,12 @@ public class WebAppButton implements KeyBoardButton { private final String label; private final String url; - public WebAppButton(String label, String url) { + private WebAppButton(String label, String url) { this.label = label; this.url = url; } - public static WebAppButton buttonWebApp(String label, String url) { + public static WebAppButton webAppButton(@NotNull String label, @NotNull String url) { return new WebAppButton(label, url); } diff --git a/telegram-sender/pom.xml b/telegram-sender/pom.xml new file mode 100644 index 0000000..2d73a42 --- /dev/null +++ b/telegram-sender/pom.xml @@ -0,0 +1,45 @@ + + + + dev.struchkov.godfather.telegram + telegram-bot + 0.0.26 + + 4.0.0 + + telegram-sender + + + 17 + 17 + + + + + dev.struchkov.godfather.telegram + telegram-domain + + + dev.struchkov.godfather.telegram + telegram-core + + + + dev.struchkov.godfather + bot-context + + + + dev.struchkov.haiti + haiti-utils + + + + org.telegram + telegrambots + + + + \ No newline at end of file diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java b/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java similarity index 100% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java rename to telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java b/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java similarity index 55% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java rename to telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java index e1d5e74..82171fc 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java +++ b/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java @@ -2,9 +2,11 @@ package dev.struchkov.godfather.telegram.service; import dev.struchkov.godfather.context.domain.BoxAnswer; import dev.struchkov.godfather.context.service.sender.SendType; -import dev.struchkov.godfather.context.service.sender.Sending; -import dev.struchkov.godfather.telegram.TelegramConnect; +import dev.struchkov.godfather.telegram.context.SenderStorageService; +import dev.struchkov.godfather.telegram.context.TelegramConnect; +import dev.struchkov.godfather.telegram.context.TelegramSending; import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard; +import dev.struchkov.godfather.telegram.utils.KeyBoardConvert; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,61 +17,82 @@ import org.telegram.telegrambots.meta.bots.AbsSender; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; -import java.util.HashMap; -import java.util.Map; +import java.util.Optional; -import static dev.struchkov.godfather.telegram.utils.KeyBoardConvert.convertInlineKeyBoard; -import static dev.struchkov.godfather.telegram.utils.KeyBoardConvert.convertKeyBoard; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static dev.struchkov.haiti.utils.Inspector.isNotNull; -public class TelegramSender implements Sending { +public class TelegramSender implements TelegramSending { private static final Logger log = LoggerFactory.getLogger(TelegramSender.class); private static final String ERROR_REPLACE_MESSAGE = "Bad Request: message to edit not found"; private final AbsSender absSender; - private final Map lastMessageId = new HashMap<>(); private SendPreProcessing sendPreProcessing; + private SenderStorageService senderStorageService; public TelegramSender(TelegramConnect telegramConnect) { - this.absSender = telegramConnect.getAdsSender(); + this.absSender = telegramConnect.getAbsSender(); + } + + public TelegramSender(TelegramConnect telegramConnect, SenderStorageService senderStorageService) { + this.absSender = telegramConnect.getAbsSender(); + this.senderStorageService = senderStorageService; } public void setSendPreProcessing(SendPreProcessing sendPreProcessing) { this.sendPreProcessing = sendPreProcessing; } + public void setSenderRepository(SenderStorageService senderStorageService) { + this.senderStorageService = senderStorageService; + } + public void send(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer) { + sendBoxAnswer(telegramId, boxAnswer, true); + } + + @Override + public void sendNotSave(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer) { + sendBoxAnswer(telegramId, boxAnswer, false); + } + + private void sendBoxAnswer(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer, boolean saveMessageId) { isNotNull(telegramId, boxAnswer); try { - if (boxAnswer.isReplace() && lastMessageId.containsKey(telegramId)) { - replaceMessage(telegramId, boxAnswer); + if (boxAnswer.isReplace() && checkNotNull(senderStorageService)) { + final Optional optLastId = senderStorageService.getLastSendMessage(telegramId); + if (optLastId.isPresent()) { + replaceMessage(telegramId, optLastId.get(), boxAnswer); + } else { + sendMessage(telegramId, boxAnswer, saveMessageId); + } } else { - sendMessage(telegramId, boxAnswer); + sendMessage(telegramId, boxAnswer, saveMessageId); } } catch (TelegramApiRequestException e) { log.error(e.getApiResponse()); if (ERROR_REPLACE_MESSAGE.equals(e.getApiResponse())) { - sendMessage(telegramId, boxAnswer); + sendMessage(telegramId, boxAnswer, saveMessageId); } } catch (TelegramApiException e) { log.error(e.getMessage()); } } - private void replaceMessage(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer) throws TelegramApiException { + private void replaceMessage(@NotNull Long telegramId, @NotNull Integer lastMessageId, @NotNull BoxAnswer boxAnswer) throws TelegramApiException { final EditMessageText editMessageText = new EditMessageText(); editMessageText.setChatId(String.valueOf(telegramId)); - editMessageText.setMessageId(lastMessageId.get(telegramId)); + editMessageText.setMessageId(lastMessageId); editMessageText.enableMarkdown(true); editMessageText.setText(boxAnswer.getMessage()); - editMessageText.setReplyMarkup(convertInlineKeyBoard((InlineKeyBoard) boxAnswer.getKeyBoard())); + editMessageText.setReplyMarkup(KeyBoardConvert.convertInlineKeyBoard((InlineKeyBoard) boxAnswer.getKeyBoard())); absSender.execute(editMessageText); } - private void sendMessage(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer) { + private void sendMessage(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer, boolean saveMessageId) { final SendMessage sendMessage = new SendMessage(); sendMessage.enableMarkdown(true); sendMessage.setChatId(String.valueOf(telegramId)); @@ -78,10 +101,12 @@ public class TelegramSender implements Sending { ? sendPreProcessing.pretreatment(boxAnswer.getMessage()) : boxAnswer.getMessage() ); - sendMessage.setReplyMarkup(convertKeyBoard(boxAnswer.getKeyBoard())); + sendMessage.setReplyMarkup(KeyBoardConvert.convertKeyBoard(boxAnswer.getKeyBoard())); try { final Message execute = absSender.execute(sendMessage); - lastMessageId.put(telegramId, execute.getMessageId()); + if (checkNotNull(senderStorageService) && saveMessageId) { + senderStorageService.saveLastSendMessage(telegramId, execute.getMessageId()); + } } catch (TelegramApiRequestException e) { log.error(e.getApiResponse()); } catch (TelegramApiException e) { diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java b/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java similarity index 95% rename from telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java rename to telegram-sender/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java index c59dc98..dfd0441 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java +++ b/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java @@ -24,6 +24,9 @@ import org.telegram.telegrambots.meta.api.objects.webapp.WebAppInfo; import java.util.List; +import static dev.struchkov.haiti.context.exception.ConvertException.convertException; +import static dev.struchkov.haiti.utils.Inspector.isNull; + public final class KeyBoardConvert { private KeyBoardConvert() { @@ -130,7 +133,7 @@ public final class KeyBoardConvert { case SimpleButton.TYPE -> { final SimpleButton simpleButton = (SimpleButton) keyBoardButton; button.setText(simpleButton.getLabel()); - Inspector.isNull(simpleButton.getCallbackData(), ConvertException.supplier("CallbackData поддерживает только Inline клавитаура")); + isNull(simpleButton.getCallbackData(), convertException("CallbackData поддерживает только Inline клавитаура")); } case WebAppButton.TYPE -> { final WebAppButton webAppButton = (WebAppButton) keyBoardButton; diff --git a/telegram/pom.xml b/telegram/pom.xml new file mode 100644 index 0000000..e5d250c --- /dev/null +++ b/telegram/pom.xml @@ -0,0 +1,36 @@ + + + + dev.struchkov.godfather.telegram + telegram-bot + 0.0.26 + + 4.0.0 + + telegram + + + 17 + 17 + + + + + dev.struchkov.godfather.telegram + telegram-core + + + dev.struchkov.godfather.telegram + telegram-consumer + ${project.version} + + + dev.struchkov.godfather.telegram + telegram-sender + ${project.version} + + + + \ No newline at end of file