From fd7a477e121b15e4ffb98a441310ee1d58c2992e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 00:59:43 +0000 Subject: [PATCH 1/4] Initial plan From 4031f3aa7b984747aee1c2c55ab466a00b47aa28 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 01:12:12 +0000 Subject: [PATCH 2/4] Add message reaction event handlers Implement event handling for message reactions (MessageReactionUpdated and MessageReactionCountUpdated). These types were already defined in the codebase but event handlers were not wired up. This adds support for Bot API features related to message reactions. Co-authored-by: Royna2544 <69458352+Royna2544@users.noreply.github.com> --- include/tgbot/EventBroadcaster.h | 40 ++++++++++++++++++++++++++++++++ src/EventHandler.cpp | 6 +++++ 2 files changed, 46 insertions(+) diff --git a/include/tgbot/EventBroadcaster.h b/include/tgbot/EventBroadcaster.h index 8773f3532..eb2281891 100644 --- a/include/tgbot/EventBroadcaster.h +++ b/include/tgbot/EventBroadcaster.h @@ -12,6 +12,8 @@ #include "tgbot/types/PollAnswer.h" #include "tgbot/types/ChatMemberUpdated.h" #include "tgbot/types/ChatJoinRequest.h" +#include "tgbot/types/MessageReactionUpdated.h" +#include "tgbot/types/MessageReactionCountUpdated.h" #include #include @@ -43,6 +45,8 @@ friend EventHandler; typedef std::function PollAnswerListener; typedef std::function ChatMemberUpdatedListener; typedef std::function ChatJoinRequestListener; + typedef std::function MessageReactionUpdatedListener; + typedef std::function MessageReactionCountUpdatedListener; /** * @brief Registers listener which receives new incoming message of any kind - text, photo, sticker, etc. @@ -202,6 +206,32 @@ friend EventHandler; _onChatJoinRequestListeners.push_back(listener); } + /** + * @brief Registers listener which receives message reaction updates. + * + * The bot must be an administrator in the chat and must explicitly specify + * "message_reaction" in the list of allowedUpdates to receive these updates. + * The update isn't received for reactions set by bots. + * + * @param listener Listener. + */ + inline void onMessageReaction(const MessageReactionUpdatedListener& listener){ + _onMessageReactionUpdatedListeners.push_back(listener); + } + + /** + * @brief Registers listener which receives message reaction count updates. + * + * The bot must be an administrator in the chat and must explicitly specify + * "message_reaction_count" in the list of allowedUpdates to receive these updates. + * The updates are grouped and can be sent with delay up to a few minutes. + * + * @param listener Listener. + */ + inline void onMessageReactionCount(const MessageReactionCountUpdatedListener& listener){ + _onMessageReactionCountUpdatedListeners.push_back(listener); + } + private: template inline void broadcast(const std::vector& listeners, const ObjectType object) const { @@ -278,6 +308,14 @@ friend EventHandler; broadcast(_onChatJoinRequestListeners, result); } + inline void broadcastMessageReactionUpdated(const MessageReactionUpdated::Ptr& result) const { + broadcast(_onMessageReactionUpdatedListeners, result); + } + + inline void broadcastMessageReactionCountUpdated(const MessageReactionCountUpdated::Ptr& result) const { + broadcast(_onMessageReactionCountUpdatedListeners, result); + } + std::vector _onAnyMessageListeners; std::unordered_map _onCommandListeners; std::vector _onUnknownCommandListeners; @@ -293,6 +331,8 @@ friend EventHandler; std::vector _onMyChatMemberListeners; std::vector _onChatMemberListeners; std::vector _onChatJoinRequestListeners; + std::vector _onMessageReactionUpdatedListeners; + std::vector _onMessageReactionCountUpdatedListeners; }; } diff --git a/src/EventHandler.cpp b/src/EventHandler.cpp index 3bfb7d39e..1b8f9cd05 100644 --- a/src/EventHandler.cpp +++ b/src/EventHandler.cpp @@ -46,6 +46,12 @@ void EventHandler::handleUpdate(const Update::Ptr& update) const { if (update->chatJoinRequest != nullptr) { _broadcaster->broadcastChatJoinRequest(update->chatJoinRequest); } + if (update->messageReaction != nullptr) { + _broadcaster->broadcastMessageReactionUpdated(update->messageReaction); + } + if (update->messageReactionCount != nullptr) { + _broadcaster->broadcastMessageReactionCountUpdated(update->messageReactionCount); + } } void EventHandler::handleMessage(const Message::Ptr& message) const { From 1c8807ba226b3118cfd753b1291c8a5e532b0990 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 01:14:26 +0000 Subject: [PATCH 3/4] Add business and chat boost event handlers Implement event handling for business features (BusinessConnection, business messages, deleted business messages) and chat boost features (ChatBoostUpdated, ChatBoostRemoved). These types were already in the codebase but event handlers were not wired up. This adds support for Bot API 7.x business and boost features. Co-authored-by: Royna2544 <69458352+Royna2544@users.noreply.github.com> --- include/tgbot/EventBroadcaster.h | 107 +++++++++++++++++++++++++++++++ src/EventHandler.cpp | 26 ++++++-- 2 files changed, 129 insertions(+), 4 deletions(-) diff --git a/include/tgbot/EventBroadcaster.h b/include/tgbot/EventBroadcaster.h index eb2281891..5fc035537 100644 --- a/include/tgbot/EventBroadcaster.h +++ b/include/tgbot/EventBroadcaster.h @@ -14,6 +14,10 @@ #include "tgbot/types/ChatJoinRequest.h" #include "tgbot/types/MessageReactionUpdated.h" #include "tgbot/types/MessageReactionCountUpdated.h" +#include "tgbot/types/BusinessConnection.h" +#include "tgbot/types/BusinessMessagesDeleted.h" +#include "tgbot/types/ChatBoostUpdated.h" +#include "tgbot/types/ChatBoostRemoved.h" #include #include @@ -47,6 +51,10 @@ friend EventHandler; typedef std::function ChatJoinRequestListener; typedef std::function MessageReactionUpdatedListener; typedef std::function MessageReactionCountUpdatedListener; + typedef std::function BusinessConnectionListener; + typedef std::function BusinessMessagesDeletedListener; + typedef std::function ChatBoostUpdatedListener; + typedef std::function ChatBoostRemovedListener; /** * @brief Registers listener which receives new incoming message of any kind - text, photo, sticker, etc. @@ -232,6 +240,75 @@ friend EventHandler; _onMessageReactionCountUpdatedListeners.push_back(listener); } + /** + * @brief Registers listener which receives business connection updates. + * + * The bot was connected to or disconnected from a business account, + * or a user edited an existing connection with the bot. + * + * @param listener Listener. + */ + inline void onBusinessConnection(const BusinessConnectionListener& listener){ + _onBusinessConnectionListeners.push_back(listener); + } + + /** + * @brief Registers listener which receives business message updates. + * + * New non-service message from a connected business account. + * + * @param listener Listener. + */ + inline void onBusinessMessage(const MessageListener& listener){ + _onBusinessMessageListeners.push_back(listener); + } + + /** + * @brief Registers listener which receives edited business message updates. + * + * New version of a message from a connected business account. + * + * @param listener Listener. + */ + inline void onEditedBusinessMessage(const MessageListener& listener){ + _onEditedBusinessMessageListeners.push_back(listener); + } + + /** + * @brief Registers listener which receives business messages deleted updates. + * + * Messages were deleted from a connected business account. + * + * @param listener Listener. + */ + inline void onDeletedBusinessMessages(const BusinessMessagesDeletedListener& listener){ + _onDeletedBusinessMessagesListeners.push_back(listener); + } + + /** + * @brief Registers listener which receives chat boost updates. + * + * A chat boost was added or changed. The bot must be an administrator + * in the chat to receive these updates. + * + * @param listener Listener. + */ + inline void onChatBoost(const ChatBoostUpdatedListener& listener){ + _onChatBoostUpdatedListeners.push_back(listener); + } + + /** + * @brief Registers listener which receives removed chat boost updates. + * + * A boost was removed from a chat. The bot must be an administrator + * in the chat to receive these updates. + * + * @param listener Listener. + */ + inline void onRemovedChatBoost(const ChatBoostRemovedListener& listener){ + _onRemovedChatBoostListeners.push_back(listener); + } + private: template inline void broadcast(const std::vector& listeners, const ObjectType object) const { @@ -316,6 +393,30 @@ friend EventHandler; broadcast(_onMessageReactionCountUpdatedListeners, result); } + inline void broadcastBusinessConnection(const BusinessConnection::Ptr& result) const { + broadcast(_onBusinessConnectionListeners, result); + } + + inline void broadcastBusinessMessage(const Message::Ptr& message) const { + broadcast(_onBusinessMessageListeners, message); + } + + inline void broadcastEditedBusinessMessage(const Message::Ptr& message) const { + broadcast(_onEditedBusinessMessageListeners, message); + } + + inline void broadcastDeletedBusinessMessages(const BusinessMessagesDeleted::Ptr& result) const { + broadcast(_onDeletedBusinessMessagesListeners, result); + } + + inline void broadcastChatBoostUpdated(const ChatBoostUpdated::Ptr& result) const { + broadcast(_onChatBoostUpdatedListeners, result); + } + + inline void broadcastRemovedChatBoost(const ChatBoostRemoved::Ptr& result) const { + broadcast(_onRemovedChatBoostListeners, result); + } + std::vector _onAnyMessageListeners; std::unordered_map _onCommandListeners; std::vector _onUnknownCommandListeners; @@ -333,6 +434,12 @@ friend EventHandler; std::vector _onChatJoinRequestListeners; std::vector _onMessageReactionUpdatedListeners; std::vector _onMessageReactionCountUpdatedListeners; + std::vector _onBusinessConnectionListeners; + std::vector _onBusinessMessageListeners; + std::vector _onEditedBusinessMessageListeners; + std::vector _onDeletedBusinessMessagesListeners; + std::vector _onChatBoostUpdatedListeners; + std::vector _onRemovedChatBoostListeners; }; } diff --git a/src/EventHandler.cpp b/src/EventHandler.cpp index 1b8f9cd05..06f930f64 100644 --- a/src/EventHandler.cpp +++ b/src/EventHandler.cpp @@ -16,6 +16,24 @@ void EventHandler::handleUpdate(const Update::Ptr& update) const { if (update->editedChannelPost != nullptr) { _broadcaster->broadcastEditedMessage(update->editedChannelPost); } + if (update->businessConnection != nullptr) { + _broadcaster->broadcastBusinessConnection(update->businessConnection); + } + if (update->businessMessage != nullptr) { + _broadcaster->broadcastBusinessMessage(update->businessMessage); + } + if (update->editedBusinessMessage != nullptr) { + _broadcaster->broadcastEditedBusinessMessage(update->editedBusinessMessage); + } + if (update->deletedBusinessMessages != nullptr) { + _broadcaster->broadcastDeletedBusinessMessages(update->deletedBusinessMessages); + } + if (update->messageReaction != nullptr) { + _broadcaster->broadcastMessageReactionUpdated(update->messageReaction); + } + if (update->messageReactionCount != nullptr) { + _broadcaster->broadcastMessageReactionCountUpdated(update->messageReactionCount); + } if (update->inlineQuery != nullptr) { _broadcaster->broadcastInlineQuery(update->inlineQuery); } @@ -46,11 +64,11 @@ void EventHandler::handleUpdate(const Update::Ptr& update) const { if (update->chatJoinRequest != nullptr) { _broadcaster->broadcastChatJoinRequest(update->chatJoinRequest); } - if (update->messageReaction != nullptr) { - _broadcaster->broadcastMessageReactionUpdated(update->messageReaction); + if (update->chatBoost != nullptr) { + _broadcaster->broadcastChatBoostUpdated(update->chatBoost); } - if (update->messageReactionCount != nullptr) { - _broadcaster->broadcastMessageReactionCountUpdated(update->messageReactionCount); + if (update->removedChatBoost != nullptr) { + _broadcaster->broadcastRemovedChatBoost(update->removedChatBoost); } } From 56290475a48af4c6f911ee8516981998e6970eb3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 01:14:57 +0000 Subject: [PATCH 4/4] Update README with implemented Bot API features Document recently added event handlers for message reactions, business account integration, and chat boosts. Clarify current Bot API version support and known limitations. Co-authored-by: Royna2544 <69458352+Royna2544@users.noreply.github.com> --- README.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3ec1f7403..9e2688df8 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,28 @@ Documentation is located [here](http://reo7sp.github.io/tgbot-cpp). ## State -- [x] Telegram Bot API 7.2 -- [ ] [MaybeInaccessibleMessage](https://core.telegram.org/bots/api#maybeinaccessiblemessage) -- [ ] [Message->pinnedMessage](https://core.telegram.org/bots/api#message) -- [ ] [CallbackQuery->message](https://core.telegram.org/bots/api#callbackquery) +This library implements most features from **Telegram Bot API 7.2** with additional features from later versions. + +### Recently Added Features: +- [x] Message Reactions (Bot API 7.x+) + - MessageReactionUpdated event handling + - MessageReactionCountUpdated event handling +- [x] Business Account Integration (Bot API 7.x+) + - BusinessConnection updates + - Business message handling + - Deleted business messages tracking +- [x] Chat Boosts (Bot API 7.x+) + - ChatBoostUpdated events + - ChatBoostRemoved events + +### Known Limitations: +- [ ] [MaybeInaccessibleMessage](https://core.telegram.org/bots/api#maybeinaccessiblemessage) - Planned for future implementation +- [ ] [Message->pinnedMessage](https://core.telegram.org/bots/api#message) - Requires MaybeInaccessibleMessage +- [ ] [CallbackQuery->message](https://core.telegram.org/bots/api#callbackquery) - Requires MaybeInaccessibleMessage - [ ] [Deep Linking](https://core.telegram.org/bots/features#deep-linking) +**Note:** Full Bot API 8.x and 9.x support is planned. Contributions are welcome! + ## Sample