diff --git a/include/tgbot/EventBroadcaster.h b/include/tgbot/EventBroadcaster.h index 98c04818..2148d14c 100644 --- a/include/tgbot/EventBroadcaster.h +++ b/include/tgbot/EventBroadcaster.h @@ -44,7 +44,7 @@ friend EventHandler; typedef std::function PollAnswerListener; typedef std::function ChatMemberUpdatedListener; typedef std::function ChatJoinRequestListener; - typedef std::function SuccessfulPaymentListener; + typedef std::function SuccessfulPaymentListener; /** * @brief Registers listener which receives new incoming message of any kind - text, photo, sticker, etc. @@ -214,6 +214,9 @@ friend EventHandler; _onSuccessfulPaymentListeners.push_back(listener); } + + + private: template inline void broadcast(const std::vector& listeners, const ObjectType object) const { @@ -290,10 +293,16 @@ friend EventHandler; broadcast(_onChatJoinRequestListeners, result); } - inline void broadcastSuccessfulPayment(const SuccessfulPayment::Ptr& payment) const { - broadcast(_onSuccessfulPaymentListeners, payment); + inline void broadcastSuccessfulPayment(const Message::Ptr& message) const { + if (!message || !message->successfulPayment) { + return; + } + for (const auto& listener : _onSuccessfulPaymentListeners) { + listener(message, message->successfulPayment); + } } + std::vector _onAnyMessageListeners; std::unordered_map _onCommandListeners; std::vector _onUnknownCommandListeners; diff --git a/include/tgbot/types/Update.h b/include/tgbot/types/Update.h index a7ad470c..f374e014 100644 --- a/include/tgbot/types/Update.h +++ b/include/tgbot/types/Update.h @@ -17,6 +17,7 @@ #include "tgbot/types/ChatJoinRequest.h" #include "tgbot/types/ChatBoostUpdated.h" #include "tgbot/types/ChatBoostRemoved.h" +#include "tgbot/types/SuccessfulPayment.h" #include #include @@ -183,6 +184,13 @@ class Update { * The bot must be an administrator in the chat to receive these updates. */ ChatBoostRemoved::Ptr removedChatBoost; + + /** + * @brief Optional. A boost was removed from a chat. + * + * The bot must be an administrator in the chat to receive these updates. + */ + SuccessfulPayment::Ptr successfulPayment; }; } diff --git a/src/EventHandler.cpp b/src/EventHandler.cpp index a19e7f4a..02ad31f1 100644 --- a/src/EventHandler.cpp +++ b/src/EventHandler.cpp @@ -72,10 +72,11 @@ void EventHandler::handleMessage(const Message::Ptr& message) const { } else { _broadcaster.broadcastNonCommandMessage(message); } - + if (message->successfulPayment != nullptr) { - _broadcaster.broadcastSuccessfulPayment(message->successfulPayment); + _broadcaster.broadcastSuccessfulPayment(message); } + } } diff --git a/src/TgTypeParser.cpp b/src/TgTypeParser.cpp index d3e9bd92..875ada77 100644 --- a/src/TgTypeParser.cpp +++ b/src/TgTypeParser.cpp @@ -27,6 +27,7 @@ Update::Ptr TgTypeParser::parseJsonAndGetUpdate(const boost::property_tree::ptre result->chatJoinRequest = tryParseJson(&TgTypeParser::parseJsonAndGetChatJoinRequest, data, "chat_join_request"); result->chatBoost = tryParseJson(&TgTypeParser::parseJsonAndGetChatBoostUpdated, data, "chat_boost"); result->removedChatBoost = tryParseJson(&TgTypeParser::parseJsonAndGetChatBoostRemoved, data, "removed_chat_boost"); + result->successfulPayment = tryParseJson(&TgTypeParser::parseJsonAndGetSuccessfulPayment, data, "successful_payment"); return result; } @@ -59,6 +60,7 @@ std::string TgTypeParser::parseUpdate(const Update::Ptr& object) const { appendToJson(result, "chat_join_request", parseChatJoinRequest(object->chatJoinRequest)); appendToJson(result, "chat_boost", parseChatBoostUpdated(object->chatBoost)); appendToJson(result, "removed_chat_boost", parseChatBoostRemoved(object->removedChatBoost)); + appendToJson(result, "successful_payment", parseSuccessfulPayment(object->successfulPayment)); removeLastComma(result); result += '}'; return result;