From 90c54f0d7693e35853f920bb17309fb57b7f10e6 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Fri, 17 Mar 2023 03:16:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B5=D1=82=D0=B0=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D1=8F=20=D0=B2=D0=B5=D0=B1=D1=85=D1=83=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B8=20=D0=B1=D0=B5=D1=82=D0=B0=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 24 ++++- .../consumer/EventDistributorService.java | 53 +++++++---- .../consumer/EventDistributorService.java | 33 ++++--- .../main/context/BoxAnswerPayload.java | 2 + .../context/service/TelegramConnect.java | 13 +++ .../context/service}/TelegramConnect.java | 4 +- .../quarkus/core/TelegramDefaultConnect.java | 89 +++++++++++++++++++ ...ctBot.java => TelegramPollingConnect.java} | 49 ++++------ .../quarkus/core/TelegramWebhookBot.java | 53 +++++++++++ .../quarkus/core/TelegramWebhookConnect.java | 48 ++++++++++ .../core/handler/PreCheckoutQueryHandler.java | 52 +++++++++++ .../core/service/AttachmentServiceImpl.java | 2 +- .../core/service/TelegramServiceImpl.java | 2 +- .../simple}/core/TelegramDefaultConnect.java | 10 ++- ...ctBot.java => TelegramPollingConnect.java} | 8 +- .../simple/core/TelegramWebhookBot.java | 52 +++++++++++ .../simple/core/TelegramWebhookConnect.java | 48 ++++++++++ .../core/handler/PreCheckoutQueryHandler.java | 36 ++++++++ .../core/service/AttachmentServiceImpl.java | 2 +- .../core/service/TelegramServiceImpl.java | 2 +- .../domain/config/TelegramBotConfig.java | 35 ++------ .../quarkus/sender/TelegramSender.java | 54 +++++++---- .../simple/sender/TelegramSender.java | 17 +++- telegram-webhook/pom.xml | 24 +++++ .../telegram-webhook-quarkus/pom.xml | 39 ++++++++ .../telegram/webhook/WebhookController.java | 50 +++++++++++ 26 files changed, 678 insertions(+), 123 deletions(-) create mode 100644 telegram-context/telegram-context-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/context/service/TelegramConnect.java rename telegram-context/{telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context => telegram-context-simple/src/main/java/dev/struchkov/godfather/telegram/simple/context/service}/TelegramConnect.java (51%) create mode 100644 telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramDefaultConnect.java rename telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/{TelegramConnectBot.java => TelegramPollingConnect.java} (72%) create mode 100644 telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookBot.java create mode 100644 telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookConnect.java create mode 100644 telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/handler/PreCheckoutQueryHandler.java rename telegram-core/{telegram-core-main/src/main/java/dev/struchkov/godfather/telegram/main => telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple}/core/TelegramDefaultConnect.java (88%) rename telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/{TelegramConnectBot.java => TelegramPollingConnect.java} (94%) create mode 100644 telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookBot.java create mode 100644 telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookConnect.java create mode 100644 telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/handler/PreCheckoutQueryHandler.java create mode 100644 telegram-webhook/pom.xml create mode 100644 telegram-webhook/telegram-webhook-quarkus/pom.xml create mode 100644 telegram-webhook/telegram-webhook-quarkus/src/main/java/dev/struchkov/godfather/telegram/webhook/WebhookController.java diff --git a/pom.xml b/pom.xml index fd4f8bf..79a273f 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ telegram-consumer telegram-context telegram-simple + telegram-webhook Telegram Bot @@ -37,11 +38,14 @@ UTF-8 UTF-8 - 0.0.53 + 0.0.54-SNAPSHOT 6.3.0 + + 2.30.1 + 2.6.0 @@ -245,6 +249,24 @@ telegrambotsextensions ${telegrambots.ver} + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_2.1_spec + 2.0.1.Final + + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + ${smallrye.mutiny.vertx.core.version} + + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + ${smallrye.mutiny.vertx.core.version} + diff --git a/telegram-consumer/telegram-consumer-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/consumer/EventDistributorService.java b/telegram-consumer/telegram-consumer-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/consumer/EventDistributorService.java index e7bbc50..34096a6 100644 --- a/telegram-consumer/telegram-consumer-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/consumer/EventDistributorService.java +++ b/telegram-consumer/telegram-consumer-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/consumer/EventDistributorService.java @@ -9,7 +9,7 @@ import dev.struchkov.godfather.telegram.main.consumer.MessageMailConvert; import dev.struchkov.godfather.telegram.main.consumer.SubscribeConvert; import dev.struchkov.godfather.telegram.main.consumer.UnsubscribeConvert; import dev.struchkov.godfather.telegram.quarkus.context.service.EventDistributor; -import dev.struchkov.godfather.telegram.quarkus.core.TelegramConnectBot; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import org.jetbrains.annotations.NotNull; @@ -18,6 +18,7 @@ import org.telegram.telegrambots.meta.api.objects.ChatMemberUpdated; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.api.objects.User; +import org.telegram.telegrambots.meta.api.objects.payments.PreCheckoutQuery; import java.util.List; import java.util.Map; @@ -35,9 +36,9 @@ public class EventDistributorService implements EventDistributor { private final Map> eventHandlerMap; - public EventDistributorService(TelegramConnectBot telegramConnectBot, List eventProviders) { + public EventDistributorService(TelegramConnect telegramConnect, List eventProviders) { this.eventHandlerMap = eventProviders.stream().collect(Collectors.groupingBy(EventHandler::getEventType)); - telegramConnectBot.initEventDistributor(this); + telegramConnect.initEventDistributor(this); } @Override @@ -47,52 +48,66 @@ public class EventDistributorService implements EventDistributor { v -> { final Message message = update.getMessage(); final CallbackQuery callbackQuery = update.getCallbackQuery(); - if (checkNotNull(message)) { - if (!isEvent(message)) { - final Optional> optHandlers = getHandler(Mail.TYPE); - if (optHandlers.isPresent()) { - return Multi.createFrom().iterable(optHandlers.get()) - .onItem().transformToUni( - eventHandler -> eventHandler.handle(MessageMailConvert.apply(message)) - ).concatenate().toUni().replaceWithVoid(); - } - return Uni.createFrom().voidItem(); + final PreCheckoutQuery preCheckoutQuery = update.getPreCheckoutQuery(); + + if (checkNotNull(preCheckoutQuery)) { + final Optional> optHandlers = getHandler(preCheckoutQuery.getClass().getName()); + if (optHandlers.isPresent()) { + return Multi.createFrom().iterable(optHandlers.get()) + .onItem().transformToUni( + eventHandler -> eventHandler.handle(preCheckoutQuery) + ).concatenate().collect().asList().replaceWithVoid(); } + return Uni.createFrom().voidItem(); } + + if (checkNotNull(message) && (!isEvent(message))) { + final Optional> optHandlers = getHandler(Mail.class.getName()); + if (optHandlers.isPresent()) { + return Multi.createFrom().iterable(optHandlers.get()) + .onItem().transformToUni( + eventHandler -> eventHandler.handle(MessageMailConvert.apply(message)) + ).concatenate().collect().asList().replaceWithVoid(); + } + return Uni.createFrom().voidItem(); + } + if (checkNotNull(callbackQuery)) { - final Optional> optHandlers = getHandler(Mail.TYPE); + final Optional> optHandlers = getHandler(Mail.class.getName()); if (optHandlers.isPresent()) { return Multi.createFrom().iterable(optHandlers.get()) .onItem().transformToUni( eventHandler -> eventHandler.handle(CallbackQueryConvert.apply(callbackQuery)) - ).concatenate().toUni().replaceWithVoid(); + ).concatenate().collect().asList().replaceWithVoid(); } return Uni.createFrom().voidItem(); } + if (checkNotNull(update.getMyChatMember())) { final ChatMemberUpdated chatMember = update.getMyChatMember(); if ("kicked".equals(chatMember.getNewChatMember().getStatus())) { - final Optional> optHandlers = getHandler(Unsubscribe.TYPE); + final Optional> optHandlers = getHandler(Unsubscribe.class.getName()); if (optHandlers.isPresent()) { return Multi.createFrom().iterable(optHandlers.get()) .onItem().transformToUni( eventHandler -> eventHandler.handle(UnsubscribeConvert.apply(chatMember)) - ).concatenate().toUni().replaceWithVoid(); + ).concatenate().collect().asList().replaceWithVoid(); } return Uni.createFrom().voidItem(); } if ("member".equals(chatMember.getNewChatMember().getStatus())) { - final Optional> optHandlers = getHandler(Subscribe.TYPE); + final Optional> optHandlers = getHandler(Subscribe.class.getName()); if (optHandlers.isPresent()) { return Multi.createFrom().iterable(optHandlers.get()) .onItem().transformToUni( eventHandler -> eventHandler.handle(SubscribeConvert.apply(chatMember)) - ).concatenate().toUni().replaceWithVoid(); + ).concatenate().collect().asList().replaceWithVoid(); } return Uni.createFrom().voidItem(); } } + return Uni.createFrom().voidItem(); } ); diff --git a/telegram-consumer/telegram-consumer-simple/src/main/java/dev/struchkov/godfather/telegram/simple/consumer/EventDistributorService.java b/telegram-consumer/telegram-consumer-simple/src/main/java/dev/struchkov/godfather/telegram/simple/consumer/EventDistributorService.java index d6f857a..8c35273 100644 --- a/telegram-consumer/telegram-consumer-simple/src/main/java/dev/struchkov/godfather/telegram/simple/consumer/EventDistributorService.java +++ b/telegram-consumer/telegram-consumer-simple/src/main/java/dev/struchkov/godfather/telegram/simple/consumer/EventDistributorService.java @@ -11,13 +11,15 @@ import dev.struchkov.godfather.telegram.main.consumer.MessageMailConvert; import dev.struchkov.godfather.telegram.main.consumer.SubscribeConvert; import dev.struchkov.godfather.telegram.main.consumer.UnsubscribeConvert; import dev.struchkov.godfather.telegram.simple.context.service.EventDistributor; -import dev.struchkov.godfather.telegram.simple.core.TelegramConnectBot; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; +import dev.struchkov.haiti.utils.Checker; import org.jetbrains.annotations.NotNull; import org.telegram.telegrambots.meta.api.objects.CallbackQuery; import org.telegram.telegrambots.meta.api.objects.ChatMemberUpdated; import org.telegram.telegrambots.meta.api.objects.Message; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.api.objects.User; +import org.telegram.telegrambots.meta.api.objects.payments.PreCheckoutQuery; import java.util.List; import java.util.Map; @@ -33,20 +35,25 @@ public class EventDistributorService implements EventDistributor { private final Map> eventProviderMap; - public EventDistributorService(TelegramConnectBot telegramConnectBot, List eventProviders) { + public EventDistributorService(TelegramConnect telegramConnect, List eventProviders) { this.eventProviderMap = eventProviders.stream().collect(Collectors.groupingBy(EventHandler::getEventType)); - telegramConnectBot.initEventDistributor(this); + telegramConnect.initEventDistributor(this); } @Override public void processing(@NotNull Update update) { final Message message = update.getMessage(); final CallbackQuery callbackQuery = update.getCallbackQuery(); - if (message != null) { - if (!isEvent(message)) { - processionMessage(message); - return; - } + final PreCheckoutQuery preCheckoutQuery = update.getPreCheckoutQuery(); + + if (Checker.checkNotNull(preCheckoutQuery)) { + getHandler(preCheckoutQuery.getClass().getName()).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(preCheckoutQuery))); + return; + } + + if (message != null && (!isEvent(message))) { + processionMessage(message); + return; } if (callbackQuery != null) { processionCallback(callbackQuery); @@ -55,11 +62,11 @@ public class EventDistributorService implements EventDistributor { if (update.getMyChatMember() != null) { final ChatMemberUpdated chatMember = update.getMyChatMember(); if ("kicked".equals(chatMember.getNewChatMember().getStatus())) { - getHandler(Unsubscribe.TYPE).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(UnsubscribeConvert.apply(chatMember)))); + getHandler(Unsubscribe.class.getName()).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(UnsubscribeConvert.apply(chatMember)))); return; } if ("member".equals(chatMember.getNewChatMember().getStatus())) { - getHandler(Subscribe.TYPE).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(SubscribeConvert.apply(chatMember)))); + getHandler(Subscribe.class.getName()).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(SubscribeConvert.apply(chatMember)))); return; } } @@ -71,7 +78,7 @@ public class EventDistributorService implements EventDistributor { } else { final Mail mail = CallbackQueryConvert.apply(callbackQuery); - getHandler(Mail.TYPE).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(mail))); + getHandler(Mail.class.getName()).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(mail))); } } @@ -79,10 +86,10 @@ public class EventDistributorService implements EventDistributor { final Long fromId = message.getChat().getId(); if (fromId < 0) { final ChatMail chatMail = MessageChatMailConvert.apply(message); - getHandler(ChatMail.TYPE).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(chatMail))); + getHandler(ChatMail.class.getName()).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(chatMail))); } else { final Mail mail = MessageMailConvert.apply(message); - getHandler(Mail.TYPE).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(mail))); + getHandler(Mail.class.getName()).ifPresent(handlers -> handlers.forEach(handler -> handler.handle(mail))); } } diff --git a/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java b/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java index 89cc10e..d441fcb 100644 --- a/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java +++ b/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/BoxAnswerPayload.java @@ -2,11 +2,13 @@ package dev.struchkov.godfather.telegram.main.context; import dev.struchkov.haiti.utils.Exceptions; import dev.struchkov.haiti.utils.container.ContextKey; +import org.telegram.telegrambots.meta.api.methods.invoices.SendInvoice; public final class BoxAnswerPayload { public static final ContextKey DISABLE_WEB_PAGE_PREVIEW = ContextKey.of("DISABLE_WEB_PAGE_PREVIEW", Boolean.class); public static final ContextKey DISABLE_NOTIFICATION = ContextKey.of("DISABLE_NOTIFICATION", Boolean.class); + public static final ContextKey INVOICE = ContextKey.of("INVOICE", SendInvoice.class); private BoxAnswerPayload() { Exceptions.utilityClass(); diff --git a/telegram-context/telegram-context-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/context/service/TelegramConnect.java b/telegram-context/telegram-context-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/context/service/TelegramConnect.java new file mode 100644 index 0000000..bf89437 --- /dev/null +++ b/telegram-context/telegram-context-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/context/service/TelegramConnect.java @@ -0,0 +1,13 @@ +package dev.struchkov.godfather.telegram.quarkus.context.service; + +import org.telegram.telegrambots.meta.bots.AbsSender; + +public interface TelegramConnect { + + AbsSender getAbsSender(); + + String getToken(); + + void initEventDistributor(EventDistributor eventDistributorService); + +} diff --git a/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/TelegramConnect.java b/telegram-context/telegram-context-simple/src/main/java/dev/struchkov/godfather/telegram/simple/context/service/TelegramConnect.java similarity index 51% rename from telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/TelegramConnect.java rename to telegram-context/telegram-context-simple/src/main/java/dev/struchkov/godfather/telegram/simple/context/service/TelegramConnect.java index f4e96f0..631700b 100644 --- a/telegram-context/telegram-context-main/src/main/java/dev/struchkov/godfather/telegram/main/context/TelegramConnect.java +++ b/telegram-context/telegram-context-simple/src/main/java/dev/struchkov/godfather/telegram/simple/context/service/TelegramConnect.java @@ -1,4 +1,4 @@ -package dev.struchkov.godfather.telegram.main.context; +package dev.struchkov.godfather.telegram.simple.context.service; import org.telegram.telegrambots.meta.bots.AbsSender; @@ -8,4 +8,6 @@ public interface TelegramConnect { String getToken(); + void initEventDistributor(EventDistributor eventDistributorService); + } diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramDefaultConnect.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramDefaultConnect.java new file mode 100644 index 0000000..589a9fe --- /dev/null +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramDefaultConnect.java @@ -0,0 +1,89 @@ +package dev.struchkov.godfather.telegram.quarkus.core; + +import dev.struchkov.godfather.telegram.domain.config.ProxyConfig; +import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; +import dev.struchkov.godfather.telegram.quarkus.context.service.EventDistributor; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; +import org.jetbrains.annotations.NotNull; +import org.telegram.telegrambots.bots.DefaultAbsSender; +import org.telegram.telegrambots.bots.DefaultBotOptions; +import org.telegram.telegrambots.meta.bots.AbsSender; + +import java.net.Authenticator; +import java.net.PasswordAuthentication; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; + +public class TelegramDefaultConnect implements TelegramConnect { + + private final String botToken; + private final AbsSender absSender; + + public TelegramDefaultConnect(TelegramBotConfig connectConfig) { + this.botToken = connectConfig.getToken(); + this.absSender = createAbsSender(connectConfig); + } + + @NotNull + private DefaultAbsSender createAbsSender(TelegramBotConfig connectConfig) { + final DefaultBotOptions botOptions = new DefaultBotOptions(); + + final ProxyConfig proxyConfig = connectConfig.getProxyConfig(); + if (checkNotNull(proxyConfig) && proxyConfig.isEnable()) { + if (checkNotNull(proxyConfig.getPassword())) { + try { + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication( + proxyConfig.getUser(), + proxyConfig.getPassword().toCharArray() + ); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (checkNotNull(proxyConfig.getHost())) { + System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2"); +// System.setProperty("javax.net.debug", "all"); + botOptions.setProxyHost(proxyConfig.getHost()); + botOptions.setProxyPort(proxyConfig.getPort()); + botOptions.setProxyType(convertProxyType(proxyConfig.getType())); + } + } + + return new DefaultAbsSender(botOptions) { + @Override + public String getBotToken() { + return botToken; + } + }; + } + + private DefaultBotOptions.ProxyType convertProxyType(ProxyConfig.Type type) { + return switch (type) { + case SOCKS5 -> DefaultBotOptions.ProxyType.SOCKS5; + case SOCKS4 -> DefaultBotOptions.ProxyType.SOCKS4; + case HTTP -> DefaultBotOptions.ProxyType.HTTP; + }; + } + + @Override + public AbsSender getAbsSender() { + return absSender; + } + + @Override + public String getToken() { + return botToken; + } + + @Override + public void initEventDistributor(EventDistributor eventDistributorService) { + throw new IllegalStateException(); + } + +} diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramConnectBot.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramPollingConnect.java similarity index 72% rename from telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramConnectBot.java rename to telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramPollingConnect.java index 60f9e0d..75853c6 100644 --- a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramConnectBot.java +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramPollingConnect.java @@ -3,11 +3,9 @@ package dev.struchkov.godfather.telegram.quarkus.core; import dev.struchkov.godfather.telegram.domain.config.ProxyConfig; import dev.struchkov.godfather.telegram.domain.config.ProxyConfig.Type; import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; import dev.struchkov.godfather.telegram.quarkus.context.service.EventDistributor; -import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramBot; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; +import lombok.extern.slf4j.Slf4j; import org.telegram.telegrambots.bots.DefaultBotOptions; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.bots.AbsSender; @@ -24,35 +22,16 @@ import static dev.struchkov.haiti.utils.Checker.checkNotNull; * * @author upagge [30.01.2020] */ -public class TelegramConnectBot implements TelegramConnect { +@Slf4j +public class TelegramPollingConnect implements TelegramConnect { - private static final Logger log = LoggerFactory.getLogger(TelegramConnectBot.class); + private TelegramPollingBot pollingBot; - private TelegramBot telegramBot; - private final TelegramBotConfig telegramBotConfig; - - public TelegramConnectBot(TelegramBotConfig telegramBotConfig) { - this.telegramBotConfig = telegramBotConfig; + public TelegramPollingConnect(TelegramBotConfig telegramBotConfig) { initLongPolling(telegramBotConfig); } -// public TelegramConnect(TelegramWebHookConfig telegramWebHookConfig) { -// initWebHook(telegramWebHookConfig); -// } -// -// private void initWebHook(TelegramWebHookConfig telegramWebHookConfig) { -// TelegramBotsApi botapi = new TelegramBotsApi(); -// final TelegramWebhookBot telegramWebhookBot = new TelegramHookBot(telegramWebHookConfig); -// try { -// botapi.registerBot(telegramWebhookBot); -// this.telegramBot = (TelegramBot) telegramWebhookBot; -// } catch (TelegramApiRequestException e) { -// e.printStackTrace(); -// } -// } - private void initLongPolling(TelegramBotConfig telegramBotConfig) { - final ProxyConfig proxyConfig = telegramBotConfig.getProxyConfig(); if (checkNotNull(proxyConfig) && proxyConfig.isEnable() && checkNotNull(proxyConfig.getPassword()) && !"".equals(proxyConfig.getPassword())) { try { @@ -86,12 +65,12 @@ public class TelegramConnectBot implements TelegramConnect { botapi = new TelegramBotsApi(DefaultBotSession.class); botapi.registerBot(bot); - this.telegramBot = bot; + this.pollingBot = bot; } else { final TelegramPollingBot bot = new TelegramPollingBot(telegramBotConfig); botapi = new TelegramBotsApi(DefaultBotSession.class); botapi.registerBot(bot); - this.telegramBot = bot; + this.pollingBot = bot; } } catch (TelegramApiException e) { log.error(e.getMessage()); @@ -106,17 +85,19 @@ public class TelegramConnectBot implements TelegramConnect { }; } - public void initEventDistributor(EventDistributor eventDistributor) { - telegramBot.initEventDistributor(eventDistributor); + @Override + public String getToken() { + return pollingBot.getBotToken(); } - public String getToken() { - return telegramBotConfig.getToken(); + @Override + public void initEventDistributor(EventDistributor eventDistributorService) { + pollingBot.initEventDistributor(eventDistributorService); } @Override public AbsSender getAbsSender() { - return telegramBot.getAdsSender(); + return pollingBot.getAdsSender(); } } diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookBot.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookBot.java new file mode 100644 index 0000000..037f6fb --- /dev/null +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookBot.java @@ -0,0 +1,53 @@ +package dev.struchkov.godfather.telegram.quarkus.core; + +import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; +import dev.struchkov.godfather.telegram.quarkus.context.service.EventDistributor; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramBot; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.BotApiMethod; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.bots.AbsSender; + +@Slf4j +public class TelegramWebhookBot extends org.telegram.telegrambots.bots.TelegramWebhookBot implements TelegramBot { + + private final TelegramBotConfig telegramBotConfig; + private EventDistributor eventDistributor; + + public TelegramWebhookBot(TelegramBotConfig telegramBotConfig) { + this.telegramBotConfig = telegramBotConfig; + } + + @Override + public String getBotUsername() { + return telegramBotConfig.getUsername(); + } + + @Override + public String getBotToken() { + return telegramBotConfig.getToken(); + } + + @Override + public BotApiMethod onWebhookUpdateReceived(Update update) { + eventDistributor.processing(update).subscribe().with(v -> { + }); + return null; + } + + @Override + public String getBotPath() { + return "bot"; + } + + @Override + public AbsSender getAdsSender() { + return this; + } + + @Override + public void initEventDistributor(EventDistributor eventDistributor) { + this.eventDistributor = eventDistributor; + } + +} diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookConnect.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookConnect.java new file mode 100644 index 0000000..08ee929 --- /dev/null +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/TelegramWebhookConnect.java @@ -0,0 +1,48 @@ +package dev.struchkov.godfather.telegram.quarkus.core; + +import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; +import dev.struchkov.godfather.telegram.quarkus.context.service.EventDistributor; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.updates.SetWebhook; +import org.telegram.telegrambots.meta.bots.AbsSender; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; + +@Slf4j +public class TelegramWebhookConnect implements TelegramConnect { + + private TelegramWebhookBot webhookBot; + + public TelegramWebhookConnect(TelegramBotConfig telegramBotConfig) { + initWebHook(telegramBotConfig); + } + + private void initWebHook(TelegramBotConfig telegramBotConfig) { +// try { + final TelegramWebhookBot bot = new TelegramWebhookBot(telegramBotConfig); + final SetWebhook setWebhook = SetWebhook.builder() + .url(telegramBotConfig.getWebHookUrl()) + .build(); +// bot.setWebhook(setWebhook); + webhookBot = bot; +// } catch (TelegramApiException e) { +// log.error(e.getMessage()); +// } + } + + @Override + public AbsSender getAbsSender() { + return webhookBot.getAdsSender(); + } + + @Override + public String getToken() { + return webhookBot.getBotToken(); + } + + @Override + public void initEventDistributor(EventDistributor eventDistributorService) { + webhookBot.initEventDistributor(eventDistributorService); + } + +} diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/handler/PreCheckoutQueryHandler.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/handler/PreCheckoutQueryHandler.java new file mode 100644 index 0000000..d689e0a --- /dev/null +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/handler/PreCheckoutQueryHandler.java @@ -0,0 +1,52 @@ +package dev.struchkov.godfather.telegram.quarkus.core.handler; + +import dev.struchkov.godfather.quarkus.context.service.EventHandler; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; +import io.smallrye.mutiny.Uni; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.AnswerPreCheckoutQuery; +import org.telegram.telegrambots.meta.api.methods.AnswerShippingQuery; +import org.telegram.telegrambots.meta.api.objects.payments.PreCheckoutQuery; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; +import org.telegram.telegrambots.meta.exceptions.TelegramApiValidationException; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; + +@Slf4j +@RequiredArgsConstructor +public class PreCheckoutQueryHandler implements EventHandler { + + private final TelegramConnect telegramConnect; + + @Override + public Uni handle(PreCheckoutQuery event) { + final AnswerPreCheckoutQuery answerPreCheckoutQuery = new AnswerPreCheckoutQuery(); + answerPreCheckoutQuery.setPreCheckoutQueryId(event.getId()); + answerPreCheckoutQuery.setOk(true); + try { + answerPreCheckoutQuery.validate(); + } catch (TelegramApiValidationException e) { + log.error(e.getMessage(), e); + } + return Uni.createFrom().completionStage( + execAsync(answerPreCheckoutQuery) + ).replaceWithVoid(); + } + + public CompletionStage execAsync(AnswerPreCheckoutQuery answerShippingQuery) { + try { + telegramConnect.getAbsSender().executeAsync(answerShippingQuery); + } catch (TelegramApiException e) { + log.error(e.getMessage(), e); + } + return CompletableFuture.completedStage(null); + } + + @Override + public String getEventType() { + return PreCheckoutQuery.class.getName(); + } + +} diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/AttachmentServiceImpl.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/AttachmentServiceImpl.java index 1e6073a..2bc3124 100644 --- a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/AttachmentServiceImpl.java +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/AttachmentServiceImpl.java @@ -4,8 +4,8 @@ import dev.struchkov.godfather.telegram.domain.attachment.DocumentAttachment; import dev.struchkov.godfather.telegram.domain.attachment.Picture; import dev.struchkov.godfather.telegram.domain.files.ByteContainer; import dev.struchkov.godfather.telegram.domain.files.FileContainer; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; import dev.struchkov.godfather.telegram.quarkus.context.service.AttachmentService; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; import io.smallrye.mutiny.Uni; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; diff --git a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/TelegramServiceImpl.java b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/TelegramServiceImpl.java index afaab45..fc1460a 100644 --- a/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/TelegramServiceImpl.java +++ b/telegram-core/telegram-core-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/core/service/TelegramServiceImpl.java @@ -2,7 +2,7 @@ package dev.struchkov.godfather.telegram.quarkus.core.service; import dev.struchkov.godfather.telegram.domain.ChatAction; import dev.struchkov.godfather.telegram.domain.ClientBotCommand; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramService; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; diff --git a/telegram-core/telegram-core-main/src/main/java/dev/struchkov/godfather/telegram/main/core/TelegramDefaultConnect.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramDefaultConnect.java similarity index 88% rename from telegram-core/telegram-core-main/src/main/java/dev/struchkov/godfather/telegram/main/core/TelegramDefaultConnect.java rename to telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramDefaultConnect.java index 01370d1..d943eef 100644 --- a/telegram-core/telegram-core-main/src/main/java/dev/struchkov/godfather/telegram/main/core/TelegramDefaultConnect.java +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramDefaultConnect.java @@ -1,8 +1,9 @@ -package dev.struchkov.godfather.telegram.main.core; +package dev.struchkov.godfather.telegram.simple.core; import dev.struchkov.godfather.telegram.domain.config.ProxyConfig; import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; +import dev.struchkov.godfather.telegram.simple.context.service.EventDistributor; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; import org.jetbrains.annotations.NotNull; import org.telegram.telegrambots.bots.DefaultAbsSender; import org.telegram.telegrambots.bots.DefaultBotOptions; @@ -80,4 +81,9 @@ public class TelegramDefaultConnect implements TelegramConnect { return botToken; } + @Override + public void initEventDistributor(EventDistributor eventDistributorService) { + throw new IllegalStateException(); + } + } diff --git a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramConnectBot.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramPollingConnect.java similarity index 94% rename from telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramConnectBot.java rename to telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramPollingConnect.java index d9b60c7..9a01ba4 100644 --- a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramConnectBot.java +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramPollingConnect.java @@ -3,9 +3,9 @@ package dev.struchkov.godfather.telegram.simple.core; import dev.struchkov.godfather.telegram.domain.config.ProxyConfig; import dev.struchkov.godfather.telegram.domain.config.ProxyConfig.Type; import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; import dev.struchkov.godfather.telegram.simple.context.service.EventDistributor; import dev.struchkov.godfather.telegram.simple.context.service.TelegramBot; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.telegram.telegrambots.bots.DefaultBotOptions; @@ -24,14 +24,14 @@ import static dev.struchkov.haiti.utils.Checker.checkNotNull; * * @author upagge [30.01.2020] */ -public class TelegramConnectBot implements TelegramConnect { +public class TelegramPollingConnect implements TelegramConnect { - private static final Logger log = LoggerFactory.getLogger(TelegramConnectBot.class); + private static final Logger log = LoggerFactory.getLogger(TelegramPollingConnect.class); private TelegramBot telegramBot; private final TelegramBotConfig telegramBotConfig; - public TelegramConnectBot(TelegramBotConfig telegramBotConfig) { + public TelegramPollingConnect(TelegramBotConfig telegramBotConfig) { this.telegramBotConfig = telegramBotConfig; initLongPolling(telegramBotConfig); } diff --git a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookBot.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookBot.java new file mode 100644 index 0000000..7d1168a --- /dev/null +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookBot.java @@ -0,0 +1,52 @@ +package dev.struchkov.godfather.telegram.simple.core; + +import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; +import dev.struchkov.godfather.telegram.simple.context.service.EventDistributor; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramBot; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.BotApiMethod; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.bots.AbsSender; + +@Slf4j +public class TelegramWebhookBot extends org.telegram.telegrambots.bots.TelegramWebhookBot implements TelegramBot { + + private final TelegramBotConfig telegramBotConfig; + private EventDistributor eventDistributor; + + public TelegramWebhookBot(TelegramBotConfig telegramBotConfig) { + this.telegramBotConfig = telegramBotConfig; + } + + @Override + public String getBotUsername() { + return telegramBotConfig.getUsername(); + } + + @Override + public String getBotToken() { + return telegramBotConfig.getToken(); + } + + @Override + public BotApiMethod onWebhookUpdateReceived(Update update) { + eventDistributor.processing(update); + return null; + } + + @Override + public String getBotPath() { + return null; + } + + @Override + public AbsSender getAdsSender() { + return this; + } + + @Override + public void initEventDistributor(EventDistributor eventDistributor) { + this.eventDistributor = eventDistributor; + } + +} diff --git a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookConnect.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookConnect.java new file mode 100644 index 0000000..c94302f --- /dev/null +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/TelegramWebhookConnect.java @@ -0,0 +1,48 @@ +package dev.struchkov.godfather.telegram.simple.core; + +import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; +import dev.struchkov.godfather.telegram.simple.context.service.EventDistributor; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.updates.SetWebhook; +import org.telegram.telegrambots.meta.bots.AbsSender; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; + +@Slf4j +public class TelegramWebhookConnect implements TelegramConnect { + + private TelegramWebhookBot webhookBot; + + public TelegramWebhookConnect(TelegramBotConfig telegramBotConfig) { + initWebHook(telegramBotConfig); + } + + private void initWebHook(TelegramBotConfig telegramBotConfig) { + try { + final TelegramWebhookBot bot = new TelegramWebhookBot(telegramBotConfig); + final SetWebhook setWebhook = SetWebhook.builder() + .url(telegramBotConfig.getWebHookUrl()) + .build(); + bot.setWebhook(setWebhook); + webhookBot = bot; + } catch (TelegramApiException e) { + log.error(e.getMessage()); + } + } + + @Override + public AbsSender getAbsSender() { + return webhookBot.getAdsSender(); + } + + @Override + public String getToken() { + return webhookBot.getBotToken(); + } + + @Override + public void initEventDistributor(EventDistributor eventDistributorService) { + webhookBot.initEventDistributor(eventDistributorService); + } + +} diff --git a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/handler/PreCheckoutQueryHandler.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/handler/PreCheckoutQueryHandler.java new file mode 100644 index 0000000..ba26d13 --- /dev/null +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/handler/PreCheckoutQueryHandler.java @@ -0,0 +1,36 @@ +package dev.struchkov.godfather.telegram.simple.core.handler; + +import dev.struchkov.godfather.simple.context.service.EventHandler; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.methods.AnswerPreCheckoutQuery; +import org.telegram.telegrambots.meta.api.objects.payments.PreCheckoutQuery; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; + +@Slf4j +@RequiredArgsConstructor +public class PreCheckoutQueryHandler implements EventHandler { + + private final TelegramConnect telegramConnect; + + @Override + public void handle(PreCheckoutQuery event) { + final AnswerPreCheckoutQuery answerPreCheckoutQuery = new AnswerPreCheckoutQuery(); + answerPreCheckoutQuery.setPreCheckoutQueryId(event.getId()); + answerPreCheckoutQuery.setOk(true); + try { + answerPreCheckoutQuery.validate(); + telegramConnect.getAbsSender().execute(answerPreCheckoutQuery); + } catch (TelegramApiException e) { + log.error(e.getMessage(), e); + } + + } + + @Override + public String getEventType() { + return PreCheckoutQuery.class.getName(); + } + +} diff --git a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/AttachmentServiceImpl.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/AttachmentServiceImpl.java index 3fbb993..368fbe1 100644 --- a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/AttachmentServiceImpl.java +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/AttachmentServiceImpl.java @@ -4,7 +4,7 @@ import dev.struchkov.godfather.telegram.domain.attachment.DocumentAttachment; import dev.struchkov.godfather.telegram.domain.attachment.Picture; import dev.struchkov.godfather.telegram.domain.files.ByteContainer; import dev.struchkov.godfather.telegram.domain.files.FileContainer; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; import dev.struchkov.godfather.telegram.simple.context.service.AttachmentService; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; diff --git a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/TelegramServiceImpl.java b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/TelegramServiceImpl.java index ddd94ba..5886061 100644 --- a/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/TelegramServiceImpl.java +++ b/telegram-core/telegram-core-simple/src/main/java/dev/struchkov/godfather/telegram/simple/core/service/TelegramServiceImpl.java @@ -2,7 +2,7 @@ package dev.struchkov.godfather.telegram.simple.core.service; import dev.struchkov.godfather.telegram.domain.ChatAction; import dev.struchkov.godfather.telegram.domain.ClientBotCommand; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; import dev.struchkov.godfather.telegram.simple.context.service.TelegramService; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; diff --git a/telegram-domain/telegram-domain-main/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramBotConfig.java b/telegram-domain/telegram-domain-main/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramBotConfig.java index 98f4a04..610290c 100644 --- a/telegram-domain/telegram-domain-main/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramBotConfig.java +++ b/telegram-domain/telegram-domain-main/src/main/java/dev/struchkov/godfather/telegram/domain/config/TelegramBotConfig.java @@ -1,14 +1,22 @@ package dev.struchkov.godfather.telegram.domain.config; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + /** * TODO: Добавить описание класса. * * @author upagge [18.08.2019] */ +@Getter +@Setter +@NoArgsConstructor public class TelegramBotConfig { private String username; private String token; + private String webHookUrl; private ProxyConfig proxyConfig; @@ -17,31 +25,4 @@ public class TelegramBotConfig { this.token = token; } - public TelegramBotConfig() { - } - - public void setUsername(String botUsername) { - this.username = botUsername; - } - - public void setToken(String botToken) { - this.token = botToken; - } - - public String getUsername() { - return username; - } - - public String getToken() { - return token; - } - - public ProxyConfig getProxyConfig() { - return proxyConfig; - } - - public void setProxyConfig(ProxyConfig proxyConfig) { - this.proxyConfig = proxyConfig; - } - } diff --git a/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java b/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java index 42cbeb6..e88d5cd 100644 --- a/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java +++ b/telegram-sender/telegram-sender-quarkus/src/main/java/dev/struchkov/godfather/telegram/quarkus/sender/TelegramSender.java @@ -5,14 +5,16 @@ import dev.struchkov.godfather.quarkus.domain.BoxAnswer; import dev.struchkov.godfather.quarkus.domain.SentBox; import dev.struchkov.godfather.quarkus.domain.action.PreSendProcessing; import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; +import dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload; import dev.struchkov.godfather.telegram.main.sender.util.KeyBoardConvert; import dev.struchkov.godfather.telegram.quarkus.context.repository.SenderRepository; +import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramConnect; import dev.struchkov.godfather.telegram.quarkus.context.service.TelegramSending; import io.smallrye.mutiny.Uni; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.telegram.telegrambots.meta.api.methods.invoices.SendInvoice; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.methods.updatingmessages.DeleteMessage; import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText; @@ -23,6 +25,7 @@ import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; import java.io.Serializable; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import static dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload.DISABLE_NOTIFICATION; @@ -95,26 +98,34 @@ public class TelegramSender implements TelegramSending { .onItem().transformToUni( v -> { final String recipientTelegramId = boxAnswer.getRecipientPersonId(); - if (boxAnswer.isReplace()) { - final String replaceMessageId = boxAnswer.getReplaceMessageId(); - if (checkNotNull(replaceMessageId)) { - return replace(recipientTelegramId, replaceMessageId, boxAnswer, saveMessageId); - } else { - if (checkNotNull(senderRepository)) { - return senderRepository.getLastSendMessage(recipientTelegramId) - .onItem().transformToUni( - lastId -> { - if (checkNotNull(lastId)) { - return replace(recipientTelegramId, lastId, boxAnswer, saveMessageId); - } else { - return sendMessage(recipientTelegramId, boxAnswer, saveMessageId); + + final Optional optInvoice = boxAnswer.getPayLoad(BoxAnswerPayload.INVOICE); + if (optInvoice.isPresent()) { + final SendInvoice sendInvoice = optInvoice.get(); + return Uni.createFrom().completionStage(executeAsync(sendInvoice)) + .onItem().transform(ignore -> null); + } else { + if (boxAnswer.isReplace()) { + final String replaceMessageId = boxAnswer.getReplaceMessageId(); + if (checkNotNull(replaceMessageId)) { + return replace(recipientTelegramId, replaceMessageId, boxAnswer, saveMessageId); + } else { + if (checkNotNull(senderRepository)) { + return senderRepository.getLastSendMessage(recipientTelegramId) + .onItem().transformToUni( + lastId -> { + if (checkNotNull(lastId)) { + return replace(recipientTelegramId, lastId, boxAnswer, saveMessageId); + } else { + return sendMessage(recipientTelegramId, boxAnswer, saveMessageId); + } } - } - ); + ); + } } } + return sendMessage(recipientTelegramId, boxAnswer, saveMessageId); } - return sendMessage(recipientTelegramId, boxAnswer, saveMessageId); } ); } @@ -201,6 +212,15 @@ public class TelegramSender implements TelegramSending { return completedFuture(null); } + private CompletableFuture executeAsync(SendInvoice sendInvoice) { + try { + return absSender.executeAsync(sendInvoice); + } catch (TelegramApiException e) { + log.error(e.getMessage(), e); + } + return completedFuture(null); + } + @Override public SendType getType() { return SendType.PRIVATE; diff --git a/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java b/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java index 8aac2d2..5a34389 100644 --- a/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java +++ b/telegram-sender/telegram-sender-simple/src/main/java/dev/struchkov/godfather/telegram/simple/sender/TelegramSender.java @@ -5,12 +5,14 @@ import dev.struchkov.godfather.simple.domain.BoxAnswer; import dev.struchkov.godfather.simple.domain.SentBox; import dev.struchkov.godfather.simple.domain.action.PreSendProcessing; import dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard; -import dev.struchkov.godfather.telegram.main.context.TelegramConnect; +import dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload; import dev.struchkov.godfather.telegram.simple.context.repository.SenderRepository; +import dev.struchkov.godfather.telegram.simple.context.service.TelegramConnect; import dev.struchkov.godfather.telegram.simple.context.service.TelegramSending; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.telegram.telegrambots.meta.api.methods.invoices.SendInvoice; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.methods.updatingmessages.DeleteMessage; import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText; @@ -93,6 +95,19 @@ public class TelegramSender implements TelegramSending { final String recipientTelegramId = boxAnswer.getRecipientPersonId(); isNotNull(recipientTelegramId); + final Optional optInvoice = boxAnswer.getPayLoad(BoxAnswerPayload.INVOICE); + if (optInvoice.isPresent()) { + final SendInvoice sendInvoice = optInvoice.get(); + try { + sendInvoice.validate(); + absSender.execute(sendInvoice); + return Optional.empty(); + } catch (TelegramApiException e) { + log.error(e.getMessage(), e); + return Optional.empty(); + } + } + BoxAnswer preparedAnswer = boxAnswer; for (PreSendProcessing preSendProcessor : preSendProcessors) { preparedAnswer = preSendProcessor.pretreatment(boxAnswer); diff --git a/telegram-webhook/pom.xml b/telegram-webhook/pom.xml new file mode 100644 index 0000000..e9b4568 --- /dev/null +++ b/telegram-webhook/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + dev.struchkov.godfather.telegram + telegram-bot + 0.0.53-SNAPSHOT + + + telegram-webhook + pom + + telegram-webhook-quarkus + + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/telegram-webhook/telegram-webhook-quarkus/pom.xml b/telegram-webhook/telegram-webhook-quarkus/pom.xml new file mode 100644 index 0000000..3af3978 --- /dev/null +++ b/telegram-webhook/telegram-webhook-quarkus/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + dev.struchkov.godfather.telegram + telegram-webhook + 0.0.53-SNAPSHOT + + + telegram-webhook-quarkus + + + 17 + 17 + UTF-8 + + + + + dev.struchkov.godfather.telegram + telegram-context-quarkus + + + io.smallrye.reactive + smallrye-mutiny-vertx-core + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_2.1_spec + + + org.telegram + telegrambots-meta + + + + \ No newline at end of file diff --git a/telegram-webhook/telegram-webhook-quarkus/src/main/java/dev/struchkov/godfather/telegram/webhook/WebhookController.java b/telegram-webhook/telegram-webhook-quarkus/src/main/java/dev/struchkov/godfather/telegram/webhook/WebhookController.java new file mode 100644 index 0000000..b88fa7b --- /dev/null +++ b/telegram-webhook/telegram-webhook-quarkus/src/main/java/dev/struchkov/godfather/telegram/webhook/WebhookController.java @@ -0,0 +1,50 @@ +package dev.struchkov.godfather.telegram.webhook; + +import dev.struchkov.godfather.telegram.domain.config.TelegramBotConfig; +import dev.struchkov.godfather.telegram.quarkus.context.service.EventDistributor; +import io.smallrye.mutiny.Uni; +import lombok.extern.slf4j.Slf4j; +import org.telegram.telegrambots.meta.api.objects.Update; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@Slf4j +@Path("callback") +public class WebhookController { + + private final String pathKey; + private final EventDistributor eventDistributor; + + public WebhookController(TelegramBotConfig telegramBotConfig, EventDistributor eventDistributor) { + this.eventDistributor = eventDistributor; + this.pathKey = telegramBotConfig.getWebHookUrl().split("callback")[1]; + } + + @POST + @Path("/{botPath}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Uni updateReceived(@PathParam("botPath") String botPath, Update update) { + return Uni.createFrom().voidItem() +// .onItem().invoke(() -> isTrue(pathKey.equals(botPath), accessException("В доступе отказано!"))) + .onItem().ignore().andSwitchTo(() -> eventDistributor.processing(update)) + .onItem().transform(ignore -> Response.ok().build()); + } + + @GET + @Path("/{botPath}") + @Produces(MediaType.APPLICATION_JSON) + public Uni testReceived(@PathParam("botPath") String botPath) { + return Uni.createFrom().voidItem() +// .onItem().invoke(() -> isTrue(pathKey.equals(botPath), accessException("В доступе отказано!"))) + .onItem().transform(ignore -> "Hi there " + botPath + "!"); + } + +}