summaryrefslogtreecommitdiff
path: root/src/tools/Api.cpp
diff options
context:
space:
mode:
authorOleg Morozenkov <omorozenkov@gmail.com>2015-08-11 22:13:23 +0300
committerOleg Morozenkov <omorozenkov@gmail.com>2015-08-11 22:13:23 +0300
commit376b88ec09ef8cf71dd823467406c58204485fcc (patch)
tree9ca599b854d18006c65b26003ce7dbdd416fdf18 /src/tools/Api.cpp
parentd7fbf7149d0e0c1c30972dab68d510ef6ac377dd (diff)
Fixed compiler's errors in TgTypeParser + fixed indentation + some other fixes
Diffstat (limited to 'src/tools/Api.cpp')
-rw-r--r--src/tools/Api.cpp279
1 files changed, 279 insertions, 0 deletions
diff --git a/src/tools/Api.cpp b/src/tools/Api.cpp
new file mode 100644
index 0000000..0bd970c
--- /dev/null
+++ b/src/tools/Api.cpp
@@ -0,0 +1,279 @@
+/*
+ * Copyright (c) 2015 Oleg Morozenkov
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "tgbot/Api.h"
+
+#include "tgbot/TgTypeParser.h"
+#include "tgbot/TgException.h"
+#include "tgbot/net/HttpClient.h"
+
+using namespace std;
+using namespace boost::property_tree;
+
+namespace TgBot {
+
+Api::Api(const std::string& token) : _token(token) {
+}
+
+User::Ptr Api::getMe() const {
+ return TgTypeParser::getInstance().parseUser(sendRequest("getMe").find("result")->second);
+}
+
+Message::Ptr Api::sendMessage(int32_t chatId, const string& text, bool disableWebPagePreview, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("text", text));
+ if (disableWebPagePreview) {
+ args.push_back(HttpReqArg("disable_web_page_preview", disableWebPagePreview));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendMessage", args).find("result")->second);
+}
+
+Message::Ptr Api::forwardMessage(int32_t chatId, int32_t fromChatId, int32_t messageId) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("from_chat_id", fromChatId));
+ args.push_back(HttpReqArg("message_id", messageId));
+ return TgTypeParser::getInstance().parseMessage(sendRequest("forwardMessage", args).find("result")->second);
+}
+
+Message::Ptr Api::sendPhoto(int32_t chatId, const InputFile::Ptr& photo, const string& caption, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("photo", photo->data, true, photo->mimeType));
+ if (!caption.empty()) {
+ args.push_back(HttpReqArg("caption", caption));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendPhoto", args).find("result")->second);
+}
+
+Message::Ptr Api::sendPhoto(int32_t chatId, const string& photo, const string& caption, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("photo", photo));
+ if (!caption.empty()) {
+ args.push_back(HttpReqArg("caption", caption));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendPhoto", args).find("result")->second);
+}
+
+Message::Ptr Api::sendAudio(int32_t chatId, const InputFile::Ptr& audio, int32_t duration, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("audio", audio->data, true, audio->mimeType));
+ if (duration) {
+ args.push_back(HttpReqArg("duration", duration));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendAudio", args).find("result")->second);
+}
+
+Message::Ptr Api::sendAudio(int32_t chatId, const string& audio, int32_t duration, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("audio", audio));
+ if (duration) {
+ args.push_back(HttpReqArg("duration", duration));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendAudio", args).find("result")->second);
+}
+
+Message::Ptr Api::sendDocument(int32_t chatId, const InputFile::Ptr& document, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("document", document->data, true, document->mimeType));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendDocument", args).find("result")->second);
+}
+
+Message::Ptr Api::sendDocument(int32_t chatId, const string& document, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("document", document));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendDocument", args).find("result")->second);
+}
+
+Message::Ptr Api::sendSticker(int32_t chatId, const InputFile::Ptr& sticker, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("sticker", sticker->data, true, sticker->mimeType));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendSticker", args).find("result")->second);
+}
+
+Message::Ptr Api::sendSticker(int32_t chatId, const string& sticker, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("sticker", sticker));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendSticker", args).find("result")->second);
+}
+
+Message::Ptr Api::sendVideo(int32_t chatId, const InputFile::Ptr& video, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("video", video->data, true, video->mimeType));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendVideo", args).find("result")->second);
+}
+
+Message::Ptr Api::sendVideo(int32_t chatId, const string& video, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("video", video));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendVideo", args).find("result")->second);
+}
+
+Message::Ptr Api::sendLocation(int32_t chatId, float latitude, float longitude, int32_t replyToMessageId, const GenericReply::Ptr& replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("latitude", latitude));
+ args.push_back(HttpReqArg("longitude", longitude));
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseMessage(sendRequest("sendLocation", args).find("result")->second);
+}
+
+void Api::sendChatAction(int32_t chatId, const string& action) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("action", action));
+ sendRequest("sendChatAction", args);
+}
+
+UserProfilePhotos::Ptr Api::getUserProfilePhotos(int32_t userId, int32_t offset, int32_t limit) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("user_id", userId));
+ if (offset) {
+ args.push_back(HttpReqArg("offset", offset));
+ }
+ limit = max(1, min(100, limit));
+ args.push_back(HttpReqArg("limit", limit));
+ return TgTypeParser::getInstance().parseUserProfilePhotos(sendRequest("getUserProfilePhotos", args).find("result")->second);
+}
+
+vector<Update::Ptr> Api::getUpdates(int32_t offset, int32_t limit, int32_t timeout) const {
+ vector<HttpReqArg> args;
+ if (offset) {
+ args.push_back(HttpReqArg("offset", offset));
+ }
+ limit = max(1, min(100, limit));
+ args.push_back(HttpReqArg("limit", limit));
+ if (timeout) {
+ args.push_back(HttpReqArg("timeout", timeout));
+ }
+ return TgTypeParser::getInstance().parseArray<Update>(TgTypeParser::getInstance().parseUpdate, sendRequest("getUpdates", args), "result");
+}
+
+void Api::setWebhook(const string& url) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("url", url));
+ sendRequest("setWebhook", args);
+}
+
+boost::property_tree::ptree Api::sendRequest(const std::string& method, const std::vector<HttpReqArg>& args) const {
+ std::string url = "https://api.telegram.org/bot";
+ url += _token;
+ url += "/";
+ url += method;
+ string serverResponse = HttpClient::getInstance().makeRequest(url, args);
+ if (serverResponse.find("<html>") != serverResponse.npos) {
+ throw TgException("Bad request");
+ }
+ ptree result = TgTypeParser::getInstance().parseJson(serverResponse);
+ try {
+ if (result.get<bool>("ok")) {
+ return result;
+ } else {
+ throw TgException(result.get("description", ""));
+ }
+ } catch (boost::property_tree::ptree_error& e) {
+ throw TgException("");
+ }
+}
+
+}