tgbot-cpp
EventHandler.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Oleg Morozenkov
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22 
23 #ifndef TGBOT_EVENTHANDLER_H
24 #define TGBOT_EVENTHANDLER_H
25 
26 #include "tgbot/EventBroadcaster.h"
27 #include "tgbot/types/Update.h"
29 
30 namespace TgBot {
31 
32 class EventHandler {
33 
34  void handleMessage(const Message::Ptr& message) const {
35  _broadcaster->broadcastAnyMessage(message);
36 
37  if (StringTools::startsWith(message->text, "/")) {
38  unsigned long splitPosition;
39  unsigned long spacePosition = message->text.find(' ');
40  unsigned long atSymbolPosition = message->text.find('@');
41  if (spacePosition == message->text.npos) {
42  if (atSymbolPosition == message->text.npos) {
43  splitPosition = message->text.size();
44  } else {
45  splitPosition = atSymbolPosition;
46  }
47  } else if (atSymbolPosition == message->text.npos) {
48  splitPosition = spacePosition;
49  } else {
50  splitPosition = std::min(spacePosition, atSymbolPosition);
51  }
52  std::string command = message->text.substr(1, splitPosition - 1);
53  if (!_broadcaster->broadcastCommand(command, message)) {
54  _broadcaster->broadcastUnknownCommand(message);
55  }
56  } else {
57  _broadcaster->broadcastNonCommandMessage(message);
58  }
59  };
60 
61 public:
62  explicit EventHandler(const EventBroadcaster* broadcaster) : _broadcaster(broadcaster) {
63  }
64 
65  inline void handleUpdate(const Update::Ptr& update) const {
66  if (update->inlineQuery != NULL)
67  _broadcaster->broadcastInlineQuery(update->inlineQuery);
68  if (update->chosenInlineResult != NULL)
69  _broadcaster->broadcastChosenInlineResult(update->chosenInlineResult);
70  if (update->callbackQuery != NULL)
71  _broadcaster->broadcastCallbackQuery(update->callbackQuery);
72  if (update->message != NULL)
73  handleMessage(update->message);
74  }
75 
76 private:
77  const EventBroadcaster* _broadcaster;
78 };
79 
80 }
81 
82 #endif //TGBOT_EVENTHANDLER_H
std::shared_ptr< Update > Ptr
Definition: Update.h:42
Definition: Api.h:44
std::shared_ptr< Message > Ptr
Definition: Message.h:52
bool startsWith(const std::string &str1, const std::string &str2)
EventHandler(const EventBroadcaster *broadcaster)
Definition: EventHandler.h:62
void handleUpdate(const Update::Ptr &update) const
Definition: EventHandler.h:65