implement toString for keyboard

This commit is contained in:
2021-08-30 23:23:49 +03:00
parent 6aece7bb99
commit 81cac78737
3 changed files with 130 additions and 119 deletions

View File

@@ -1,24 +1,13 @@
package ru.penkrat.stbf.impl.pengrad; 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.TelegramBot;
import com.pengrad.telegrambot.model.Update; import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.model.request.InlineKeyboardButton; import com.pengrad.telegrambot.model.request.*;
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.request.DeleteMessage; import com.pengrad.telegrambot.request.DeleteMessage;
import com.pengrad.telegrambot.request.EditMessageText; import com.pengrad.telegrambot.request.EditMessageText;
import com.pengrad.telegrambot.request.SendDocument; import com.pengrad.telegrambot.request.SendDocument;
import com.pengrad.telegrambot.request.SendMessage; import com.pengrad.telegrambot.request.SendMessage;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import ru.penkrat.stbf.api.BotResponse; import ru.penkrat.stbf.api.BotResponse;
import ru.penkrat.stbf.api.Screen; import ru.penkrat.stbf.api.Screen;
@@ -27,125 +16,94 @@ import ru.penkrat.stbf.api.Screen;
@RequiredArgsConstructor @RequiredArgsConstructor
public class BotResponseImpl implements BotResponse { public class BotResponseImpl implements BotResponse {
private final Update update; private final Update update;
private final TelegramBot telegramBot; private final TelegramBot telegramBot;
@Override @Override
public void send(Screen screen) { public void send(Screen screen) {
log.debug("Send message: \n============\n{}\n============", screen.getText().trim()); log.debug("Send message: \n============\n{}\n============", screen.getText().trim());
SendMessage sendMessage = new SendMessage(chatId(), screen.getText().trim()) SendMessage sendMessage = new SendMessage(chatId(), screen.getText().trim())
.parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2) .parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2)
.disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview()) .disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview())
.disableNotification(screen.getScreenProperties().isDisableNotification()); .disableNotification(screen.getScreenProperties().isDisableNotification());
if (screen.getKeyboard() instanceof KeyboardImpl) { if (screen.getKeyboard() instanceof KeyboardImpl) {
KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard(); KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard();
KeyboardButton[][] keyboard = kk.getKeyboard(); KeyboardButton[][] keyboard = kk.getKeyboard();
InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard(); InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard();
if (inlineKeyboard != null && inlineKeyboard.length > 0) { if (log.isDebugEnabled()) {
logKeyboard(inlineKeyboard); log.debug("{}", kk.toFriendlyString());
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");
}
}
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 telegramBot.execute(sendMessage);
public void sendFile(String filename, byte[] data) { }
telegramBot.execute(new SendDocument(chatId(), data).fileName(filename));
}
@Override @Override
@Deprecated public void sendFile(String filename, byte[] data) {
public void editMessage(String text) { telegramBot.execute(new SendDocument(chatId(), data).fileName(filename));
telegramBot.execute(new EditMessageText(chatId(), messageId(), text) }
.parseMode(ParseMode.HTML)
.disableWebPagePreview(true));
}
@Override @Override
public void edit(Screen screen) { @Deprecated
EditMessageText editMessage = new EditMessageText(chatId(), messageId(), screen.getText()) public void editMessage(String text) {
.parseMode(screen.getScreenProperties().isParseModeHtml() ? ParseMode.HTML : ParseMode.MarkdownV2) telegramBot.execute(new EditMessageText(chatId(), messageId(), text)
.disableWebPagePreview(screen.getScreenProperties().isDisableWebPagePreview()); .parseMode(ParseMode.HTML)
.disableWebPagePreview(true));
}
if (screen.getKeyboard() instanceof KeyboardImpl) { @Override
KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard(); public void edit(Screen screen) {
InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard(); 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) { if (screen.getKeyboard() instanceof KeyboardImpl) {
logKeyboard(inlineKeyboard); KeyboardImpl kk = (KeyboardImpl) screen.getKeyboard();
editMessage = editMessage.replyMarkup(new InlineKeyboardMarkup(inlineKeyboard)); InlineKeyboardButton[][] inlineKeyboard = kk.getInlineKeyboard();
} else {
log.debug("No keyboard");
}
}
telegramBot.execute(editMessage); if (log.isDebugEnabled()) {
} log.debug("{}", kk.toFriendlyString());
}
@Override if (inlineKeyboard != null && inlineKeyboard.length > 0) {
public void deleteMessage() { editMessage = editMessage.replyMarkup(new InlineKeyboardMarkup(inlineKeyboard));
telegramBot.execute(new DeleteMessage(chatId(), messageId())); } else {
} log.debug("No keyboard");
}
}
private Long chatId() { telegramBot.execute(editMessage);
if (update.callbackQuery() != null) { }
return update.callbackQuery().message().chat().id();
}
return update.message().chat().id();
}
private Integer messageId() { @Override
if (update.callbackQuery() != null) { public void deleteMessage() {
return update.callbackQuery().message().messageId(); telegramBot.execute(new DeleteMessage(chatId(), messageId()));
} }
return update.message().messageId();
}
private void logKeyboard(KeyboardButton[][] keyboard) { private Long chatId() {
if (log.isDebugEnabled()) { if (update.callbackQuery() != null) {
for (int i = 0; i < keyboard.length; i++) { return update.callbackQuery().message().chat().id();
if (keyboard[i].length > 0) { }
String row = Stream.of(keyboard[i]).map(this::getText).collect(Collectors.joining(" | ")); return update.message().chat().id();
log.debug("Keyboard: {}", row); }
}
}
}
}
private void logKeyboard(InlineKeyboardButton[][] keyboard) { private Integer messageId() {
if (log.isDebugEnabled()) { if (update.callbackQuery() != null) {
for (int i = 0; i < keyboard.length; i++) { return update.callbackQuery().message().messageId();
if (keyboard[i].length > 0) { }
String row = Stream.of(keyboard[i]).map(this::getText).collect(Collectors.joining(" | ")); return update.message().messageId();
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));
}
} }

View File

@@ -1,16 +1,68 @@
package ru.penkrat.stbf.impl.pengrad; 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.InlineKeyboardButton;
import com.pengrad.telegrambot.model.request.KeyboardButton; import com.pengrad.telegrambot.model.request.KeyboardButton;
import lombok.Value; import lombok.Value;
import ru.penkrat.stbf.api.Keyboard; 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 @Value
class KeyboardImpl implements Keyboard { class KeyboardImpl implements Keyboard {
private KeyboardButton[][] keyboard; private KeyboardButton[][] keyboard;
private InlineKeyboardButton[][] inlineKeyboard; private InlineKeyboardButton[][] inlineKeyboard;
private Map<Object, String> 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*";
}
});
}
} }

View File

@@ -13,6 +13,8 @@ public class PengradKeyboardBuilder implements KeyboardBuilder {
private InlineKeyboardButton[][] inlineKeyboard; private InlineKeyboardButton[][] inlineKeyboard;
private String keyboardStr = "";
public static Keyboard singleKey(Action action) { public static Keyboard singleKey(Action action) {
return KeyboardBuilder.newKeyboard().add(action).build(); return KeyboardBuilder.newKeyboard().add(action).build();
} }
@@ -123,7 +125,6 @@ public class PengradKeyboardBuilder implements KeyboardBuilder {
n[k.length] = btn; n[k.length] = btn;
keyboard[keyboard.length - 1] = n; keyboard[keyboard.length - 1] = n;
} }
} }
private void put(InlineKeyboardButton btn) { private void put(InlineKeyboardButton btn) {