Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
147 changes: 147 additions & 0 deletions include/tgbot/EventBroadcaster.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
#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 "tgbot/types/BusinessConnection.h"
#include "tgbot/types/BusinessMessagesDeleted.h"
#include "tgbot/types/ChatBoostUpdated.h"
#include "tgbot/types/ChatBoostRemoved.h"

#include <functional>
#include <initializer_list>
Expand Down Expand Up @@ -43,6 +49,12 @@ friend EventHandler;
typedef std::function<void (const PollAnswer::Ptr)> PollAnswerListener;
typedef std::function<void (const ChatMemberUpdated::Ptr)> ChatMemberUpdatedListener;
typedef std::function<void (const ChatJoinRequest::Ptr)> ChatJoinRequestListener;
typedef std::function<void (const MessageReactionUpdated::Ptr)> MessageReactionUpdatedListener;
typedef std::function<void (const MessageReactionCountUpdated::Ptr)> MessageReactionCountUpdatedListener;
typedef std::function<void (const BusinessConnection::Ptr)> BusinessConnectionListener;
typedef std::function<void (const BusinessMessagesDeleted::Ptr)> BusinessMessagesDeletedListener;
typedef std::function<void (const ChatBoostUpdated::Ptr)> ChatBoostUpdatedListener;
typedef std::function<void (const ChatBoostRemoved::Ptr)> ChatBoostRemovedListener;

/**
* @brief Registers listener which receives new incoming message of any kind - text, photo, sticker, etc.
Expand Down Expand Up @@ -202,6 +214,101 @@ 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);
}

/**
* @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<typename ListenerType, typename ObjectType>
inline void broadcast(const std::vector<ListenerType>& listeners, const ObjectType object) const {
Expand Down Expand Up @@ -278,6 +385,38 @@ friend EventHandler;
broadcast<ChatJoinRequestListener, ChatJoinRequest::Ptr>(_onChatJoinRequestListeners, result);
}

inline void broadcastMessageReactionUpdated(const MessageReactionUpdated::Ptr& result) const {
broadcast<MessageReactionUpdatedListener, MessageReactionUpdated::Ptr>(_onMessageReactionUpdatedListeners, result);
}

inline void broadcastMessageReactionCountUpdated(const MessageReactionCountUpdated::Ptr& result) const {
broadcast<MessageReactionCountUpdatedListener, MessageReactionCountUpdated::Ptr>(_onMessageReactionCountUpdatedListeners, result);
}

inline void broadcastBusinessConnection(const BusinessConnection::Ptr& result) const {
broadcast<BusinessConnectionListener, BusinessConnection::Ptr>(_onBusinessConnectionListeners, result);
}

inline void broadcastBusinessMessage(const Message::Ptr& message) const {
broadcast<MessageListener, Message::Ptr>(_onBusinessMessageListeners, message);
}

inline void broadcastEditedBusinessMessage(const Message::Ptr& message) const {
broadcast<MessageListener, Message::Ptr>(_onEditedBusinessMessageListeners, message);
}

inline void broadcastDeletedBusinessMessages(const BusinessMessagesDeleted::Ptr& result) const {
broadcast<BusinessMessagesDeletedListener, BusinessMessagesDeleted::Ptr>(_onDeletedBusinessMessagesListeners, result);
}

inline void broadcastChatBoostUpdated(const ChatBoostUpdated::Ptr& result) const {
broadcast<ChatBoostUpdatedListener, ChatBoostUpdated::Ptr>(_onChatBoostUpdatedListeners, result);
}

inline void broadcastRemovedChatBoost(const ChatBoostRemoved::Ptr& result) const {
broadcast<ChatBoostRemovedListener, ChatBoostRemoved::Ptr>(_onRemovedChatBoostListeners, result);
}

std::vector<MessageListener> _onAnyMessageListeners;
std::unordered_map<std::string, MessageListener> _onCommandListeners;
std::vector<MessageListener> _onUnknownCommandListeners;
Expand All @@ -293,6 +432,14 @@ friend EventHandler;
std::vector<ChatMemberUpdatedListener> _onMyChatMemberListeners;
std::vector<ChatMemberUpdatedListener> _onChatMemberListeners;
std::vector<ChatJoinRequestListener> _onChatJoinRequestListeners;
std::vector<MessageReactionUpdatedListener> _onMessageReactionUpdatedListeners;
std::vector<MessageReactionCountUpdatedListener> _onMessageReactionCountUpdatedListeners;
std::vector<BusinessConnectionListener> _onBusinessConnectionListeners;
std::vector<MessageListener> _onBusinessMessageListeners;
std::vector<MessageListener> _onEditedBusinessMessageListeners;
std::vector<BusinessMessagesDeletedListener> _onDeletedBusinessMessagesListeners;
std::vector<ChatBoostUpdatedListener> _onChatBoostUpdatedListeners;
std::vector<ChatBoostRemovedListener> _onRemovedChatBoostListeners;
};

}
Expand Down
24 changes: 24 additions & 0 deletions src/EventHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -46,6 +64,12 @@ void EventHandler::handleUpdate(const Update::Ptr& update) const {
if (update->chatJoinRequest != nullptr) {
_broadcaster->broadcastChatJoinRequest(update->chatJoinRequest);
}
if (update->chatBoost != nullptr) {
_broadcaster->broadcastChatBoostUpdated(update->chatBoost);
}
if (update->removedChatBoost != nullptr) {
_broadcaster->broadcastRemovedChatBoost(update->removedChatBoost);
}
}

void EventHandler::handleMessage(const Message::Ptr& message) const {
Expand Down