Skip to content

Commit a547fca

Browse files
committed
Update EventBroadcaster (#235)
1 parent 1d238b7 commit a547fca

3 files changed

Lines changed: 176 additions & 19 deletions

File tree

include/tgbot/EventBroadcaster.h

Lines changed: 138 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@
66
#include "tgbot/types/InlineQuery.h"
77
#include "tgbot/types/ChosenInlineResult.h"
88
#include "tgbot/types/CallbackQuery.h"
9+
#include "tgbot/types/ShippingQuery.h"
10+
#include "tgbot/types/PreCheckoutQuery.h"
11+
#include "tgbot/types/Poll.h"
12+
#include "tgbot/types/PollAnswer.h"
13+
#include "tgbot/types/ChatMemberUpdated.h"
14+
#include "tgbot/types/ChatJoinRequest.h"
915

16+
#include <functional>
1017
#include <initializer_list>
1118
#include <string>
12-
#include <functional>
13-
#include <vector>
1419
#include <unordered_map>
20+
#include <vector>
1521

1622
namespace TgBot {
1723

@@ -31,9 +37,15 @@ friend EventHandler;
3137
typedef std::function<void (const InlineQuery::Ptr)> InlineQueryListener;
3238
typedef std::function<void (const ChosenInlineResult::Ptr)> ChosenInlineResultListener;
3339
typedef std::function<void (const CallbackQuery::Ptr)> CallbackQueryListener;
40+
typedef std::function<void (const ShippingQuery::Ptr)> ShippingQueryListener;
41+
typedef std::function<void (const PreCheckoutQuery::Ptr)> PreCheckoutQueryListener;
42+
typedef std::function<void (const Poll::Ptr)> PollListener;
43+
typedef std::function<void (const PollAnswer::Ptr)> PollAnswerListener;
44+
typedef std::function<void (const ChatMemberUpdated::Ptr)> ChatMemberUpdatedListener;
45+
typedef std::function<void (const ChatJoinRequest::Ptr)> ChatJoinRequestListener;
3446

3547
/**
36-
* @brief Registers listener which receives all messages which the bot can ever receive.
48+
* @brief Registers listener which receives new incoming message of any kind - text, photo, sticker, etc.
3749
* @param listener Listener.
3850
*/
3951
inline void onAnyMessage(const MessageListener& listener) {
@@ -87,29 +99,109 @@ friend EventHandler;
8799
}
88100

89101
/**
90-
* @brief Registers listener which receives all the inline query.
102+
* @brief Registers listener which receives new versions of a message that is known to the bot and was edited
103+
* @param listener Listener.
104+
*/
105+
inline void onEditedMessage(const MessageListener& listener) {
106+
_onEditedMessageListeners.push_back(listener);
107+
}
108+
109+
/**
110+
* @brief Registers listener which receives new incoming inline queries
91111
* @param listener Listener.
92112
*/
93113
inline void onInlineQuery(const InlineQueryListener& listener) {
94114
_onInlineQueryListeners.push_back(listener);
95115
}
96116

97117
/**
98-
* @brief Registers listener which receives all the chosen inline result.
118+
* @brief Registers listener which receives the results of an inline query that was chosen by a user and sent to their chat partner.
119+
* Please see https://core.telegram.org/bots/inline#collecting-feedback for details on how to enable these updates for your bot.
120+
*
99121
* @param listener Listener.
100122
*/
101123
inline void onChosenInlineResult(const ChosenInlineResultListener& listener){
102124
_onChosenInlineResultListeners.push_back(listener);
103125
}
104126

105127
/**
106-
* @brief Registers listener which receives all the callback query.
128+
* @brief Registers listener which receives new incoming callback queries
107129
* @param listener Listener.
108130
*/
109131
inline void onCallbackQuery(const CallbackQueryListener& listener){
110132
_onCallbackQueryListeners.push_back(listener);
111133
}
112134

135+
/**
136+
* @brief Registers listener which receives new incoming shipping queries.
137+
* Only for invoices with flexible price
138+
*
139+
* @param listener Listener.
140+
*/
141+
inline void onShippingQuery(const ShippingQueryListener& listener){
142+
_onShippingQueryListeners.push_back(listener);
143+
}
144+
145+
/**
146+
* @brief Registers listener which receives new incoming pre-checkout queries.
147+
* Contains full information about checkout
148+
*
149+
* @param listener Listener.
150+
*/
151+
inline void onPreCheckoutQuery(const PreCheckoutQueryListener& listener){
152+
_onPreCheckoutQueryListeners.push_back(listener);
153+
}
154+
155+
/**
156+
* @brief Registers listener which receives new poll states.
157+
* Bots receive only updates about stopped polls and polls, which are sent by the bot
158+
*
159+
* @param listener Listener.
160+
*/
161+
inline void onPoll(const PollListener& listener){
162+
_onPollListeners.push_back(listener);
163+
}
164+
165+
/**
166+
* @brief Registers listener which receives an answer if a user changed their answer in a non-anonymous poll.
167+
* Bots receive new votes only in polls that were sent by the bot itself.
168+
*
169+
* @param listener Listener.
170+
*/
171+
inline void onPollAnswer(const PollAnswerListener& listener){
172+
_onPollAnswerListeners.push_back(listener);
173+
}
174+
175+
/**
176+
* @brief Registers listener which receives the bot's chat member status if it was updated in a chat.
177+
* For private chats, this update is received only when the bot is blocked or unblocked by the user.
178+
*
179+
* @param listener Listener.
180+
*/
181+
inline void onMyChatMember(const ChatMemberUpdatedListener& listener){
182+
_onMyChatMemberListeners.push_back(listener);
183+
}
184+
185+
/**
186+
* @brief Registers listener which receives a status if a chat member's status was updated in a chat.
187+
* The bot must be an administrator in the chat and must explicitly specify “chat_member” in the list of allowedUpdates to receive these updates.
188+
*
189+
* @param listener Listener.
190+
*/
191+
inline void onChatMember(const ChatMemberUpdatedListener& listener){
192+
_onChatMemberListeners.push_back(listener);
193+
}
194+
195+
/**
196+
* @brief Registers listener which receives requests to join the chat.
197+
* The bot must have the canInviteUsers administrator right in the chat to receive these updates.
198+
*
199+
* @param listener Listener.
200+
*/
201+
inline void onChatJoinRequest(const ChatJoinRequestListener& listener){
202+
_onChatJoinRequestListeners.push_back(listener);
203+
}
204+
113205
private:
114206
template<typename ListenerType, typename ObjectType>
115207
inline void broadcast(const std::vector<ListenerType>& listeners, const ObjectType object) const {
@@ -142,6 +234,10 @@ friend EventHandler;
142234
broadcast<MessageListener, Message::Ptr>(_onNonCommandMessageListeners, message);
143235
}
144236

237+
inline void broadcastEditedMessage(const Message::Ptr& message) const {
238+
broadcast<MessageListener, Message::Ptr>(_onEditedMessageListeners, message);
239+
}
240+
145241
inline void broadcastInlineQuery(const InlineQuery::Ptr& query) const {
146242
broadcast<InlineQueryListener, InlineQuery::Ptr>(_onInlineQueryListeners, query);
147243
}
@@ -154,13 +250,49 @@ friend EventHandler;
154250
broadcast<CallbackQueryListener, CallbackQuery::Ptr>(_onCallbackQueryListeners, result);
155251
}
156252

253+
inline void broadcastShippingQuery(const ShippingQuery::Ptr& result) const {
254+
broadcast<ShippingQueryListener, ShippingQuery::Ptr>(_onShippingQueryListeners, result);
255+
}
256+
257+
inline void broadcastPreCheckoutQuery(const PreCheckoutQuery::Ptr& result) const {
258+
broadcast<PreCheckoutQueryListener, PreCheckoutQuery::Ptr>(_onPreCheckoutQueryListeners, result);
259+
}
260+
261+
inline void broadcastPoll(const Poll::Ptr& result) const {
262+
broadcast<PollListener, Poll::Ptr>(_onPollListeners, result);
263+
}
264+
265+
inline void broadcastPollAnswer(const PollAnswer::Ptr& result) const {
266+
broadcast<PollAnswerListener, PollAnswer::Ptr>(_onPollAnswerListeners, result);
267+
}
268+
269+
inline void broadcastMyChatMember(const ChatMemberUpdated::Ptr& result) const {
270+
broadcast<ChatMemberUpdatedListener, ChatMemberUpdated::Ptr>(_onMyChatMemberListeners, result);
271+
}
272+
273+
inline void broadcastChatMember(const ChatMemberUpdated::Ptr& result) const {
274+
broadcast<ChatMemberUpdatedListener, ChatMemberUpdated::Ptr>(_onChatMemberListeners, result);
275+
}
276+
277+
inline void broadcastChatJoinRequest(const ChatJoinRequest::Ptr& result) const {
278+
broadcast<ChatJoinRequestListener, ChatJoinRequest::Ptr>(_onChatJoinRequestListeners, result);
279+
}
280+
157281
std::vector<MessageListener> _onAnyMessageListeners;
158282
std::unordered_map<std::string, MessageListener> _onCommandListeners;
159283
std::vector<MessageListener> _onUnknownCommandListeners;
160284
std::vector<MessageListener> _onNonCommandMessageListeners;
285+
std::vector<MessageListener> _onEditedMessageListeners;
161286
std::vector<InlineQueryListener> _onInlineQueryListeners;
162287
std::vector<ChosenInlineResultListener> _onChosenInlineResultListeners;
163288
std::vector<CallbackQueryListener> _onCallbackQueryListeners;
289+
std::vector<ShippingQueryListener> _onShippingQueryListeners;
290+
std::vector<PreCheckoutQueryListener> _onPreCheckoutQueryListeners;
291+
std::vector<PollListener> _onPollListeners;
292+
std::vector<PollAnswerListener> _onPollAnswerListeners;
293+
std::vector<ChatMemberUpdatedListener> _onMyChatMemberListeners;
294+
std::vector<ChatMemberUpdatedListener> _onChatMemberListeners;
295+
std::vector<ChatJoinRequestListener> _onChatJoinRequestListeners;
164296
};
165297

