From efe3e042e2b97875d5590b30dd0ca7bea6a97800 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 26 Mar 2023 22:08:32 +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=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/context/BoxAnswerPayload.java | 1 + .../quarkus/sender/TelegramSender.java | 77 ++++++++++++------- .../simple/sender/TelegramSender.java | 64 +++++++++++---- 3 files changed, 98 insertions(+), 44 deletions(-) diff --git a/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java b/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java index d441fcb..2b54734 100644 --- a/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java +++ b/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java @@ -8,6 +8,7 @@ public final class BoxAnswerPayload { public static final ContextKey DISABLE_WEB_PAGE_PREVIEW = ContextKey.of("DISABLE_WEB_PAGE_PREVIEW", Boolean.class); public static final ContextKey DISABLE_NOTIFICATION = ContextKey.of("DISABLE_NOTIFICATION", Boolean.class); + public static final ContextKey ENABLE_MARKDOWN = ContextKey.of("DISABLE_MARKDOWN", Boolean.class); public static final ContextKey INVOICE = ContextKey.of("INVOICE", SendInvoice.class); private BoxAnswerPayload() { diff --git a/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java b/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java index 5ff907b..20f24c2 100644 --- a/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java +++ b/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java @@ -6,10 +6,10 @@ import dev.struchkov.godfather.quarkus.domain.SentBox; import dev.struchkov.godfather.quarkus.domain.action.PreSendProcessing; import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard; import dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload; -import dev.struchkov.godfather.telegram.main.sender.util.KeyBoardConvert; import dev.struchkov.godfather.telegram.quarkus.context.repository.SenderRepository; import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramSending; +import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -24,13 +24,16 @@ import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.DISABLE_NOTIFICATION; import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.DISABLE_WEB_PAGE_PREVIEW; +import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.ENABLE_MARKDOWN; import static dev.struchkov.godfather.telegram.main.sender.util.KeyBoardConvert.convertInlineKeyBoard; +import static dev.struchkov.godfather.telegram.main.sender.util.KeyBoardConvert.convertKeyBoard; import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static java.lang.Boolean.TRUE; import static java.util.concurrent.CompletableFuture.completedFuture; @@ -100,10 +103,16 @@ public class TelegramSender implements TelegramSending { v -> { final EditMessageText editMessageText = new EditMessageText(); editMessageText.setInlineMessageId(inlineMessageId); - editMessageText.enableMarkdown(true); editMessageText.setText(boxAnswer.getMessage()); editMessageText.setReplyMarkup(convertInlineKeyBoard((InlineKeyBoard) boxAnswer.getKeyBoard())); + boxAnswer.getPayLoad(ENABLE_MARKDOWN).ifPresent(editMessageText::enableMarkdown); + boxAnswer.getPayLoad(DISABLE_WEB_PAGE_PREVIEW).ifPresent( + isDisable -> { + if (TRUE.equals(isDisable)) editMessageText.disableWebPagePreview(); + } + ); + return Uni.createFrom().completionStage(executeAsync(editMessageText)) .onFailure(TelegramApiRequestException.class).call( ex -> { @@ -184,40 +193,54 @@ public class TelegramSender implements TelegramSending { private Uni sendMessage(@NotNull String telegramId, @NotNull BoxAnswer boxAnswer, boolean saveMessageId) { return Uni.createFrom().voidItem() + .onItem().transformToMulti(v -> splitBoxAnswerByMessageLength(boxAnswer, 4000)) .onItem().transformToUni( - v -> { - final SendMessage sendMessage = new SendMessage(); - sendMessage.enableMarkdown(true); - sendMessage.setChatId(telegramId); - sendMessage.setText(boxAnswer.getMessage()); - sendMessage.setReplyMarkup(KeyBoardConvert.convertKeyBoard(boxAnswer.getKeyBoard())); - - boxAnswer.getPayLoad(DISABLE_NOTIFICATION).ifPresent( - isDisable -> { - if (TRUE.equals(isDisable)) sendMessage.disableNotification(); - } - ); - - boxAnswer.getPayLoad(DISABLE_WEB_PAGE_PREVIEW).ifPresent( - isDisable -> { - if (TRUE.equals(isDisable)) sendMessage.disableWebPagePreview(); - } - ); - return Uni.createFrom().completionStage(executeAsync(sendMessage)) - .onFailure(TelegramApiRequestException.class).invoke(t -> log.error(((TelegramApiRequestException) t).getApiResponse())) - .onFailure().invoke(t -> log.error(t.getMessage(), t)); - } - ).onItem().ifNotNull().call(answerMessage -> { + sendMessage -> Uni.createFrom().completionStage(executeAsync(sendMessage)) + .onFailure(TelegramApiRequestException.class).invoke(t -> log.error(((TelegramApiRequestException) t).getApiResponse())) + .onFailure().invoke(t -> log.error(t.getMessage(), t)) + ).concatenate().collect().asList() + .call(answerMessages -> { if (checkNotNull(senderRepository) && saveMessageId) { - return senderRepository.saveLastSendMessage(telegramId, answerMessage.getMessageId().toString()); + return senderRepository.saveLastSendMessage(telegramId, answerMessages.get(answerMessages.size() - 1).getMessageId().toString()); } return Uni.createFrom().nullItem(); }) .onItem().ifNotNull().transformToUni( - answerMessage -> Uni.createFrom().optional(SentBox.optional(telegramId, answerMessage.getMessageId().toString(), boxAnswer, boxAnswer)) + answerMessages -> Uni.createFrom().optional(SentBox.optional(telegramId, answerMessages.get(answerMessages.size() - 1).getMessageId().toString(), boxAnswer, boxAnswer)) ); } + public Multi splitBoxAnswerByMessageLength(BoxAnswer boxAnswer, int maxMessageLength) { + final List split = new ArrayList<>(); + String message = boxAnswer.getMessage(); + + while (message.length() > maxMessageLength) { + String subMessage = message.substring(0, maxMessageLength); + message = message.substring(maxMessageLength); + split.add(createNewBoxAnswer(boxAnswer, subMessage)); + } + + split.add(createNewBoxAnswer(boxAnswer, message)); + + return Multi.createFrom().iterable(split); + } + + private SendMessage createNewBoxAnswer(BoxAnswer boxAnswer, String subMessage) { + final SendMessage sendMessage = new SendMessage(); + sendMessage.setChatId(boxAnswer.getRecipientPersonId()); + sendMessage.setText(subMessage); + sendMessage.setReplyMarkup(convertKeyBoard(boxAnswer.getKeyBoard())); + + boxAnswer.getPayLoad(ENABLE_MARKDOWN).ifPresent(sendMessage::enableMarkdown); + boxAnswer.getPayLoad(DISABLE_WEB_PAGE_PREVIEW).ifPresent(isDisable -> { + if (TRUE.equals(isDisable)) sendMessage.disableWebPagePreview(); + }); + boxAnswer.getPayLoad(DISABLE_NOTIFICATION).ifPresent(isDisable -> { + if (TRUE.equals(isDisable)) sendMessage.disableNotification(); + }); + return sendMessage; + } + private CompletableFuture executeAsync(SendMessage sendMessage) { try { return absSender.executeAsync(sendMessage); diff --git a/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java b/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java index 75c2c50..068e1bb 100644 --- a/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java +++ b/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java @@ -27,6 +27,7 @@ import java.util.Optional; import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.DISABLE_NOTIFICATION; import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.DISABLE_WEB_PAGE_PREVIEW; +import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.ENABLE_MARKDOWN; import static dev.struchkov.godfather.telegram.main.sender.util.KeyBoardConvert.convertInlineKeyBoard; import static dev.struchkov.godfather.telegram.main.sender.util.KeyBoardConvert.convertKeyBoard; import static dev.struchkov.haiti.utils.Checker.checkNotNull; @@ -149,9 +150,14 @@ public class TelegramSender implements TelegramSending { final EditMessageText editMessageText = new EditMessageText(); editMessageText.setChatId(telegramId); editMessageText.setMessageId(parseInt(replaceMessageId)); - editMessageText.enableMarkdown(true); editMessageText.setText(boxAnswer.getMessage()); editMessageText.setReplyMarkup(convertInlineKeyBoard((InlineKeyBoard) boxAnswer.getKeyBoard())); + + boxAnswer.getPayLoad(ENABLE_MARKDOWN).ifPresent(editMessageText::enableMarkdown); + boxAnswer.getPayLoad(DISABLE_WEB_PAGE_PREVIEW).ifPresent(isDisable -> { + if (TRUE.equals(isDisable)) editMessageText.disableWebPagePreview(); + }); + try { absSender.execute(editMessageText); return SentBox.optional(telegramId, replaceMessageId, preparedAnswer, boxAnswer); @@ -167,31 +173,55 @@ public class TelegramSender implements TelegramSending { } private Optional sendMessage(@NotNull String telegramId, @NotNull BoxAnswer boxAnswer, BoxAnswer preparedAnswer, boolean saveMessageId) { + final List sendMessages = splitBoxAnswerByMessageLength(boxAnswer, 4000); + Message execute = null; + for (SendMessage sendMessage : sendMessages) { + try { + execute = absSender.execute(sendMessage); + } catch (TelegramApiRequestException e) { + log.error(e.getApiResponse()); + } catch (TelegramApiException e) { + log.error(e.getMessage()); + } + } + if (checkNotNull(execute)) { + if (checkNotNull(senderRepository) && saveMessageId) { + senderRepository.saveLastSendMessage(telegramId, execute.getMessageId().toString()); + } + return SentBox.optional(telegramId, execute.getMessageId().toString(), preparedAnswer, boxAnswer); + } + return Optional.empty(); + } + + public List splitBoxAnswerByMessageLength(BoxAnswer boxAnswer, int maxMessageLength) { + final List split = new ArrayList<>(); + String message = boxAnswer.getMessage(); + + while (message.length() > maxMessageLength) { + String subMessage = message.substring(0, maxMessageLength); + message = message.substring(maxMessageLength); + split.add(createNewBoxAnswer(boxAnswer, subMessage)); + } + + split.add(createNewBoxAnswer(boxAnswer, message)); + + return split; + } + + private SendMessage createNewBoxAnswer(BoxAnswer boxAnswer, String subMessage) { final SendMessage sendMessage = new SendMessage(); - sendMessage.enableMarkdown(true); - sendMessage.setChatId(telegramId); - sendMessage.setText(boxAnswer.getMessage()); + sendMessage.setChatId(boxAnswer.getRecipientPersonId()); + sendMessage.setText(subMessage); sendMessage.setReplyMarkup(convertKeyBoard(boxAnswer.getKeyBoard())); + boxAnswer.getPayLoad(ENABLE_MARKDOWN).ifPresent(sendMessage::enableMarkdown); boxAnswer.getPayLoad(DISABLE_WEB_PAGE_PREVIEW).ifPresent(isDisable -> { if (TRUE.equals(isDisable)) sendMessage.disableWebPagePreview(); }); boxAnswer.getPayLoad(DISABLE_NOTIFICATION).ifPresent(isDisable -> { if (TRUE.equals(isDisable)) sendMessage.disableNotification(); }); - - try { - final Message execute = absSender.execute(sendMessage); - if (checkNotNull(senderRepository) && saveMessageId) { - senderRepository.saveLastSendMessage(telegramId, execute.getMessageId().toString()); - } - return SentBox.optional(telegramId, execute.getMessageId().toString(), preparedAnswer, boxAnswer); - } catch (TelegramApiRequestException e) { - log.error(e.getApiResponse()); - } catch (TelegramApiException e) { - log.error(e.getMessage()); - } - return Optional.empty(); + return sendMessage; } @Override