tgbot-cpp
Loading...
Searching...
No Matches
EventBroadcaster.h
Go to the documentation of this file.
1#ifndef TGBOT_EVENTBROADCASTER_H
2#define TGBOT_EVENTBROADCASTER_H
3
4#include "tgbot/export.h"
11#include "tgbot/types/Poll.h"
18
19#include <functional>
20#include <initializer_list>
21#include <string>
22#include <unordered_map>
23#include <vector>
24
25namespace TgBot {
26
27class EventHandler;
28
34class TGBOT_API EventBroadcaster {
35
36friend EventHandler;
37
38public:
39 typedef std::function<void (const Message::Ptr)> MessageListener;
40 typedef std::function<void (const InlineQuery::Ptr)> InlineQueryListener;
41 typedef std::function<void (const ChosenInlineResult::Ptr)> ChosenInlineResultListener;
42 typedef std::function<void (const CallbackQuery::Ptr)> CallbackQueryListener;
43 typedef std::function<void (const ShippingQuery::Ptr)> ShippingQueryListener;
44 typedef std::function<void (const PreCheckoutQuery::Ptr)> PreCheckoutQueryListener;
45 typedef std::function<void (const Poll::Ptr)> PollListener;
46 typedef std::function<void (const PollAnswer::Ptr)> PollAnswerListener;
47 typedef std::function<void (const ChatMemberUpdated::Ptr)> ChatMemberUpdatedListener;
48 typedef std::function<void (const ChatJoinRequest::Ptr)> ChatJoinRequestListener;
51 typedef std::function<void (const Message::Ptr, const SuccessfulPayment::Ptr)> SuccessfulPaymentListener;
52
57 inline void onAnyMessage(const MessageListener& listener) {
58 _onAnyMessageListeners.push_back(listener);
59 }
60
66 inline void onCommand(const std::string& commandName, const MessageListener& listener) {
67 if (listener) {
68 _onCommandListeners[commandName] = listener;
69 } else {
70 _onCommandListeners.erase(commandName);
71 }
72 }
73
79 inline void onCommand(const std::initializer_list<std::string>& commandsList, const MessageListener& listener) {
80 if (listener) {
81 for (const auto& command : commandsList) {
82 _onCommandListeners[command] = listener;
83 }
84 } else {
85 for (const auto& command : commandsList) {
86 _onCommandListeners.erase(command);
87 }
88 }
89 }
90
95 inline void onUnknownCommand(const MessageListener& listener) {
96 _onUnknownCommandListeners.push_back(listener);
97 }
98
103 inline void onNonCommandMessage(const MessageListener& listener) {
104 _onNonCommandMessageListeners.push_back(listener);
105 }
106
111 inline void onEditedMessage(const MessageListener& listener) {
112 _onEditedMessageListeners.push_back(listener);
113 }
114
119 inline void onInlineQuery(const InlineQueryListener& listener) {
120 _onInlineQueryListeners.push_back(listener);
121 }
122
130 _onChosenInlineResultListeners.push_back(listener);
131 }
132
137 inline void onCallbackQuery(const CallbackQueryListener& listener){
138 _onCallbackQueryListeners.push_back(listener);
139 }
140
147 inline void onShippingQuery(const ShippingQueryListener& listener){
148 _onShippingQueryListeners.push_back(listener);
149 }
150
157 inline void onPreCheckoutQuery(const PreCheckoutQueryListener& listener){
158 _onPreCheckoutQueryListeners.push_back(listener);
159 }
160
167 inline void onPoll(const PollListener& listener){
168 _onPollListeners.push_back(listener);
169 }
170
177 inline void onPollAnswer(const PollAnswerListener& listener){
178 _onPollAnswerListeners.push_back(listener);
179 }
180
187 inline void onMyChatMember(const ChatMemberUpdatedListener& listener){
188 _onMyChatMemberListeners.push_back(listener);
189 }
190
197 inline void onChatMember(const ChatMemberUpdatedListener& listener){
198 _onChatMemberListeners.push_back(listener);
199 }
200
207 inline void onChatJoinRequest(const ChatJoinRequestListener& listener){
208 _onChatJoinRequestListeners.push_back(listener);
209 }
210
216 _onMessageReactionUpdatedListener.push_back(listener);
217 }
218
224 _onMessageReactionCountUpdatedListener.push_back(listener);
225 }
226
233 inline void onSuccessfulPayment(const SuccessfulPaymentListener& listener) {
234 _onSuccessfulPaymentListeners.push_back(listener);
235 }
236
237
238
239
240private:
241 template<typename ListenerType, typename ObjectType>
242 inline void broadcast(const std::vector<ListenerType>& listeners, const ObjectType object) const {
243 if (!object)
244 return;
245
246 for (const ListenerType& item : listeners) {
247 item(object);
248 }
249 }
250
251 inline void broadcastAnyMessage(const Message::Ptr& message) const {
252 broadcast<MessageListener, Message::Ptr>(_onAnyMessageListeners, message);
253 }
254
255 inline bool broadcastCommand(const std::string& command, const Message::Ptr& message) const {
256 auto iter = _onCommandListeners.find(command);
257 if (iter == _onCommandListeners.end()) {
258 return false;
259 }
260 iter->second(message);
261 return true;
262 }
263
264 inline void broadcastUnknownCommand(const Message::Ptr& message) const {
265 broadcast<MessageListener, Message::Ptr>(_onUnknownCommandListeners, message);
266 }
267
268 inline void broadcastNonCommandMessage(const Message::Ptr& message) const {
269 broadcast<MessageListener, Message::Ptr>(_onNonCommandMessageListeners, message);
270 }
271
272 inline void broadcastEditedMessage(const Message::Ptr& message) const {
273 broadcast<MessageListener, Message::Ptr>(_onEditedMessageListeners, message);
274 }
275
276 inline void broadcastInlineQuery(const InlineQuery::Ptr& query) const {
277 broadcast<InlineQueryListener, InlineQuery::Ptr>(_onInlineQueryListeners, query);
278 }
279
280 inline void broadcastChosenInlineResult(const ChosenInlineResult::Ptr& result) const {
281 broadcast<ChosenInlineResultListener, ChosenInlineResult::Ptr>(_onChosenInlineResultListeners, result);
282 }
283
284 inline void broadcastCallbackQuery(const CallbackQuery::Ptr& result) const {
285 broadcast<CallbackQueryListener, CallbackQuery::Ptr>(_onCallbackQueryListeners, result);
286 }
287
288 inline void broadcastShippingQuery(const ShippingQuery::Ptr& result) const {
289 broadcast<ShippingQueryListener, ShippingQuery::Ptr>(_onShippingQueryListeners, result);
290 }
291
292 inline void broadcastPreCheckoutQuery(const PreCheckoutQuery::Ptr& result) const {
293 broadcast<PreCheckoutQueryListener, PreCheckoutQuery::Ptr>(_onPreCheckoutQueryListeners, result);
294 }
295
296 inline void broadcastPoll(const Poll::Ptr& result) const {
297 broadcast<PollListener, Poll::Ptr>(_onPollListeners, result);
298 }
299
300 inline void broadcastPollAnswer(const PollAnswer::Ptr& result) const {
301 broadcast<PollAnswerListener, PollAnswer::Ptr>(_onPollAnswerListeners, result);
302 }
303
304 inline void broadcastMyChatMember(const ChatMemberUpdated::Ptr& result) const {
305 broadcast<ChatMemberUpdatedListener, ChatMemberUpdated::Ptr>(_onMyChatMemberListeners, result);
306 }
307
308 inline void broadcastChatMember(const ChatMemberUpdated::Ptr& result) const {
309 broadcast<ChatMemberUpdatedListener, ChatMemberUpdated::Ptr>(_onChatMemberListeners, result);
310 }
311
312 inline void broadcastChatJoinRequest(const ChatJoinRequest::Ptr& result) const {
313 broadcast<ChatJoinRequestListener, ChatJoinRequest::Ptr>(_onChatJoinRequestListeners, result);
314 }
315
316 inline void broadcastMessageReactionUpdated(const MessageReactionUpdated::Ptr& messageReaction) const {
317 broadcast<MessageReactionUpdatedListener, MessageReactionUpdated::Ptr>(_onMessageReactionUpdatedListener, messageReaction);
318 }
319
320 inline void broadcastMessageReactionCountUpdated(const MessageReactionCountUpdated::Ptr& messageReactionCount) const {
321 broadcast<MessageReactionCountUpdatedListener, MessageReactionCountUpdated::Ptr>(_onMessageReactionCountUpdatedListener, messageReactionCount);
322 }
323
324 inline void broadcastSuccessfulPayment(const Message::Ptr& message) const {
325 if (!message || !message->successfulPayment) {
326 return;
327 }
328 for (const auto& listener : _onSuccessfulPaymentListeners) {
329 listener(message, message->successfulPayment);
330 }
331 }
332
333
334 std::vector<MessageListener> _onAnyMessageListeners;
335 std::unordered_map<std::string, MessageListener> _onCommandListeners;
336 std::vector<MessageListener> _onUnknownCommandListeners;
337 std::vector<MessageListener> _onNonCommandMessageListeners;
338 std::vector<MessageListener> _onEditedMessageListeners;
339 std::vector<InlineQueryListener> _onInlineQueryListeners;
340 std::vector<ChosenInlineResultListener> _onChosenInlineResultListeners;
341 std::vector<CallbackQueryListener> _onCallbackQueryListeners;
342 std::vector<ShippingQueryListener> _onShippingQueryListeners;
343 std::vector<PreCheckoutQueryListener> _onPreCheckoutQueryListeners;
344 std::vector<PollListener> _onPollListeners;
345 std::vector<PollAnswerListener> _onPollAnswerListeners;
346 std::vector<ChatMemberUpdatedListener> _onMyChatMemberListeners;
347 std::vector<ChatMemberUpdatedListener> _onChatMemberListeners;
348 std::vector<ChatJoinRequestListener> _onChatJoinRequestListeners;
349 std::vector<MessageReactionUpdatedListener> _onMessageReactionUpdatedListener;
350 std::vector<MessageReactionCountUpdatedListener> _onMessageReactionCountUpdatedListener;
351 std::vector<SuccessfulPaymentListener> _onSuccessfulPaymentListeners;
352
353};
354
355}
356
357#endif //TGBOT_EVENTBROADCASTER_H
std::shared_ptr< CallbackQuery > Ptr
std::shared_ptr< ChatJoinRequest > Ptr
std::shared_ptr< ChatMemberUpdated > Ptr
std::shared_ptr< ChosenInlineResult > Ptr
This class holds all event listeners.
void onChatMember(const ChatMemberUpdatedListener &listener)
Registers listener which receives a status if a chat member's status was updated in a chat....
void onCommand(const std::string &commandName, const MessageListener &listener)
Registers listener which receives all messages with commands (messages with leading '/' char).
void onShippingQuery(const ShippingQueryListener &listener)
Registers listener which receives new incoming shipping queries. Only for invoices with flexible pric...
void onAnyMessage(const MessageListener &listener)
Registers listener which receives new incoming message of any kind - text, photo, sticker,...
std::function< void(const PreCheckoutQuery::Ptr)> PreCheckoutQueryListener
void onNonCommandMessage(const MessageListener &listener)
Registers listener which receives all messages without commands (messages with no leading '/' char).
std::function< void(const ChatMemberUpdated::Ptr)> ChatMemberUpdatedListener
std::function< void(const InlineQuery::Ptr)> InlineQueryListener
void onPoll(const PollListener &listener)
Registers listener which receives new poll states. Bots receive only updates about stopped polls and ...
std::function< void(const Message::Ptr, const SuccessfulPayment::Ptr)> SuccessfulPaymentListener
std::function< void(const ChatJoinRequest::Ptr)> ChatJoinRequestListener
std::function< void(const Poll::Ptr)> PollListener
void onCallbackQuery(const CallbackQueryListener &listener)
Registers listener which receives new incoming callback queries.
std::function< void(const ShippingQuery::Ptr)> ShippingQueryListener
std::function< void(const CallbackQuery::Ptr)> CallbackQueryListener
void onPollAnswer(const PollAnswerListener &listener)
Registers listener which receives an answer if a user changed their answer in a non-anonymous poll....
std::function< void(const ChosenInlineResult::Ptr)> ChosenInlineResultListener
void onUnknownCommand(const MessageListener &listener)
Registers listener which receives all messages with commands (messages with leading '/' char) which h...
void onMessageReaction(const MessageReactionUpdatedListener &listener)
Registers listener which receives new incoming message reaction update event.
void onChosenInlineResult(const ChosenInlineResultListener &listener)
Registers listener which receives the results of an inline query that was chosen by a user and sent t...
void onEditedMessage(const MessageListener &listener)
Registers listener which receives new versions of a message that is known to the bot and was edited.
void onMessageReactionCount(const MessageReactionCountUpdatedListener &listener)
Registers listener which receives new incoming message reaction count update event.
std::function< void(const MessageReactionUpdated::Ptr)> MessageReactionUpdatedListener
std::function< void(const Message::Ptr)> MessageListener
void onChatJoinRequest(const ChatJoinRequestListener &listener)
Registers listener which receives requests to join the chat. The bot must have the canInviteUsers adm...
void onInlineQuery(const InlineQueryListener &listener)
Registers listener which receives new incoming inline queries.
void onMyChatMember(const ChatMemberUpdatedListener &listener)
Registers listener which receives the bot's chat member status if it was updated in a chat....
std::function< void(const PollAnswer::Ptr)> PollAnswerListener
void onPreCheckoutQuery(const PreCheckoutQueryListener &listener)
Registers listener which receives new incoming pre-checkout queries. Contains full information about ...
std::function< void(const MessageReactionCountUpdated::Ptr)> MessageReactionCountUpdatedListener
void onCommand(const std::initializer_list< std::string > &commandsList, const MessageListener &listener)
Registers listener which receives all messages with commands (messages with leading '/' char).
void onSuccessfulPayment(const SuccessfulPaymentListener &listener)
Registers listener which receives information about successful payments. This listener is triggered w...
std::shared_ptr< InlineQuery > Ptr
Definition InlineQuery.h:20
std::shared_ptr< Message > Ptr
Definition Message.h:68
std::shared_ptr< MessageReactionCountUpdated > Ptr
std::shared_ptr< MessageReactionUpdated > Ptr
std::shared_ptr< PollAnswer > Ptr
Definition PollAnswer.h:22
std::shared_ptr< Poll > Ptr
Definition Poll.h:22
std::shared_ptr< PreCheckoutQuery > Ptr
std::shared_ptr< ShippingQuery > Ptr
std::shared_ptr< SuccessfulPayment > Ptr
Definition Api.h:40