166298
}

include/tgbot/EventHandler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
#include "tgbot/types/Update.h"
66
#include "tgbot/tools/StringTools.h"
77

8+
#include <algorithm>
9+
#include <cstddef>
10+
#include <string>
11+
812
namespace TgBot {
913

1014
class TGBOT_API EventHandler {

src/EventHandler.cpp

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
#include "tgbot/EventHandler.h"
22

3-
#include <algorithm>
4-
#include <cstddef>
5-
#include <string>
6-
7-
using namespace std;
8-
93
namespace TgBot {
104

115
void EventHandler::handleUpdate(const Update::Ptr& update) const {
6+
if (update->message != nullptr) {
7+
handleMessage(update->message);
8+
}
9+
if (update->editedMessage != nullptr) {
10+
_broadcaster.broadcastEditedMessage(update->editedMessage);
11+
}
12+
if (update->channelPost != nullptr) {
13+
handleMessage(update->channelPost);
14+
}
15+
if (update->editedChannelPost != nullptr) {
16+
_broadcaster.broadcastEditedMessage(update->editedChannelPost);
17+
}
1218
if (update->inlineQuery != nullptr) {
1319
_broadcaster.broadcastInlineQuery(update->inlineQuery);
1420
}
@@ -18,11 +24,26 @@ void EventHandler::handleUpdate(const Update::Ptr& update) const {
1824
if (update->callbackQuery != nullptr) {
1925
_broadcaster.broadcastCallbackQuery(update->callbackQuery);
2026
}
21-
if (update->message != nullptr) {
22-
handleMessage(update->message);
27+
if (update->shippingQuery != nullptr) {
28+
_broadcaster.broadcastShippingQuery(update->shippingQuery);
2329
}
24-
if (update->channelPost != nullptr) {
25-
handleMessage(update->channelPost);
30+
if (update->preCheckoutQuery != nullptr) {
31+
_broadcaster.broadcastPreCheckoutQuery(update->preCheckoutQuery);
32+
}
33+
if (update->poll != nullptr) {
34+
_broadcaster.broadcastPoll(update->poll);
35+
}
36+
if (update->pollAnswer != nullptr) {
37+
_broadcaster.broadcastPollAnswer(update->pollAnswer);
38+
}
39+
if (update->myChatMember != nullptr) {
40+
_broadcaster.broadcastMyChatMember(update->myChatMember);
41+
}
42+
if (update->chatMember != nullptr) {
43+
_broadcaster.broadcastChatMember(update->chatMember);
44+
}
45+
if (update->chatJoinRequest != nullptr) {
46+
_broadcaster.broadcastChatJoinRequest(update->chatJoinRequest);
2647
}
2748
}
2849

@@ -33,13 +54,13 @@ void EventHandler::handleMessage(const Message::Ptr& message) const {
3354
std::size_t splitPosition;
3455
std::size_t spacePosition = message->text.find(' ');
3556
std::size_t atSymbolPosition = message->text.find('@');
36-
if (spacePosition == string::npos) {
37-
if (atSymbolPosition == string::npos) {
57+
if (spacePosition == std::string::npos) {
58+
if (atSymbolPosition == std::string::npos) {
3859
splitPosition = message->text.size();
3960
} else {
4061
splitPosition = atSymbolPosition;
4162
}
42-
} else if (atSymbolPosition == string::npos) {
63+
} else if (atSymbolPosition == std::string::npos) {
4364
splitPosition = spacePosition;
4465
} else {
4566
splitPosition = std::min(spacePosition, atSymbolPosition);

0 commit comments

Comments
 (0)