From 95a8084caebf674bd2508cd288ff3285bd18c52e Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Tue, 2 Aug 2022 21:56:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 28 +++- telegram-consumer/pom.xml | 2 +- .../listen/EventDistributorService.java | 25 +--- telegram-context/pom.xml | 2 +- telegram-core/pom.xml | 2 +- .../telegram/convert/CommandConvert.java | 50 ------- .../telegram/convert/MessageMailConvert.java | 24 +++- .../godfather/telegram/utils/Attachments.java | 17 +++ telegram-domain/pom.xml | 2 +- .../domain/attachment/CommandAttachment.java | 50 +++++++ .../attachment/TelegramAttachmentType.java | 3 +- .../telegram/domain/event/Command.java | 80 ----------- .../domain/keyboard/MarkupKeyBoard.java | 19 +++ telegram-sender/pom.xml | 34 +---- .../telegram-quarkus-reactive-sender/pom.xml | 37 +++++ .../quarkus/sender}/SendPreProcessing.java | 2 +- .../quarkus/sender/SenderStorageService.java | 13 ++ .../quarkus/sender/TelegramSender.java | 129 ++++++++++++++++++ telegram-sender/telegram-sender-core/pom.xml | 32 +++++ .../sender/util}/KeyBoardConvert.java | 7 +- .../telegram-simple-sender/pom.xml | 38 ++++++ .../sender/service/SendPreProcessing.java | 13 ++ .../sender}/service/TelegramSender.java | 4 +- telegram/pom.xml | 6 +- 24 files changed, 416 insertions(+), 203 deletions(-) delete mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/CommandConvert.java create mode 100644 telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/CommandAttachment.java delete mode 100644 telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java create mode 100644 telegram-sender/telegram-quarkus-reactive-sender/pom.xml rename telegram-sender/{src/main/java/dev/struchkov/godfather/telegram/service => telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender}/SendPreProcessing.java (78%) create mode 100644 telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SenderStorageService.java create mode 100644 telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java create mode 100644 telegram-sender/telegram-sender-core/pom.xml rename telegram-sender/{src/main/java/dev/struchkov/godfather/telegram/utils => telegram-sender-core/src/main/java/dev/struchkov/godfather/telegram/sender/util}/KeyBoardConvert.java (95%) create mode 100644 telegram-sender/telegram-simple-sender/pom.xml create mode 100644 telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/SendPreProcessing.java rename telegram-sender/{src/main/java/dev/struchkov/godfather/telegram => telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender}/service/TelegramSender.java (97%) diff --git a/pom.xml b/pom.xml index a28fe53..40ad1e8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ dev.struchkov.godfather.telegram telegram-bot - 0.0.26 + 0.0.30 pom @@ -38,10 +38,10 @@ UTF-8 UTF-8 - 0.0.22 + 0.0.24 6.1.0 - 1.3.0 + 1.4.0 3.10.1 1.6.13 @@ -68,6 +68,28 @@ ${project.version} + + dev.struchkov.godfather.telegram + telegram-consumer + ${project.version} + + + + dev.struchkov.godfather.telegram + telegram-sender-core + ${project.version} + + + dev.struchkov.godfather.telegram + telegram-quarkus-reactive-sender + ${project.version} + + + dev.struchkov.godfather.telegram + telegram-simple-sender + ${project.version} + + dev.struchkov.godfather bot-context diff --git a/telegram-consumer/pom.xml b/telegram-consumer/pom.xml index 83126cf..39207ec 100644 --- a/telegram-consumer/pom.xml +++ b/telegram-consumer/pom.xml @@ -5,7 +5,7 @@ telegram-bot dev.struchkov.godfather.telegram - 0.0.26 + 0.0.30 4.0.0 diff --git a/telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java b/telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java index 4815850..4662299 100644 --- a/telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java +++ b/telegram-consumer/src/main/java/dev/struchkov/godfather/telegram/listen/EventDistributorService.java @@ -5,18 +5,15 @@ 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; @@ -25,8 +22,6 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; -import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; - /** * TODO: Добавить описание класса. * @@ -46,15 +41,9 @@ public class EventDistributorService implements EventDistributor { if (update.getMessage() != null) { final Message message = update.getMessage(); if (!isEvent(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; - } + getHandler(Mail.TYPE) + .ifPresent(eventProviders -> eventProviders.forEach(eventProvider -> eventProvider.handle(MessageMailConvert.apply(message)))); + return; } } if (update.getCallbackQuery() != null) { @@ -99,14 +88,6 @@ public class EventDistributorService implements EventDistributor { } } - 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 index d4e3974..12b0c84 100644 --- a/telegram-context/pom.xml +++ b/telegram-context/pom.xml @@ -5,7 +5,7 @@ telegram-bot dev.struchkov.godfather.telegram - 0.0.26 + 0.0.30 4.0.0 diff --git a/telegram-core/pom.xml b/telegram-core/pom.xml index ae512a3..2ac5087 100644 --- a/telegram-core/pom.xml +++ b/telegram-core/pom.xml @@ -5,7 +5,7 @@ dev.struchkov.godfather.telegram telegram-bot - 0.0.26 + 0.0.30 telegram-core 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 deleted file mode 100644 index e3835bb..0000000 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/convert/CommandConvert.java +++ /dev/null @@ -1,50 +0,0 @@ -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 6d1e71d..c648303 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 @@ -2,11 +2,13 @@ package dev.struchkov.godfather.telegram.convert; import dev.struchkov.godfather.context.domain.content.Mail; import dev.struchkov.godfather.context.domain.content.attachment.Attachment; +import dev.struchkov.godfather.telegram.domain.attachment.CommandAttachment; import dev.struchkov.godfather.telegram.domain.attachment.ContactAttachment; import dev.struchkov.godfather.telegram.domain.attachment.DocumentAttachment; import dev.struchkov.godfather.telegram.domain.attachment.LinkAttachment; import dev.struchkov.godfather.telegram.domain.attachment.Picture; import dev.struchkov.godfather.telegram.domain.attachment.PictureGroupAttachment; +import dev.struchkov.haiti.utils.Strings; import org.telegram.telegrambots.meta.api.objects.Contact; import org.telegram.telegrambots.meta.api.objects.Document; import org.telegram.telegrambots.meta.api.objects.Message; @@ -49,7 +51,7 @@ public final class MessageMailConvert { final List entities = message.getEntities(); if (entities != null) { - mail.addAttachments(convertAttachments(entities)); + mail.addAttachments(convertAttachments(message)); } if (message.getReplyToMessage() != null) { @@ -111,10 +113,11 @@ public final class MessageMailConvert { return Optional.empty(); } - private static List convertAttachments(List entities) { + private static List convertAttachments(Message message) { + final List entities = message.getEntities(); if (checkNotEmpty(entities)) { return entities.stream() - .map(MessageMailConvert::convertEntity) + .map(entity -> convertEntity(message, entity)) .filter(Optional::isPresent) .map(Optional::get) .toList(); @@ -122,11 +125,24 @@ public final class MessageMailConvert { return Collections.emptyList(); } - private static Optional convertEntity(MessageEntity entity) { + private static Optional convertEntity(Message message, MessageEntity entity) { switch (entity.getType()) { case "url" -> { return Optional.of(new LinkAttachment(entity.getText())); } + case "bot_command" -> { + final String commandValue = entity.getText(); + String commandArg = message.getText().replace(commandValue, ""); + if (checkNotEmpty(commandArg)) { + commandArg = commandArg.substring(1); + } + final CommandAttachment commandAttachment = new CommandAttachment(); + commandAttachment.setValue(commandValue); + commandAttachment.setCommandType(commandValue.replace("/", "")); + commandAttachment.setArg(Strings.EMPTY.equals(commandArg) ? null : commandArg); + commandAttachment.setRawValue(message.getText()); + return Optional.of(commandAttachment); + } } return Optional.empty(); } diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/Attachments.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/Attachments.java index 7bc161b..55a75d9 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/Attachments.java +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/utils/Attachments.java @@ -1,6 +1,7 @@ package dev.struchkov.godfather.telegram.utils; import dev.struchkov.godfather.context.domain.content.attachment.Attachment; +import dev.struchkov.godfather.telegram.domain.attachment.CommandAttachment; import dev.struchkov.godfather.telegram.domain.attachment.ContactAttachment; import dev.struchkov.godfather.telegram.domain.attachment.DocumentAttachment; import dev.struchkov.godfather.telegram.domain.attachment.LinkAttachment; @@ -89,6 +90,17 @@ public final class Attachments { return Optional.empty(); } + public static Optional findFirstCommand(Collection attachments) { + if (checkNotEmpty(attachments)) { + for (Attachment attachment : attachments) { + if (isCommand(attachment)) { + return Optional.of((CommandAttachment) attachment); + } + } + } + return Optional.empty(); + } + public static boolean hasDocument(Collection attachments) { isNotNull(attachments); for (Attachment attachment : attachments) { @@ -99,6 +111,11 @@ public final class Attachments { return false; } + public static boolean isCommand(Attachment attachment) { + isNotNull(attachment); + return TelegramAttachmentType.COMMAND.name().equals(attachment.getType()); + } + public static boolean isDocument(Attachment attachment) { isNotNull(attachment); return TelegramAttachmentType.DOCUMENT.name().equals(attachment.getType()); diff --git a/telegram-domain/pom.xml b/telegram-domain/pom.xml index 72c9025..08a9d4d 100644 --- a/telegram-domain/pom.xml +++ b/telegram-domain/pom.xml @@ -5,7 +5,7 @@ telegram-bot dev.struchkov.godfather.telegram - 0.0.26 + 0.0.30 4.0.0 diff --git a/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/CommandAttachment.java b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/CommandAttachment.java new file mode 100644 index 0000000..d7aa366 --- /dev/null +++ b/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/attachment/CommandAttachment.java @@ -0,0 +1,50 @@ +package dev.struchkov.godfather.telegram.domain.attachment; + +import dev.struchkov.godfather.context.domain.content.attachment.Attachment; + +import java.util.Optional; + +public class CommandAttachment extends Attachment { + + private String value; + private String commandType; + private String arg; + private String rawValue; + + 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 String getValue() { + return value; + } + + public Optional getArg() { + return Optional.ofNullable(arg); + } + + public String getCommandType() { + return commandType; + } + + public String getRawValue() { + return rawValue; + } + + @Override + public String getType() { + return TelegramAttachmentType.COMMAND.name(); + } +} diff --git a/telegram-domain/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 index 39e1784..4a43aac 100644 --- a/telegram-domain/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 @@ -5,6 +5,7 @@ public enum TelegramAttachmentType { DOCUMENT, CONTACT, PICTURE, - LINK + LINK, + COMMAND } 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 deleted file mode 100644 index 254909f..0000000 --- a/telegram-domain/src/main/java/dev/struchkov/godfather/telegram/domain/event/Command.java +++ /dev/null @@ -1,80 +0,0 @@ -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-domain/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 index 6657ef2..b665333 100644 --- a/telegram-domain/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 @@ -1,5 +1,6 @@ package dev.struchkov.godfather.telegram.domain.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.SimpleKeyBoard; @@ -7,6 +8,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoardLine.simpleLine; + public class MarkupKeyBoard extends SimpleKeyBoard { public static final String TYPE = "MARKUP"; @@ -34,6 +37,22 @@ public class MarkupKeyBoard extends SimpleKeyBoard { inputFieldPlaceholder = builder.inputFieldPlaceholder; } + public static MarkupKeyBoard markupKeyBoard(KeyBoardLine... lines) { + final Builder builder = new Builder(); + for (KeyBoardLine line : lines) { + builder.line(line); + } + return builder.build(); + } + + public static MarkupKeyBoard markupKeyBoard(KeyBoardButton... buttons) { + final Builder builder = new Builder(); + for (KeyBoardButton button : buttons) { + builder.line(simpleLine(button)); + } + return builder.build(); + } + public static Builder markupBuilder() { return new Builder(); } diff --git a/telegram-sender/pom.xml b/telegram-sender/pom.xml index 2d73a42..e5684a8 100644 --- a/telegram-sender/pom.xml +++ b/telegram-sender/pom.xml @@ -5,41 +5,21 @@ dev.struchkov.godfather.telegram telegram-bot - 0.0.26 + 0.0.30 4.0.0 telegram-sender + pom + + telegram-sender-core + telegram-quarkus-reactive-sender + telegram-simple-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-sender/telegram-quarkus-reactive-sender/pom.xml b/telegram-sender/telegram-quarkus-reactive-sender/pom.xml new file mode 100644 index 0000000..be5770e --- /dev/null +++ b/telegram-sender/telegram-quarkus-reactive-sender/pom.xml @@ -0,0 +1,37 @@ + + + + dev.struchkov.godfather.telegram + telegram-sender + 0.0.30 + + 4.0.0 + + telegram-quarkus-reactive-sender + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather.telegram + telegram-sender-core + + + dev.struchkov.godfather.telegram + telegram-context + + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + 2.24.1 + + + + \ No newline at end of file diff --git a/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java b/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SendPreProcessing.java similarity index 78% rename from telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java rename to telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SendPreProcessing.java index 1406c1f..c034feb 100644 --- a/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/SendPreProcessing.java +++ b/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SendPreProcessing.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.telegram.service; +package dev.struchkov.godfather.telegram.quarkus.sender; /** * // TODO: 18.09.2020 Добавить описание. diff --git a/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SenderStorageService.java b/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SenderStorageService.java new file mode 100644 index 0000000..31dcd54 --- /dev/null +++ b/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/SenderStorageService.java @@ -0,0 +1,13 @@ +package dev.struchkov.godfather.telegram.quarkus.sender; + +import io.smallrye.mutiny.Uni; + +public interface SenderStorageService { + + Uni getLastSendMessage(Long telegramId); + + Uni saveLastSendMessage(Long telegramId, Integer messageId); + + Uni removeLastSendMessage(Long telegramId); + +} diff --git a/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java b/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java new file mode 100644 index 0000000..bf416a3 --- /dev/null +++ b/telegram-sender/telegram-quarkus-reactive-sender/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java @@ -0,0 +1,129 @@ +package dev.struchkov.godfather.telegram.quarkus.sender; + +import dev.struchkov.godfather.context.domain.BoxAnswer; +import dev.struchkov.godfather.telegram.context.TelegramConnect; +import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard; +import dev.struchkov.godfather.telegram.sender.util.KeyBoardConvert; +import io.smallrye.mutiny.Uni; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText; +import org.telegram.telegrambots.meta.api.objects.Message; +import org.telegram.telegrambots.meta.bots.AbsSender; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; + +import static dev.struchkov.godfather.telegram.sender.util.KeyBoardConvert.convertInlineKeyBoard; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +public class TelegramSender { + + 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 SendPreProcessing sendPreProcessing; + private SenderStorageService senderStorageService; + + public TelegramSender(TelegramConnect telegramConnect) { + 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 Uni send(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer) { + return sendBoxAnswer(telegramId, boxAnswer, true); + } + + public Uni sendNotSave(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer) { + return sendBoxAnswer(telegramId, boxAnswer, false); + } + + private Uni sendBoxAnswer(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer, boolean saveMessageId) { + isNotNull(telegramId, boxAnswer); + + if (boxAnswer.isReplace() && checkNotNull(senderStorageService)) { + return senderStorageService.getLastSendMessage(telegramId) + .onItem().transformToUni( + lastId -> { + if (checkNotNull(lastId)) { + return replaceMessage(telegramId, lastId, boxAnswer); + } else { + return sendMessage(telegramId, boxAnswer, saveMessageId); + } + } + ); + } else { + return sendMessage(telegramId, boxAnswer, saveMessageId); + } + } + + private Uni replaceMessage(@NotNull Long telegramId, @NotNull Integer lastMessageId, @NotNull BoxAnswer boxAnswer) { + return Uni.createFrom().voidItem() + .onItem().transformToUni( + v -> { + final EditMessageText editMessageText = new EditMessageText(); + editMessageText.setChatId(String.valueOf(telegramId)); + editMessageText.setMessageId(lastMessageId); + editMessageText.enableMarkdown(true); + editMessageText.setText(boxAnswer.getMessage()); + editMessageText.setReplyMarkup(convertInlineKeyBoard((InlineKeyBoard) boxAnswer.getKeyBoard())); + try { + absSender.execute(editMessageText); + } catch (TelegramApiException e) { + log.error(e.getMessage()); + } + return Uni.createFrom().voidItem(); + } + ); + } + + private Uni sendMessage(@NotNull Long telegramId, @NotNull BoxAnswer boxAnswer, boolean saveMessageId) { + return Uni.createFrom().voidItem() + .onItem().transformToUni( + v -> { + final SendMessage sendMessage = new SendMessage(); + sendMessage.enableMarkdown(true); + sendMessage.setChatId(String.valueOf(telegramId)); + sendMessage.setText( + sendPreProcessing != null + ? sendPreProcessing.pretreatment(boxAnswer.getMessage()) + : boxAnswer.getMessage() + ); + sendMessage.setReplyMarkup(KeyBoardConvert.convertKeyBoard(boxAnswer.getKeyBoard())); + + try { + final Message execute = absSender.execute(sendMessage); + if (checkNotNull(senderStorageService) && saveMessageId) { + return senderStorageService.saveLastSendMessage(telegramId, execute.getMessageId()); + } + } catch (TelegramApiRequestException e) { + log.error(e.getApiResponse()); + if (ERROR_REPLACE_MESSAGE.equals(e.getApiResponse())) { + return sendMessage(telegramId, boxAnswer, saveMessageId); + } + } catch (TelegramApiException e) { + log.error(e.getMessage()); + } + return Uni.createFrom().voidItem(); + } + ); + } + +} diff --git a/telegram-sender/telegram-sender-core/pom.xml b/telegram-sender/telegram-sender-core/pom.xml new file mode 100644 index 0000000..0d98eef --- /dev/null +++ b/telegram-sender/telegram-sender-core/pom.xml @@ -0,0 +1,32 @@ + + + + dev.struchkov.godfather.telegram + telegram-sender + 0.0.30 + + 4.0.0 + + telegram-sender-core + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather.telegram + telegram-domain + + + + org.telegram + telegrambots + + + + \ No newline at end of file diff --git a/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java b/telegram-sender/telegram-sender-core/src/main/java/dev/struchkov/godfather/telegram/sender/util/KeyBoardConvert.java similarity index 95% rename from telegram-sender/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java rename to telegram-sender/telegram-sender-core/src/main/java/dev/struchkov/godfather/telegram/sender/util/KeyBoardConvert.java index dfd0441..88c97e9 100644 --- a/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/utils/KeyBoardConvert.java +++ b/telegram-sender/telegram-sender-core/src/main/java/dev/struchkov/godfather/telegram/sender/util/KeyBoardConvert.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.telegram.utils; +package dev.struchkov.godfather.telegram.sender.util; import dev.struchkov.godfather.context.domain.keyboard.KeyBoard; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; @@ -24,9 +24,6 @@ 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() { @@ -133,7 +130,7 @@ public final class KeyBoardConvert { case SimpleButton.TYPE -> { final SimpleButton simpleButton = (SimpleButton) keyBoardButton; button.setText(simpleButton.getLabel()); - isNull(simpleButton.getCallbackData(), convertException("CallbackData поддерживает только Inline клавитаура")); + Inspector.isNull(simpleButton.getCallbackData(), ConvertException.convertException("CallbackData поддерживает только Inline клавитаура")); } case WebAppButton.TYPE -> { final WebAppButton webAppButton = (WebAppButton) keyBoardButton; diff --git a/telegram-sender/telegram-simple-sender/pom.xml b/telegram-sender/telegram-simple-sender/pom.xml new file mode 100644 index 0000000..3e3de4d --- /dev/null +++ b/telegram-sender/telegram-simple-sender/pom.xml @@ -0,0 +1,38 @@ + + + + dev.struchkov.godfather.telegram + telegram-sender + 0.0.30 + + 4.0.0 + + telegram-simple-sender + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather.telegram + telegram-sender-core + + + + dev.struchkov.godfather.telegram + telegram-core + + + + dev.struchkov.godfather + bot-context + + + + + \ No newline at end of file diff --git a/telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/SendPreProcessing.java b/telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/SendPreProcessing.java new file mode 100644 index 0000000..d37383f --- /dev/null +++ b/telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/SendPreProcessing.java @@ -0,0 +1,13 @@ +package dev.struchkov.godfather.telegram.sender.service; + +/** + * // TODO: 18.09.2020 Добавить описание. + * + * @author upagge 18.09.2020 + */ +@FunctionalInterface +public interface SendPreProcessing { + + String pretreatment(String messageText); + +} diff --git a/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java b/telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/TelegramSender.java similarity index 97% rename from telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java rename to telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/TelegramSender.java index 82171fc..bec12e5 100644 --- a/telegram-sender/src/main/java/dev/struchkov/godfather/telegram/service/TelegramSender.java +++ b/telegram-sender/telegram-simple-sender/src/main/java/dev/struchkov/godfather/telegram/sender/service/TelegramSender.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.telegram.service; +package dev.struchkov.godfather.telegram.sender.service; import dev.struchkov.godfather.context.domain.BoxAnswer; import dev.struchkov.godfather.context.service.sender.SendType; @@ -6,7 +6,7 @@ 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 dev.struchkov.godfather.telegram.sender.util.KeyBoardConvert; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/telegram/pom.xml b/telegram/pom.xml index e5d250c..5c3c4bc 100644 --- a/telegram/pom.xml +++ b/telegram/pom.xml @@ -5,7 +5,7 @@ dev.struchkov.godfather.telegram telegram-bot - 0.0.26 + 0.0.30 4.0.0 @@ -24,12 +24,10 @@ dev.struchkov.godfather.telegram telegram-consumer - ${project.version} dev.struchkov.godfather.telegram - telegram-sender - ${project.version} + telegram-simple-sender