diff --git a/stbf-api/src/main/java/ru/penkrat/stbf/api/Action.java b/stbf-api/src/main/java/ru/penkrat/stbf/api/Action.java index f7a4be8..9dcfdaf 100644 --- a/stbf-api/src/main/java/ru/penkrat/stbf/api/Action.java +++ b/stbf-api/src/main/java/ru/penkrat/stbf/api/Action.java @@ -7,51 +7,51 @@ import lombok.ToString; @Getter @Builder -@ToString(of = "text") +@ToString(of = {"text", "inline"}) public class Action { - public static Action simple(String text) { - return builder().text(text).build(); - } + public static Action simple(String text) { + return builder().text(text).build(); + } - public static Action simple(String text, String cmd) { - validateCmd(cmd); - return builder().text(text).cmd(cmd).build(); - } + public static Action simple(String text, String cmd) { + validateCmd(cmd); + return builder().text(text).cmd(cmd).build(); + } - public static Action callback(String text, String callbackData) { - return builder().inline(true).text(text).callbackData(callbackData).build(); - } + public static Action callback(String text, String callbackData) { + return builder().inline(true).text(text).callbackData(callbackData).build(); + } - public static Action requestContact(String text) { - return builder().text(text).requestContact(true).build(); - } + public static Action requestContact(String text) { + return builder().text(text).requestContact(true).build(); + } - private boolean inline; + private boolean inline; - private String text; + private String text; - private String cmd; + private String cmd; - // in-line - private String callbackData; - private String url; + // in-line + private String callbackData; + private String url; - // keyboard - private boolean requestContact; - private boolean requestLocation; + // keyboard + private boolean requestContact; + private boolean requestLocation; - /** - * Text of the command, 1-32 characters. Can contain only lowercase English - * letters, digits and underscores. - */ - private static void validateCmd(@NonNull String cmd) { - if (cmd.length() > 32) { - throw new IllegalArgumentException("Max length - 32 characters"); - } - if (!cmd.startsWith("/")) { - throw new IllegalArgumentException("Command must start / character"); - } - // TODO validate lowercase etc - } + /** + * Text of the command, 1-32 characters. Can contain only lowercase English + * letters, digits and underscores. + */ + private static void validateCmd(@NonNull String cmd) { + if (cmd.length() > 32) { + throw new IllegalArgumentException("Max length - 32 characters"); + } + if (!cmd.startsWith("/")) { + throw new IllegalArgumentException("Command must start / character"); + } + // TODO validate lowercase etc + } } diff --git a/stbf-api/src/main/java/ru/penkrat/stbf/api/BotCommandChain.java b/stbf-api/src/main/java/ru/penkrat/stbf/api/BotCommandChain.java index e143d28..c33ecac 100644 --- a/stbf-api/src/main/java/ru/penkrat/stbf/api/BotCommandChain.java +++ b/stbf-api/src/main/java/ru/penkrat/stbf/api/BotCommandChain.java @@ -22,7 +22,7 @@ public class BotCommandChain implements CommandChain { if (!commands.isEmpty()) { try { Command command = commands.get(0); - log.debug("Run command {}", command.getClass().getSimpleName()); + log.debug("Run command {} ({})", command.getClass().getSimpleName(), command); command.process(botRequest, botResponse, new BotCommandChain(commands.subList(1, commands.size()))); } catch (Exception e) { diff --git a/stbf-api/src/main/java/ru/penkrat/stbf/api/RequestMatcher.java b/stbf-api/src/main/java/ru/penkrat/stbf/api/RequestMatcher.java index 48da97d..74d45eb 100644 --- a/stbf-api/src/main/java/ru/penkrat/stbf/api/RequestMatcher.java +++ b/stbf-api/src/main/java/ru/penkrat/stbf/api/RequestMatcher.java @@ -1,8 +1,20 @@ package ru.penkrat.stbf.api; +import java.util.Objects; + @FunctionalInterface public interface RequestMatcher { - boolean match(BotRequest botRequest); + boolean match(BotRequest botRequest); + + default RequestMatcher or(RequestMatcher other) { + Objects.requireNonNull(other); + return (botRequest) -> match(botRequest) || other.match(botRequest); + } + + default RequestMatcher and(RequestMatcher other) { + Objects.requireNonNull(other); + return (botRequest) -> match(botRequest) && other.match(botRequest); + } } diff --git a/stbf-common/src/main/java/ru/penkrat/stbf/tools/RequestMatchers.java b/stbf-common/src/main/java/ru/penkrat/stbf/tools/RequestMatchers.java index 8f70086..e0899e4 100644 --- a/stbf-common/src/main/java/ru/penkrat/stbf/tools/RequestMatchers.java +++ b/stbf-common/src/main/java/ru/penkrat/stbf/tools/RequestMatchers.java @@ -4,17 +4,55 @@ import lombok.experimental.UtilityClass; import ru.penkrat.stbf.api.Action; import ru.penkrat.stbf.api.RequestMatcher; +import java.util.Objects; +import java.util.regex.Pattern; + @UtilityClass public class RequestMatchers { - public RequestMatcher action(Action action) { - return request -> request.getMessageText() - .filter(text -> matchText(action, text)) - .isPresent(); - } + public RequestMatcher action(Action action) { + return request -> request.getMessageText() + .filter(text -> matchText(action, text)) + .isPresent(); + } - private static boolean matchText(Action action, String inputText) { - return inputText.equalsIgnoreCase(action.getText()) - || (action.getCmd() != null && inputText.equalsIgnoreCase(action.getCmd())); - } + public RequestMatcher cmd(Action action) { + return request -> request.getMessageText() + .filter(Objects::nonNull) + .filter(data -> Objects.equals(action.getCmd(), data)) + .isPresent(); + } + + public RequestMatcher text(String callbackData) { + return request -> request.getCallbackData() + .filter(Objects::nonNull) + .filter(data -> Objects.equals(callbackData, data)) + .isPresent(); + } + + public RequestMatcher callbackData(String callbackData) { + return request -> request.getCallbackData() + .filter(Objects::nonNull) + .filter(data -> Objects.equals(callbackData, data)) + .isPresent(); + } + + public RequestMatcher callbackDataStartsWith(String callbackDataPrefix) { + return request -> request.getCallbackData() + .filter(Objects::nonNull) + .filter(data -> data.startsWith(callbackDataPrefix)) + .isPresent(); + } + + public RequestMatcher callbackDataRegexp(String callbackDataPrefix) { + return request -> request.getCallbackData() + .filter(Objects::nonNull) + .filter(Pattern.compile(callbackDataPrefix).asPredicate()) + .isPresent(); + } + + private static boolean matchText(Action action, String inputText) { + return inputText.equalsIgnoreCase(action.getText()) + || (action.getCmd() != null && inputText.equalsIgnoreCase(action.getCmd())); + } } diff --git a/stbf-demo/src/main/resources/flow.xml b/stbf-demo/src/main/resources/flow.xml index fa3f643..ac2d8d7 100644 --- a/stbf-demo/src/main/resources/flow.xml +++ b/stbf-demo/src/main/resources/flow.xml @@ -2,27 +2,74 @@ Start Help + Inline + Inline button #1 + Inline button #2 + Git repo - This is demo bot + This is demo bot + use Help or /help to view help + - - This is demo help + + This is demo help + use /inline to switch to inline mode + + + This is inline buttons: + + + + + + + + + + + + Inline Screen #1 + + + + + + + + + + + + Inline Screen #2 + + + + + + + + + + + + + \ No newline at end of file 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 b82dcb8..e90c931 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 @@ -2,7 +2,11 @@ package ru.penkrat.stbf.impl.pengrad; import com.pengrad.telegrambot.TelegramBot; import com.pengrad.telegrambot.model.Update; -import com.pengrad.telegrambot.model.request.*; +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.request.DeleteMessage; import com.pengrad.telegrambot.request.EditMessageText; import com.pengrad.telegrambot.request.SendDocument; diff --git a/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/NoKeyboard.java b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/NoKeyboard.java new file mode 100644 index 0000000..110fdf3 --- /dev/null +++ b/stbf-pengrad/src/main/java/ru/penkrat/stbf/impl/pengrad/NoKeyboard.java @@ -0,0 +1,14 @@ +package ru.penkrat.stbf.impl.pengrad; + +import ru.penkrat.stbf.api.Keyboard; + +class NoKeyboard implements Keyboard { + + @Override + public String toString() { + return "EmptyKeyboard(pengrad)"; + } + +} + + 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 1dc8472..c6a69aa 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 @@ -2,149 +2,166 @@ package ru.penkrat.stbf.impl.pengrad; import com.pengrad.telegrambot.model.request.InlineKeyboardButton; import com.pengrad.telegrambot.model.request.KeyboardButton; - import ru.penkrat.stbf.api.Action; import ru.penkrat.stbf.api.Keyboard; import ru.penkrat.stbf.api.KeyboardBuilder; public class PengradKeyboardBuilder implements KeyboardBuilder { - private KeyboardButton[][] keyboard; + private KeyboardButton[][] keyboard; - private InlineKeyboardButton[][] inlineKeyboard; + private InlineKeyboardButton[][] inlineKeyboard; - private String keyboardStr = ""; + private String keyboardStr = ""; - public static Keyboard singleKey(Action action) { - return KeyboardBuilder.newKeyboard().add(action).build(); - } + public static Keyboard singleKey(Action action) { + return KeyboardBuilder.newKeyboard().add(action).build(); + } - @Override - public Keyboard build() { - return new KeyboardImpl(keyboard, inlineKeyboard); - } + @Override + public Keyboard build() { + if (keyboard != null) { + return new KeyboardImpl(keyboard, null); + } + if (inlineKeyboard != null) { + InlineKeyboardButton[][] smallerArray = new InlineKeyboardButton[inlineKeyboard.length - 1][]; + System.arraycopy(inlineKeyboard, 0, smallerArray, 0, inlineKeyboard.length - 1); + return new KeyboardImpl(null, smallerArray); + } + return new NoKeyboard(); + } - public KeyboardBuilder addGetContact(String text) { - put(new KeyboardButton(text).requestContact(true)); - return self(); - } + public KeyboardBuilder addGetContact(String text) { + put(new KeyboardButton(text).requestContact(true)); + return self(); + } - public KeyboardBuilder add(String text) { - put(new KeyboardButton(text)); - return self(); - } + public KeyboardBuilder add(String text) { + put(new KeyboardButton(text)); + return self(); + } - @Override - public KeyboardBuilder add(Action action) { - put(action); - return self(); - } + @Override + public KeyboardBuilder add(Action action) { + put(action); + return self(); + } - public KeyboardBuilder row(KeyboardButton... buttons) { - for (int i = 0; i < buttons.length; i++) { - put(buttons[i]); - } - nextRow(); - return self(); - } + public KeyboardBuilder row(KeyboardButton... buttons) { + for (int i = 0; i < buttons.length; i++) { + put(buttons[i]); + } + nextRow(); + return self(); + } - @Override - public KeyboardBuilder row(Action... buttons) { - for (int i = 0; i < buttons.length; i++) { - put(buttons[i]); - } - nextRow(); - return self(); - } + @Override + public KeyboardBuilder row(Action... buttons) { + for (int i = 0; i < buttons.length; i++) { + put(buttons[i]); + } + if (buttons.length > 0) { + if (buttons[0].isInline()) { + nextRowI(); + } else { + nextRow(); + } + } + return self(); + } - @Override - public KeyboardBuilder column(Action... buttons) { - for (int i = 0; i < buttons.length; i++) { - put(buttons[i]); - if (buttons[i].isInline()) { - nextRowI(); - } else { - nextRow(); - } - } - return self(); - } + @Override + public KeyboardBuilder column(Action... buttons) { + for (int i = 0; i < buttons.length; i++) { + put(buttons[i]); + if (buttons[i].isInline()) { + nextRowI(); + } else { + nextRow(); + } + } + return self(); + } - public KeyboardBuilder addNl(String text) { - add(text); - nextRow(); - return self(); - } + public KeyboardBuilder addNl(String text) { + add(text); + nextRow(); + return self(); + } - public PengradKeyboardBuilder add(String text, String data) { - put(new InlineKeyboardButton(text).callbackData(data)); - return self(); - } + public PengradKeyboardBuilder add(String text, String data) { + put(new InlineKeyboardButton(text).callbackData(data)); + return self(); + } - public KeyboardBuilder addNl(String text, String data) { - add(text, data); - nextRowI(); - return self(); - } + public KeyboardBuilder addNl(String text, String data) { + add(text, data); + nextRowI(); + return self(); + } - private void nextRow() { - KeyboardButton[][] n = new KeyboardButton[keyboard.length + 1][]; - System.arraycopy(keyboard, 0, n, 0, keyboard.length); - keyboard = n; - keyboard[keyboard.length - 1] = new KeyboardButton[] {}; - } + private void nextRow() { + KeyboardButton[][] n = new KeyboardButton[keyboard.length + 1][]; + System.arraycopy(keyboard, 0, n, 0, keyboard.length); + keyboard = n; + keyboard[keyboard.length - 1] = new KeyboardButton[]{}; + } - private void nextRowI() { - InlineKeyboardButton[][] n = new InlineKeyboardButton[inlineKeyboard.length + 1][]; - System.arraycopy(inlineKeyboard, 0, n, 0, inlineKeyboard.length); - inlineKeyboard = n; - inlineKeyboard[inlineKeyboard.length - 1] = new InlineKeyboardButton[] {}; - } + private void nextRowI() { + InlineKeyboardButton[][] n = new InlineKeyboardButton[inlineKeyboard.length + 1][]; + System.arraycopy(inlineKeyboard, 0, n, 0, inlineKeyboard.length); + inlineKeyboard = n; + inlineKeyboard[inlineKeyboard.length - 1] = new InlineKeyboardButton[]{}; + } - protected PengradKeyboardBuilder self() { - return this; - } + protected PengradKeyboardBuilder self() { + return this; + } - private void put(Action action) { - if (action.isInline()) { - put(new InlineKeyboardButton(action.getText()).callbackData(action.getCallbackData())); - } else { - put(new KeyboardButton(action.getText()).requestContact(action.isRequestContact())); - } - } + private void put(Action action) { + if (action.isInline()) { + put(new InlineKeyboardButton(action.getText()) + .callbackData(action.getCallbackData()) + .url(action.getUrl())); + } else { + put(new KeyboardButton(action.getText()) + .requestContact(action.isRequestContact()) + .requestLocation(action.isRequestLocation())); + } + } - private void put(KeyboardButton btn) { - if (keyboard == null) { - keyboard = new KeyboardButton[][] { - new KeyboardButton[] { btn } - }; - } else { - KeyboardButton[] k = keyboard[keyboard.length - 1]; - KeyboardButton[] n = new KeyboardButton[k.length + 1]; - System.arraycopy(k, 0, n, 0, k.length); - n[k.length] = btn; - keyboard[keyboard.length - 1] = n; - } - } + private void put(KeyboardButton btn) { + if (keyboard == null) { + keyboard = new KeyboardButton[][]{ + new KeyboardButton[]{btn} + }; + } else { + KeyboardButton[] k = keyboard[keyboard.length - 1]; + KeyboardButton[] n = new KeyboardButton[k.length + 1]; + System.arraycopy(k, 0, n, 0, k.length); + n[k.length] = btn; + keyboard[keyboard.length - 1] = n; + } + } - private void put(InlineKeyboardButton btn) { - if (inlineKeyboard == null) { - inlineKeyboard = new InlineKeyboardButton[][] { - new InlineKeyboardButton[] { btn } - }; - } else { - InlineKeyboardButton[] k = inlineKeyboard[inlineKeyboard.length - 1]; - InlineKeyboardButton[] n = new InlineKeyboardButton[k.length + 1]; - System.arraycopy(k, 0, n, 0, k.length); - n[k.length] = btn; - inlineKeyboard[inlineKeyboard.length - 1] = n; - } + private void put(InlineKeyboardButton btn) { + if (inlineKeyboard == null) { + inlineKeyboard = new InlineKeyboardButton[][]{ + new InlineKeyboardButton[]{btn} + }; + } else { + InlineKeyboardButton[] k = inlineKeyboard[inlineKeyboard.length - 1]; + InlineKeyboardButton[] n = new InlineKeyboardButton[k.length + 1]; + System.arraycopy(k, 0, n, 0, k.length); + n[k.length] = btn; + inlineKeyboard[inlineKeyboard.length - 1] = n; + } - } + } - @Override - public KeyboardBuilder newInstance() { - return new PengradKeyboardBuilder(); - } + @Override + public KeyboardBuilder newInstance() { + return new PengradKeyboardBuilder(); + } } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/ActionResolver.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/ActionResolver.java index f6f53c2..ef0fbad 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/ActionResolver.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/ActionResolver.java @@ -1,8 +1,11 @@ package ru.penkrat.stbf.templates; import ru.penkrat.stbf.api.Action; +import ru.penkrat.stbf.api.RequestMatcher; public interface ActionResolver { Action getAction(String name); + + RequestMatcher getMatcher(String actionName); } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/ActionItem.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/ActionItem.java index f34b51c..fed4122 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/ActionItem.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/ActionItem.java @@ -24,6 +24,12 @@ class ActionItem extends NamedItem { @JacksonXmlProperty(isAttribute = true) private String callbackData; + @JacksonXmlProperty(isAttribute = true) + private String callbackDataRegexp; + + @JacksonXmlProperty(isAttribute = true) + private String callbackDataStartWith; + @JacksonXmlProperty(isAttribute = true) private String url; } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/CommandItem.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/CommandItem.java index 695a209..43d511d 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/CommandItem.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/CommandItem.java @@ -21,4 +21,7 @@ public class CommandItem extends NamedItem { @JacksonXmlProperty(isAttribute = true, localName = "class") private String clazz; + @JacksonXmlProperty(isAttribute = true) + private boolean edit; + } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowActionResolverDelegate.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowActionResolverDelegate.java index 71741ed..0a4f1bf 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowActionResolverDelegate.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowActionResolverDelegate.java @@ -1,8 +1,10 @@ package ru.penkrat.stbf.templates.xml; import ru.penkrat.stbf.api.Action; +import ru.penkrat.stbf.api.RequestMatcher; import ru.penkrat.stbf.templates.ActionResolver; import ru.penkrat.stbf.templates.utils.StringUtils; +import ru.penkrat.stbf.tools.RequestMatchers; class FlowActionResolverDelegate implements ActionResolver { @@ -17,7 +19,7 @@ class FlowActionResolverDelegate implements ActionResolver { final ActionItem actionItem = resolver.get(key); boolean isInline = StringUtils.isNotEmpty(actionItem.getCallbackData()) - && StringUtils.isNotEmpty(actionItem.getUrl()); + || StringUtils.isNotEmpty(actionItem.getUrl()); if (isInline) { if (StringUtils.isNotEmpty(actionItem.getCommand())) { @@ -43,4 +45,21 @@ class FlowActionResolverDelegate implements ActionResolver { .url(actionItem.getUrl()) .build(); } + + @Override + public RequestMatcher getMatcher(String actionName) { + final ActionItem actionItem = resolver.get(actionName); + + if (StringUtils.isNotEmpty(actionItem.getCallbackDataRegexp())) { + return RequestMatchers.callbackDataRegexp(actionItem.getCallbackDataRegexp()); + } + if (StringUtils.isNotEmpty(actionItem.getCallbackDataStartWith())) { + return RequestMatchers.callbackDataStartsWith(actionItem.getCallbackDataStartWith()); + } + if (StringUtils.isNotEmpty(actionItem.getCallbackData())) { + return RequestMatchers.callbackData(actionItem.getCallbackData()); + } + + return RequestMatchers.action(getAction(actionName)); + } } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowCommandResolverDelegate.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowCommandResolverDelegate.java index 65584b9..d6d3663 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowCommandResolverDelegate.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowCommandResolverDelegate.java @@ -12,7 +12,6 @@ import ru.penkrat.stbf.templates.ActionResolver; import ru.penkrat.stbf.templates.CommandResolver; import ru.penkrat.stbf.templates.ScreenResolver; import ru.penkrat.stbf.templates.utils.StringUtils; -import ru.penkrat.stbf.tools.RequestMatchers; import java.util.Collection; import java.util.Collections; @@ -51,31 +50,35 @@ public class FlowCommandResolverDelegate implements CommandResolver { private Command createCommand(CommandItem commandItem) { Action action = null; + RequestMatcher actionMatcher = null; Screen screen = null; Function screenFactory; if (StringUtils.isNotEmpty(commandItem.getActionRef())) { action = actionResolver.getAction(commandItem.getActionRef()); - + actionMatcher = actionResolver.getMatcher(commandItem.getActionRef()); } if (StringUtils.isNotEmpty(commandItem.getScreenRef())) { screen = screenResolver.getScreen(commandItem.getScreenRef()); screenFactory = screenResolver.getScreenFactory(commandItem.getScreenRef()); } - if (action != null && screen != null) { - return simpleCommand(action, screen, commandItem.getId(), commandItem.getName()); + if (actionMatcher != null && screen != null) { + return simpleCommand(actionMatcher, screen, commandItem.isEdit(), commandItem.getId(), commandItem.getName()); } return null; } - private Command simpleCommand(Action action, Screen screen, String id, String name) { + private Command simpleCommand(RequestMatcher matcher, Screen screen, boolean edit, String id, String name) { return new Command() { - RequestMatcher matcher = RequestMatchers.action(action); @Override public void process(BotRequest botRequest, BotResponse botResponse, CommandChain chain) { if (matcher.match(botRequest)) { - botResponse.send(screen); + if (edit) { + botResponse.edit(screen); + } else { + botResponse.send(screen); + } } chain.processCommand(botRequest, botResponse); } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowScreenResolverDelegate.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowScreenResolverDelegate.java index 73446e6..f0c595c 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowScreenResolverDelegate.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/FlowScreenResolverDelegate.java @@ -81,6 +81,8 @@ class FlowScreenResolverDelegate implements ScreenResolver { .map(btn -> getAction(btn)) .collect(Collectors.toList()); + log.info("Keyboard: {}", buttons); + builder.row(buttons.toArray(new Action[buttons.size()])); } @@ -97,6 +99,9 @@ class FlowScreenResolverDelegate implements ScreenResolver { .text(btn.getText()) .requestContact(btn.isRequestContact()) .requestLocation(btn.isRequestLocation()) + .url(btn.getUrl()) + .callbackData(btn.getCallbackData()) + .inline(StringUtils.isNotEmpty(btn.getUrl()) || StringUtils.isNotEmpty(btn.getCallbackData())) .build(); } diff --git a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/XmlFlowResolver.java b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/XmlFlowResolver.java index 9bf17eb..8230b93 100644 --- a/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/XmlFlowResolver.java +++ b/stbf-templates/src/main/java/ru/penkrat/stbf/templates/xml/XmlFlowResolver.java @@ -3,6 +3,7 @@ package ru.penkrat.stbf.templates.xml; import lombok.extern.slf4j.Slf4j; import ru.penkrat.stbf.api.Action; import ru.penkrat.stbf.api.Command; +import ru.penkrat.stbf.api.RequestMatcher; import ru.penkrat.stbf.api.Screen; import ru.penkrat.stbf.templates.TemplateRenderer; @@ -47,6 +48,11 @@ public class XmlFlowResolver implements FlowResolver { return actionDelegate.getAction(name); } + @Override + public RequestMatcher getMatcher(String actionName) { + return actionDelegate.getMatcher(actionName); + } + public void setTemplateRenderer(TemplateRenderer templateRenderer) { screenDelegate.setTemplateRenderer(templateRenderer); }