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) {