diff --git a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/BotResponseImpl.java b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/BotResponseImpl.java index 4799156..b82dcb8 100644 --- a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/BotResponseImpl.java +++ b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/BotResponseImpl.java @@ -1,24 +1,13 @@ package ru.penkrat.stbf.impl.pengrad; -import java.lang.reflect.Field; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import com.google.gson.internal.reflect.ReflectionAccessor; import com.pengrad.telegrambot.TelegramBot; import com.pengrad.telegrambot.model.Update; -import com.pengrad.telegrambot.model.request.InlineKeyboardButton; -import com.pengrad.telegrambot.model.request.InlineKeyboardMarkup; -import com.pengrad.telegrambot.model.request.KeyboardButton; -import com.pengrad.telegrambot.model.request.ParseMode; -import com.pengrad.telegrambot.model.request.ReplyKeyboardMarkup; +import com.pengrad.telegrambot.model.request.*; import com.pengrad.telegrambot.request.DeleteMessage; import com.pengrad.telegrambot.request.EditMessageText; import com.pengrad.telegrambot.request.SendDocument; import com.pengrad.telegrambot.request.SendMessage; - import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import ru.penkrat.stbf.api.BotResponse; import ru.penkrat.stbf.api.Screen; @@ -27,125 +16,94 @@ import ru.penkrat.stbf.api.Screen; @RequiredArgsConstructor public class BotResponseImpl implements BotResponse { - private final Update update; + private final Update update; - private final TelegramBot telegramBot; + private final TelegramBot telegramBot; - @Override - public void send(Screen screen) { - log.debug("Send message: \n============\n{}\n============", screen.getText().trim()); + @Override + public void send(Screen screen) { + log.debug("Send message: \n============\n{}\n============", screen.getText().trim()); - SendMessage sendMessage = new SendMessage(chatId(), screen.getText().trim()) - .parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2) - .disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview()) - .disableNotification(screen.getScreenProperties().isDisableNotification()); + SendMessage sendMessage = new SendMessage(chatId(), screen.getText().trim()) + .parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2) + .disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview()) + .disableNotification(screen.getScreenProperties().isDisableNotification()); - if (screen.getKeyboard() instanceof KeyboardImpl) { - KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard(); - KeyboardButton[][] keyboard = kk.getKeyboard(); - InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard(); + if (screen.getKeyboard() instanceof KeyboardImpl) { + KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard(); + KeyboardButton[][] keyboard = kk.getKeyboard(); + InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard(); - if (inlineKeyboard != null && inlineKeyboard.length > 0) { - logKeyboard(inlineKeyboard); - sendMessage = sendMessage.replyMarkup(new InlineKeyboardMarkup(inlineKeyboard)); - } else if (keyboard != null && keyboard.length > 0) { - logKeyboard(keyboard); - sendMessage = sendMessage.replyMarkup(new ReplyKeyboardMarkup(keyboard)); - } else { - log.debug("No keyboard"); - } - } + if (log.isDebugEnabled()) { + log.debug("{}", kk.toFriendlyString()); + } - telegramBot.execute(sendMessage); - } + if (inlineKeyboard != null && inlineKeyboard.length > 0) { + sendMessage = sendMessage.replyMarkup(new InlineKeyboardMarkup(inlineKeyboard)); + } else if (keyboard != null && keyboard.length > 0) { + sendMessage = sendMessage.replyMarkup(new ReplyKeyboardMarkup(keyboard)); + } else { + log.debug("No keyboard"); + } + } - @Override - public void sendFile(String filename, byte[] data) { - telegramBot.execute(new SendDocument(chatId(), data).fileName(filename)); - } + telegramBot.execute(sendMessage); + } - @Override - @Deprecated - public void editMessage(String text) { - telegramBot.execute(new EditMessageText(chatId(), messageId(), text) - .parseMode(ParseMode.HTML) - .disableWebPagePreview(true)); - } + @Override + public void sendFile(String filename, byte[] data) { + telegramBot.execute(new SendDocument(chatId(), data).fileName(filename)); + } - @Override - public void edit(Screen screen) { - EditMessageText editMessage = new EditMessageText(chatId(), messageId(), screen.getText()) - .parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2) - .disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview()); + @Override + @Deprecated + public void editMessage(String text) { + telegramBot.execute(new EditMessageText(chatId(), messageId(), text) + .parseMode(ParseMode.HTML) + .disableWebPagePreview(true)); + } - if (screen.getKeyboard() instanceof KeyboardImpl) { - KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard(); - InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard(); + @Override + public void edit(Screen screen) { + EditMessageText editMessage = new EditMessageText(chatId(), messageId(), screen.getText()) + .parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2) + .disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview()); - if (inlineKeyboard != null && inlineKeyboard.length > 0) { - logKeyboard(inlineKeyboard); - editMessage = editMessage.replyMarkup(new InlineKeyboardMarkup(inlineKeyboard)); - } else { - log.debug("No keyboard"); - } - } + if (screen.getKeyboard() instanceof KeyboardImpl) { + KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard(); + InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard(); - telegramBot.execute(editMessage); - } + if (log.isDebugEnabled()) { + log.debug("{}", kk.toFriendlyString()); + } - @Override - public void deleteMessage() { - telegramBot.execute(new DeleteMessage(chatId(), messageId())); - } + if (inlineKeyboard != null && inlineKeyboard.length > 0) { + editMessage = editMessage.replyMarkup(new InlineKeyboardMarkup(inlineKeyboard)); + } else { + log.debug("No keyboard"); + } + } - private Long chatId() { - if (update.callbackQuery() != null) { - return update.callbackQuery().message().chat().id(); - } - return update.message().chat().id(); - } + telegramBot.execute(editMessage); + } - private Integer messageId() { - if (update.callbackQuery() != null) { - return update.callbackQuery().message().messageId(); - } - return update.message().messageId(); - } + @Override + public void deleteMessage() { + telegramBot.execute(new DeleteMessage(chatId(), messageId())); + } - private void logKeyboard(KeyboardButton[][] keyboard) { - if (log.isDebugEnabled()) { - for (int i = 0; i < keyboard.length; i++) { - if (keyboard[i].length > 0) { - String row = Stream.of(keyboard[i]).map(this::getText).collect(Collectors.joining(" | ")); - log.debug("Keyboard: {}", row); - } - } - } - } + private Long chatId() { + if (update.callbackQuery() != null) { + return update.callbackQuery().message().chat().id(); + } + return update.message().chat().id(); + } - private void logKeyboard(InlineKeyboardButton[][] keyboard) { - if (log.isDebugEnabled()) { - for (int i = 0; i < keyboard.length; i++) { - if (keyboard[i].length > 0) { - String row = Stream.of(keyboard[i]).map(this::getText).collect(Collectors.joining(" | ")); - log.debug("Inline keyboard: {}", row); - } - } - } - } - - @SneakyThrows - private String getText(KeyboardButton btn) { - Field text = KeyboardButton.class.getDeclaredField("text"); - ReflectionAccessor.getInstance().makeAccessible(text); - return String.valueOf(text.get(btn)); - } - - @SneakyThrows - private String getText(InlineKeyboardButton btn) { - Field text = InlineKeyboardButton.class.getDeclaredField("text"); - ReflectionAccessor.getInstance().makeAccessible(text); - return String.valueOf(text.get(btn)); - } + private Integer messageId() { + if (update.callbackQuery() != null) { + return update.callbackQuery().message().messageId(); + } + return update.message().messageId(); + } } diff --git a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/KeyboardImpl.java b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/KeyboardImpl.java index 8f34976..10c390b 100644 --- a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/KeyboardImpl.java +++ b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/KeyboardImpl.java @@ -1,16 +1,68 @@ package ru.penkrat.stbf.impl.pengrad; +import com.google.gson.internal.reflect.ReflectionAccessor; import com.pengrad.telegrambot.model.request.InlineKeyboardButton; import com.pengrad.telegrambot.model.request.KeyboardButton; - import lombok.Value; import ru.penkrat.stbf.api.Keyboard; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + @Value class KeyboardImpl implements Keyboard { - private KeyboardButton[][] keyboard; + private KeyboardButton[][] keyboard; - private InlineKeyboardButton[][] inlineKeyboard; + private InlineKeyboardButton[][] inlineKeyboard; + private Map text = new HashMap<>(); + + @Override + public String toString() { + int k = keyboard != null ? keyboard.length : 0; + int kn = k > 0 ? keyboard[0].length : 0; + int i = inlineKeyboard != null ? inlineKeyboard.length : 0; + int in = i > 0 ? inlineKeyboard[0].length : 0; + return "KeyboardImpl(pengrad) [keyboard=" + k + "x" + kn + + ", inline=" + i + "x" + in + "]"; + } + + String toFriendlyString() { + StringBuilder sb = new StringBuilder(); + if (keyboard != null) { + sb.append("Keyboard:\n"); + for (int i = 0; i < keyboard.length; i++) { + if (keyboard[i].length > 0) { + String row = Stream.of(keyboard[i]).map(this::getText).collect(Collectors.joining(" | ")); + sb.append(row).append("\n"); + } + } + } + if (inlineKeyboard != null) { + sb.append("Inline keyboard:\n"); + for (int i = 0; i < inlineKeyboard.length; i++) { + if (inlineKeyboard[i].length > 0) { + String row = Stream.of(inlineKeyboard[i]).map(this::getText).collect(Collectors.joining(" | ")); + sb.append(row).append("\n"); + } + } + } + return sb.toString(); + } + + private String getText(Object btn) { + return text.computeIfAbsent(btn, o -> { + try { + Field text = btn.getClass().getDeclaredField("text"); + ReflectionAccessor.getInstance().makeAccessible(text); + return String.valueOf(text.get(btn)); + } catch (NoSuchFieldException | IllegalAccessException e) { + return "*error*"; + } + }); + } } diff --git a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/PengradKeyboardBuilder.java b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/PengradKeyboardBuilder.java index 2974b84..1dc8472 100644 --- a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/PengradKeyboardBuilder.java +++ b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/PengradKeyboardBuilder.java @@ -13,6 +13,8 @@ public class PengradKeyboardBuilder implements KeyboardBuilder { private InlineKeyboardButton[][] inlineKeyboard; + private String keyboardStr = ""; + public static Keyboard singleKey(Action action) { return KeyboardBuilder.newKeyboard().add(action).build(); } @@ -123,7 +125,6 @@ public class PengradKeyboardBuilder implements KeyboardBuilder { n[k.length] = btn; keyboard[keyboard.length - 1] = n; } - } private void put(InlineKeyboardButton btn) {