From 2f756579b9336a4694efa4640ac33ef0c082d5cc Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Mon, 25 Apr 2022 21:47:49 +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=BA=D0=BB=D0=B0=D0=B2=D0=B8=D0=B0=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- telegram-core/pom.xml | 3 +- .../domain/keyboard/InlineKeyBoard.java | 23 +++ .../domain/keyboard/MarkupKeyBoard.java | 50 ++++++ .../domain/keyboard/button/ButtonUrl.java | 21 +++ .../telegram/listen/TelegramSender.java | 147 ++++++++++++++---- 6 files changed, 211 insertions(+), 37 deletions(-) create mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java create mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java create mode 100644 telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ButtonUrl.java diff --git a/pom.xml b/pom.xml index 0a909b3..dad7316 100644 --- a/pom.xml +++ b/pom.xml @@ -33,8 +33,8 @@ UTF-8 UTF-8 - 0.0.3 - 5.7.1 + 0.0.4-SNAPSHOT + 6.0.1 3.9.0 1.6.12 diff --git a/telegram-core/pom.xml b/telegram-core/pom.xml index 3b37b4e..a8a39b9 100644 --- a/telegram-core/pom.xml +++ b/telegram-core/pom.xml @@ -5,11 +5,10 @@ dev.struchkov.godfather telegram-bot - 0.0.3 + 0.0.4-SNAPSHOT telegram-core - 0.0.3 Telegram Core Allows you to create bots for Telegram diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java new file mode 100644 index 0000000..fb17b6b --- /dev/null +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/InlineKeyBoard.java @@ -0,0 +1,23 @@ +package dev.struchkov.godfather.telegram.domain.keyboard; + +import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine; +import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoard; +import lombok.Builder; +import lombok.Singular; + +import java.util.List; + +public class InlineKeyBoard extends SimpleKeyBoard { + + public static final String TYPE = "INLINE"; + + @Builder + public InlineKeyBoard(@Singular("line") List lines) { + super(lines); + } + + @Override + public String getType() { + return TYPE; + } +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java new file mode 100644 index 0000000..5383829 --- /dev/null +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/MarkupKeyBoard.java @@ -0,0 +1,50 @@ +package dev.struchkov.godfather.telegram.domain.keyboard; + +import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine; +import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoard; +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; + +import java.util.List; + +@Getter +public class MarkupKeyBoard extends SimpleKeyBoard { + + public static final String TYPE = "MARKUP"; + + /** + * Скрыть меню после ответа или нет. + */ + private boolean oneTime = true; + + /** + * Изменяет размер клавиатуры по вертикали для оптимального соответствия (например, сделать клавиатуру меньше, если есть только два ряда кнопок). + */ + private boolean resizeKeyboard; + + private String inputFieldPlaceholder; + + @Builder + protected MarkupKeyBoard( + @Singular(value = "line") List keyBoardLines, + boolean oneTime, + boolean resizeKeyboard, + String inputFieldPlaceholder + ) { + super(keyBoardLines); + this.oneTime = oneTime; + this.resizeKeyboard = resizeKeyboard; + this.inputFieldPlaceholder = inputFieldPlaceholder; + } + + public boolean isOneTime() { + return oneTime; + } + + @Override + public String getType() { + return TYPE; + } + +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ButtonUrl.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ButtonUrl.java new file mode 100644 index 0000000..cc7acc6 --- /dev/null +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/domain/keyboard/button/ButtonUrl.java @@ -0,0 +1,21 @@ +package dev.struchkov.godfather.telegram.domain.keyboard.button; + +import dev.struchkov.godfather.context.domain.keyboard.KeyBoardButton; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ButtonUrl implements KeyBoardButton { + + public static final String TYPE = "URL"; + + private String label; + private String url; + + @Override + public String getType() { + return TYPE; + } + +} diff --git a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/TelegramSender.java b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/TelegramSender.java index 641e0bd..b986dec 100644 --- a/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/TelegramSender.java +++ b/telegram-core/src/main/java/dev/struchkov/godfather/telegram/listen/TelegramSender.java @@ -4,22 +4,32 @@ import dev.struchkov.godfather.context.domain.BoxAnswer; 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.button.KeyBoardButtonText; +import dev.struchkov.godfather.context.domain.keyboard.button.SimpleButton; +import dev.struchkov.godfather.context.domain.keyboard.simple.SimpleKeyBoard; import dev.struchkov.godfather.context.service.sender.SendType; import dev.struchkov.godfather.context.service.sender.Sending; +import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard; +import dev.struchkov.godfather.telegram.domain.keyboard.MarkupKeyBoard; +import dev.struchkov.godfather.telegram.domain.keyboard.button.ButtonUrl; import dev.struchkov.godfather.telegram.service.SendPreProcessing; import lombok.Setter; import lombok.extern.slf4j.Slf4j; 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.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboard; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; +import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; 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.List; -import java.util.stream.Collectors; +import java.util.Map; /** * TODO: Добавить описание класса. @@ -30,7 +40,7 @@ import java.util.stream.Collectors; public class TelegramSender implements Sending { private final AbsSender absSender; - + private Map map = new HashMap<>(); @Setter private SendPreProcessing sendPreProcessing; @@ -38,18 +48,30 @@ public class TelegramSender implements Sending { this.absSender = telegramConnect.getAdsSender(); } - public void send(Long integer, BoxAnswer boxAnswer) { - SendMessage sendMessage = new SendMessage(); - sendMessage.enableMarkdown(true); - sendMessage.setChatId(String.valueOf(integer)); - sendMessage.setText( - sendPreProcessing != null - ? sendPreProcessing.pretreatment(boxAnswer.getMessage()) - : boxAnswer.getMessage() - ); - sendMessage.setReplyMarkup(convertKeyBoard(boxAnswer.getKeyBoard())); + public void send(Long telegramId, BoxAnswer boxAnswer) { try { - absSender.execute(sendMessage); + if (boxAnswer.isReplace() && map.containsKey(telegramId)) { + final EditMessageText editMessageText = new EditMessageText(); + editMessageText.setChatId(String.valueOf(telegramId)); + editMessageText.setMessageId(map.get(telegramId)); + editMessageText.enableMarkdown(true); + editMessageText.setText(boxAnswer.getMessage()); + editMessageText.setReplyMarkup(convertInlineKeyBoard((InlineKeyBoard) boxAnswer.getKeyBoard())); + absSender.execute(editMessageText); + } else { + 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(convertKeyBoard(boxAnswer.getKeyBoard())); + + final Message execute = absSender.execute(sendMessage); + map.put(telegramId, execute.getMessageId()); + } } catch (TelegramApiRequestException e) { log.error(e.getApiResponse()); } catch (TelegramApiException e) { @@ -59,31 +81,90 @@ public class TelegramSender implements Sending { private ReplyKeyboard convertKeyBoard(KeyBoard keyBoard) { if (keyBoard != null) { - final InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); - inlineKeyboardMarkup.setKeyboard( - keyBoard.getKeyBoardLines() - .stream() - .map(this::convertLint) - .toList() - ); - return inlineKeyboardMarkup; + switch (keyBoard.getType()) { + case InlineKeyBoard.TYPE: + return convertInlineKeyBoard((InlineKeyBoard) keyBoard); + case MarkupKeyBoard.TYPE: + return convertMarkupKeyBoard((MarkupKeyBoard) keyBoard); + case SimpleKeyBoard.TYPE: + return convertSimpleKeyBoard((SimpleKeyBoard) keyBoard); + } } - return null; + throw new RuntimeException("Ошибка преобразования клавиаутры"); } - private List convertLint(KeyBoardLine line) { - return line.getKeyBoardButtons().stream().map(this::convertButton).collect(Collectors.toList()); + private ReplyKeyboard convertSimpleKeyBoard(SimpleKeyBoard keyBoard) { + final ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup(); + keyboardMarkup.setKeyboard( + keyBoard.getLines().stream() + .map(this::convertMarkupLine) + .toList() + ); + return keyboardMarkup; } - private InlineKeyboardButton convertButton(KeyBoardButton button) { - InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); - switch (button.getType()) { - case TEXT: - KeyBoardButtonText keyBoardButtonText = (KeyBoardButtonText) button; - inlineKeyboardButton.setText(keyBoardButtonText.getLabel()); - inlineKeyboardButton.setCallbackData(keyBoardButtonText.getLabel()); + private ReplyKeyboard convertMarkupKeyBoard(MarkupKeyBoard keyBoard) { + final ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup(); + keyboardMarkup.setOneTimeKeyboard(keyBoard.isOneTime()); + keyboardMarkup.setInputFieldPlaceholder(keyBoard.getInputFieldPlaceholder()); + keyboardMarkup.setResizeKeyboard(keyBoard.isResizeKeyboard()); + keyboardMarkup.setKeyboard( + keyBoard.getLines().stream() + .map(this::convertMarkupLine) + .toList() + ); + return keyboardMarkup; + } + + private InlineKeyboardMarkup convertInlineKeyBoard(InlineKeyBoard keyBoard) { + final InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); + inlineKeyboardMarkup.setKeyboard( + keyBoard.getLines().stream() + .map(this::convertInlineLine) + .toList() + ); + return inlineKeyboardMarkup; + } + + private List convertInlineLine(KeyBoardLine line) { + return line.getButtons().stream().map(this::convertInlineButton).toList(); + } + + private KeyboardRow convertMarkupLine(KeyBoardLine line) { + final List buttons = line.getButtons().stream().map(this::convertMarkupButton).toList(); + return new KeyboardRow(buttons); + } + + private InlineKeyboardButton convertInlineButton(KeyBoardButton keyBoardButton) { + final InlineKeyboardButton button = new InlineKeyboardButton(); + switch (keyBoardButton.getType()) { + case SimpleButton.TYPE -> { + final SimpleButton simpleButton = (SimpleButton) keyBoardButton; + final String callbackData = simpleButton.getCallbackData(); + final String label = simpleButton.getLabel(); + button.setText(label); + button.setCallbackData(callbackData != null ? callbackData : label); + } + case ButtonUrl.TYPE -> { + final ButtonUrl buttonUrl = (ButtonUrl) keyBoardButton; + button.setUrl(buttonUrl.getUrl()); + button.setText(buttonUrl.getLabel()); + } + default -> throw new RuntimeException("Ошибка преобразования кнопки"); } - return inlineKeyboardButton; + return button; + } + + private KeyboardButton convertMarkupButton(KeyBoardButton keyBoardButton) { + final KeyboardButton button = new KeyboardButton(); + switch (keyBoardButton.getType()) { + case SimpleButton.TYPE -> { + final SimpleButton simpleButton = (SimpleButton) keyBoardButton; + button.setText(simpleButton.getLabel()); + } + default -> throw new RuntimeException("Ошибка преобразования кнопки"); + } + return button; } public void send(Long integer, Long integer1, BoxAnswer boxAnswer) {