diff options
author | Oleg Morozenkov <m@oleg.rocks> | 2022-08-30 23:27:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-30 23:27:10 +0300 |
commit | 4a3f1967ae255b4b9012598a6198fe4c9f17beee (patch) | |
tree | 7c25c7968fae4442ea6030fbf5796166ef4a2d49 /src | |
parent | 8651e22a472a1b740aee5fd6c8b243425c9498c8 (diff) | |
parent | 5d84d4cb291e5a93d512ddf51f24fa6964e6e4cd (diff) |
Merge pull request #221 from llnulldisk/master
Update to Bot API 4.9
Diffstat (limited to 'src')
-rw-r--r-- | src/Api.cpp | 1188 | ||||
-rw-r--r-- | src/TgTypeParser.cpp | 316 |
2 files changed, 766 insertions, 738 deletions
diff --git a/src/Api.cpp b/src/Api.cpp index 22115c2..9cb7f6e 100644 --- a/src/Api.cpp +++ b/src/Api.cpp @@ -19,42 +19,86 @@ Api::Api(string token, const HttpClient& httpClient, const std::string& url) : _token(std::move(token)), _httpClient(httpClient), _tgTypeParser(), _url(url) { } -User::Ptr Api::getMe() const { - return _tgTypeParser.parseJsonAndGetUser(sendRequest("getMe")); +vector<Update::Ptr> Api::getUpdates(std::int32_t offset, std::int32_t limit, std::int32_t timeout, const StringArrayPtr& allowedUpdates) const { + vector<HttpReqArg> args; + args.reserve(4); + if (offset) { + args.emplace_back("offset", offset); + } + limit = max(1, min(100, limit)); + args.emplace_back("limit", limit); + if (timeout) { + args.emplace_back("timeout", timeout); + } + if (allowedUpdates != nullptr) { + string allowedUpdatesJson = _tgTypeParser.parseArray<string>( + [] (const string& s)->string { + return s; + }, *allowedUpdates); + args.emplace_back("allowed_updates", allowedUpdatesJson); + } + return _tgTypeParser.parseJsonAndGetArray<Update>(&TgTypeParser::parseJsonAndGetUpdate, sendRequest("getUpdates", args)); } -Message::Ptr Api::sendMessage(std::int64_t chatId, const string& text, bool disableWebPagePreview, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +void Api::setWebhook(const string& url, const InputFile::Ptr certificate, std::int32_t maxConnection, const StringArrayPtr& allowedUpdates) const { vector<HttpReqArg> args; - args.reserve(7); - args.emplace_back("chat_id", chatId); - args.emplace_back("text", text); - if (disableWebPagePreview) { - args.emplace_back("disable_web_page_preview", disableWebPagePreview); + args.reserve(4); + if (!url.empty()) { + args.emplace_back("url", url); } - if (disableNotification){ - args.emplace_back("disable_notification", disableNotification); + if (certificate != nullptr) { + args.emplace_back("certificate", certificate->data, true, certificate->mimeType, certificate->fileName); } - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); + if (maxConnection != 40) { + args.emplace_back("max_connections", maxConnection); } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + if (allowedUpdates != nullptr) { + auto allowedUpdatesJson = _tgTypeParser.parseArray<string>( + [] (const string& s)->string { + return s; + }, *allowedUpdates); + args.emplace_back("allowed_updates", allowedUpdatesJson); } - if (!parseMode.empty()) { - args.emplace_back("parse_mode", parseMode); + + sendRequest("setWebhook", args); +} + +bool Api::deleteWebhook() const { + return sendRequest("deleteWebhook").get<bool>("", false); +} + +WebhookInfo::Ptr Api::getWebhookInfo() const { + ptree p = sendRequest("getWebhookInfo"); + + if (!p.get_child_optional("url")) { + return nullptr; } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendMessage", args)); + if (p.get<string>("url", "") != string("")) { + return _tgTypeParser.parseJsonAndGetWebhookInfo(p); + } else { + return nullptr; + } +} + +User::Ptr Api::getMe() const { + return _tgTypeParser.parseJsonAndGetUser(sendRequest("getMe")); } -Message::Ptr Api::sendMessage(const std::string &chatId, const string& text, bool disableWebPagePreview, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendMessage(boost::variant<std::int64_t, const std::string&> chatId, const std::string& text, bool disableWebPagePreview, + std::int32_t replyToMessageId, GenericReply::Ptr replyMarkup, const std::string& parseMode, + bool disableNotification) const { vector<HttpReqArg> args; args.reserve(7); + args.emplace_back("chat_id", chatId); args.emplace_back("text", text); + if (!parseMode.empty()) { + args.emplace_back("parse_mode", parseMode); + } if (disableWebPagePreview) { args.emplace_back("disable_web_page_preview", disableWebPagePreview); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } if (replyToMessageId) { @@ -63,9 +107,7 @@ Message::Ptr Api::sendMessage(const std::string &chatId, const string& text, boo if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - if (!parseMode.empty()) { - args.emplace_back("parse_mode", parseMode); - } + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendMessage", args)); } @@ -75,7 +117,7 @@ Message::Ptr Api::forwardMessage(std::int64_t chatId, std::int64_t fromChatId, s args.emplace_back("chat_id", chatId); args.emplace_back("from_chat_id", fromChatId); args.emplace_back("message_id", messageId); - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("forwardMessage", args)); @@ -103,13 +145,13 @@ Message::Ptr Api::sendPhoto(std::int64_t chatId, boost::variant<InputFile::Ptr, if (!parseMode.empty()) { args.emplace_back("parse_mode", parseMode); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendPhoto", args)); } -Message::Ptr Api::sendAudio(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> audio, const string &caption, std::int32_t duration, const string& performer, const string& title, boost::variant<InputFile::Ptr, std::string> thumb, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendAudio(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> audio, const string& caption, std::int32_t duration, const string& performer, const string& title, boost::variant<InputFile::Ptr, std::string> thumb, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(11); args.emplace_back("chat_id", chatId); @@ -125,10 +167,10 @@ Message::Ptr Api::sendAudio(std::int64_t chatId, boost::variant<InputFile::Ptr, if (duration) { args.emplace_back("duration", duration); } - if (!performer.empty()){ + if (!performer.empty()) { args.emplace_back("performer", performer); } - if (!title.empty()){ + if (!title.empty()) { args.emplace_back("title", title); } if (thumb.which() == 0 /* InputFile::Ptr */) { @@ -149,13 +191,13 @@ Message::Ptr Api::sendAudio(std::int64_t chatId, boost::variant<InputFile::Ptr, if (!parseMode.empty()) { args.emplace_back("parse_mode", parseMode); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendAudio", args)); } -Message::Ptr Api::sendDocument(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> document, boost::variant<InputFile::Ptr, std::string> thumb, const string &caption, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendDocument(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> document, boost::variant<InputFile::Ptr, std::string> thumb, const string& caption, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(8); args.emplace_back("chat_id", chatId); @@ -186,228 +228,13 @@ Message::Ptr Api::sendDocument(std::int64_t chatId, boost::variant<InputFile::Pt if (!parseMode.empty()) { args.emplace_back("parse_mode", parseMode); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendDocument", args)); } -Message::Ptr Api::sendInvoice(std::int64_t chatId, const std::string& title, const std::string& description, const std::string& payload, - const std::string& providerToken, const std::string& startParameter, const std::string& currency, const std::vector<LabeledPrice::Ptr>& prices, - const std::string& providerData, const std::string& photoUrl, std::int32_t photoSize, - std::int32_t photoWidth, std::int32_t photoHeight, bool needName, - bool needPhoneNumber, bool needEmail, bool needShippingAddress, - bool sendPhoneNumberToProvider, bool sendEmailToProvider, bool isFlexible, - std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(23); - args.emplace_back("chat_id", chatId); - args.emplace_back("title", title); - args.emplace_back("description", description); - args.emplace_back("payload", payload); - args.emplace_back("provider_token", providerToken); - args.emplace_back("start_parameter", startParameter); - args.emplace_back("currency", currency); - args.emplace_back("prices", _tgTypeParser.parseArray<LabeledPrice>(&TgTypeParser::parseLabeledPrice, prices)); - if (!providerData.empty()) { - args.emplace_back("provider_data", providerData); - } - if (!photoUrl.empty()) { - args.emplace_back("photo_url", photoUrl); - } - if (photoSize) { - args.emplace_back("photo_size", photoSize); - } - if (photoWidth) { - args.emplace_back("photo_width", photoWidth); - } - if (photoHeight) { - args.emplace_back("photo_height", photoHeight); - } - if (needName) { - args.emplace_back("need_name", needName); - } - if (needPhoneNumber) { - args.emplace_back("need_phone_number", needPhoneNumber); - } - if (needEmail) { - args.emplace_back("need_email", needEmail); - } - if (needShippingAddress) { - args.emplace_back("need_shipping_address", needShippingAddress); - } - if (sendPhoneNumberToProvider) { - args.emplace_back("send_phone_number_to_provider", sendPhoneNumberToProvider); - } - if (sendEmailToProvider) { - args.emplace_back("send_email_to_provider", sendEmailToProvider); - } - if (isFlexible) { - args.emplace_back("is_flexible", isFlexible); - } - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - if (disableNotification){ - args.emplace_back("disable_notification", disableNotification); - } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendInvoice", args)); -} - -bool Api::answerShippingQuery(const std::string& shippingQueryId, bool ok, const std::vector<ShippingOption::Ptr>& shippingOptions, const std::string& errorMessage) const { - vector<HttpReqArg> args; - args.reserve(4); - args.emplace_back("shipping_query_id", shippingQueryId); - args.emplace_back("ok", ok); - if (!shippingOptions.empty()) { - args.emplace_back("shipping_options", _tgTypeParser.parseArray<ShippingOption>(&TgTypeParser::parseShippingOption, shippingOptions)); - } - if (!errorMessage.empty()) { - args.emplace_back("error_message", errorMessage); - } - return sendRequest("answerShippingQuery", args).get<bool>("", false); -} - -bool Api::answerPreCheckoutQuery(const std::string& preCheckoutQueryId, bool ok, const std::string& errorMessage) const { - vector<HttpReqArg> args; - args.reserve(3); - args.emplace_back("pre_checkout_query_id", preCheckoutQueryId); - args.emplace_back("ok", ok); - if (!errorMessage.empty()) { - args.emplace_back("error_message", errorMessage); - } - return sendRequest("answerPreCheckoutQuery", args).get<bool>("", false); -} - - -Message::Ptr Api::sendSticker(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> sticker, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(5); - args.emplace_back("chat_id", chatId); - if (sticker.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(sticker); - args.emplace_back("sticker", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("sticker", boost::get<std::string>(sticker)); - } - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - if (disableNotification){ - args.emplace_back("disable_notification", disableNotification); - } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendSticker", args)); -} - -StickerSet::Ptr Api::getStickerSet(const string& name) const { - vector<HttpReqArg> args; - args.reserve(1); - args.emplace_back("name", name); - return _tgTypeParser.parseJsonAndGetStickerSet(sendRequest("getStickerSet", args)); -} - -File::Ptr Api::uploadStickerFile(std::int64_t userId, const InputFile::Ptr pngSticker) const { - vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("user_id", userId); - args.emplace_back("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName); - return _tgTypeParser.parseJsonAndGetFile(sendRequest("uploadStickerFile", args)); -} - -bool Api::createNewStickerSet(std::int64_t userId, const std::string& name, const std::string& title, const std::string& emojis, - boost::variant<InputFile::Ptr, std::string> pngSticker, boost::variant<InputFile::Ptr, std::string> tgsSticker, - bool containsMasks, MaskPosition::Ptr maskPosition) const { - vector<HttpReqArg> args; - args.reserve(8); - args.emplace_back("user_id", userId); - args.emplace_back("name", name); - args.emplace_back("title", title); - args.emplace_back("emojis", emojis); - - if (pngSticker.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(pngSticker); - args.emplace_back("png_sticker", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("png_sticker", boost::get<std::string>(pngSticker)); - } - if (tgsSticker.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(tgsSticker); - args.emplace_back("tgs_sticker", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("tgs_sticker", boost::get<std::string>(tgsSticker)); - } - if (containsMasks) { - args.emplace_back("contains_mask", containsMasks); - } - if (maskPosition != nullptr) { - args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); - } - return sendRequest("createNewStickerSet", args).get<bool>("", false); -} - -bool Api::addStickerToSet(std::int64_t userId, const std::string& name, const std::string& emojis, - boost::variant<InputFile::Ptr, std::string> pngSticker, boost::variant<InputFile::Ptr, std::string> tgsSticker, - MaskPosition::Ptr maskPosition) const { - vector<HttpReqArg> args; - args.reserve(6); - args.emplace_back("user_id", userId); - args.emplace_back("name", name); - args.emplace_back("emojis", emojis); - - if (pngSticker.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(pngSticker); - args.emplace_back("png_sticker", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("png_sticker", boost::get<std::string>(pngSticker)); - } - if (tgsSticker.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(tgsSticker); - args.emplace_back("tgs_sticker", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("tgs_sticker", boost::get<std::string>(tgsSticker)); - } - if (maskPosition != nullptr) { - args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); - } - return sendRequest("addStickerToSet", args).get<bool>("", false); -} - -bool Api::setStickerPositionInSet(const string& sticker, std::uint32_t position) const { - vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("sticker", sticker); - args.emplace_back("position", position); - return sendRequest("setStickerPositionInSet", args).get<bool>("", false); -} - -bool Api::deleteStickerFromSet(const string& sticker) const { - vector<HttpReqArg> args; - args.reserve(1); - args.emplace_back("sticker", sticker); - return sendRequest("deleteStickerFromSet", args).get<bool>("", false); -} - -bool Api::setStickerSetThumb(const std::string& name, std::int64_t userId, boost::variant<InputFile::Ptr, std::string> thumb) const { - vector<HttpReqArg> args; - args.reserve(3); - args.emplace_back("name", name); - args.emplace_back("user_id", userId); - if (thumb.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(thumb); - args.emplace_back("thumb", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("thumb", boost::get<std::string>(thumb)); - } - return sendRequest("setStickerSetThumb", args).get<bool>("", false); -} - -Message::Ptr Api::sendVideo(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> video, bool supportsStreaming, std::int32_t duration, std::int32_t width, std::int32_t height, boost::variant<InputFile::Ptr, std::string> thumb, const string &caption, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendVideo(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> video, bool supportsStreaming, std::int32_t duration, std::int32_t width, std::int32_t height, boost::variant<InputFile::Ptr, std::string> thumb, const string& caption, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(12); args.emplace_back("chat_id", chatId); @@ -450,7 +277,7 @@ Message::Ptr Api::sendVideo(std::int64_t chatId, boost::variant<InputFile::Ptr, if (!parseMode.empty()) { args.emplace_back("parse_mode", parseMode); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVideo", args)); @@ -496,12 +323,43 @@ Message::Ptr Api::sendAnimation(std::int64_t chatId, boost::variant<InputFile::P if (!parseMode.empty()) { args.emplace_back("parse_mode", parseMode); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendAnimation", args)); } +Message::Ptr Api::sendVoice(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> voice, const string& caption, int duration, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { + vector<HttpReqArg> args; + args.reserve(8); + args.emplace_back("chat_id", chatId); + if (voice.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(voice); + args.emplace_back("voice", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("voice", boost::get<std::string>(voice)); + } + if (!caption.empty()) { + args.emplace_back("caption", caption); + } + if (duration) { + args.emplace_back("duration", duration); + } + if (replyToMessageId) { + args.emplace_back("reply_to_message_id", replyToMessageId); + } + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } + if (!parseMode.empty()) { + args.emplace_back("parse_mode", parseMode); + } + if (disableNotification) { + args.emplace_back("disable_notification", disableNotification); + } + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVoice", args)); +} + Message::Ptr Api::sendVideoNote(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> videoNote, std::int64_t replyToMessageId, bool disableNotification, std::int32_t duration, std::int32_t length, boost::variant<InputFile::Ptr, std::string> thumb, const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; args.reserve(8); @@ -550,54 +408,6 @@ vector<Message::Ptr> Api::sendMediaGroup(std::int64_t chatId, const vector<Input return _tgTypeParser.parseJsonAndGetArray<Message>(&TgTypeParser::parseJsonAndGetMessage, sendRequest("sendMediaGroup", args)); } -Message::Ptr Api::sendVoice(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> voice, const string &caption, int duration, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(8); - args.emplace_back("chat_id", chatId); - if (voice.which() == 0 /* InputFile::Ptr */) { - auto file = boost::get<InputFile::Ptr>(voice); - args.emplace_back("voice", file->data, true, file->mimeType, file->fileName); - } else /* std::string */ { - args.emplace_back("voice", boost::get<std::string>(voice)); - } - if (!caption.empty()) { - args.emplace_back("caption", caption); - } - if (duration){ - args.emplace_back("duration", duration); - } - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - if (!parseMode.empty()) { - args.emplace_back("parse_mode", parseMode); - } - if (disableNotification){ - args.emplace_back("disable_notification", disableNotification); - } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVoice", args)); -} - -Message::Ptr Api::sendGame(std::int64_t chatId, const std::string& gameShortName, std::int32_t replyToMessageId, const InlineKeyboardMarkup::Ptr replyMarkup, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(5); - args.emplace_back("chat_id", chatId); - args.emplace_back("game_short_name", gameShortName); - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - if (disableNotification){ - args.emplace_back("disable_notification", disableNotification); - } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendGame", args)); -} - Message::Ptr Api::sendLocation(std::int64_t chatId, float latitude, float longitude, std::uint32_t livePeriod, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(7); @@ -613,7 +423,7 @@ Message::Ptr Api::sendLocation(std::int64_t chatId, float latitude, float longit if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendLocation", args)); @@ -657,21 +467,6 @@ Message::Ptr Api::stopMessageLiveLocation(std::int64_t chatId, std::int32_t mess return _tgTypeParser.parseJsonAndGetMessage(sendRequest("editMessageLiveLocation", args)); } -bool Api::setChatStickerSet(std::int64_t chatId, const string& stickerSetName) const { - vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("chat_id", chatId); - args.emplace_back("sticker_set_name ", stickerSetName); - return sendRequest("setChatStickerSet", args).get<bool>("", false); -} - -bool Api::deleteChatStickerSet(std::int64_t chatId) const { - vector<HttpReqArg> args; - args.reserve(1); - args.emplace_back("chat_id", chatId); - return sendRequest("deleteChatStickerSet", args).get<bool>("", false); -} - Message::Ptr Api::sendVenue(std::int64_t chatId, float latitude, float longitude, const string& title, const string& address, const string& foursquareId, const string& foursquareType, bool disableNotification, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; args.reserve(10); @@ -692,7 +487,7 @@ Message::Ptr Api::sendVenue(std::int64_t chatId, float latitude, float longitude if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVenue", args)); @@ -716,12 +511,93 @@ Message::Ptr Api::sendContact(std::int64_t chatId, const string& phoneNumber, co if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - if (disableNotification){ + if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendContact", args)); } +Message::Ptr Api::sendPoll(std::int64_t chatId, const std::string& question, const std::vector<std::string>& options, + bool isAnonymous, const std::string& type, bool allowsMultipleAnswers, + std::int32_t correctOptionId, const std::string& explanation, const std::string& explanationParseMode, + std::int32_t openPeriod, std::int64_t closeDate, bool isClosed, + bool disableNotification, std::int32_t replyToMessageId, GenericReply::Ptr replyMarkup) const { + vector<HttpReqArg> args; + args.reserve(15); + + args.emplace_back("chat_id", chatId); + args.emplace_back("question", question); + args.emplace_back("options", _tgTypeParser.parseArray<std::string>([] (const std::string& option) -> std::string { + return StringTools::urlEncode(option); + }, options)); + if (!isAnonymous) { + args.emplace_back("is_anonymous", isAnonymous); + } + if (!type.empty()) { + args.emplace_back("type", type); + } + if (allowsMultipleAnswers) { + args.emplace_back("allows_multiple_answers", allowsMultipleAnswers); + } + if (correctOptionId != 0) { + args.emplace_back("correct_option_id", correctOptionId); + } + if (!explanation.empty()) { + args.emplace_back("explanation", explanation); + } + if (!explanationParseMode.empty()) { + args.emplace_back("explanation_parse_mode", explanationParseMode); + } + if (openPeriod != 0) { + args.emplace_back("open_period", openPeriod); + } + if (closeDate != 0) { + args.emplace_back("close_date", closeDate); + } + if (isClosed) { + args.emplace_back("is_closed", isClosed); + } + if (disableNotification) { + args.emplace_back("disable_notification", disableNotification); + } + if (replyToMessageId != 0) { + args.emplace_back("reply_to_message_id", replyToMessageId); + } + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } + + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendPoll", args)); +} + +Message::Ptr Api::sendPoll(std::int64_t chatId, const std::string& question, const std::vector<std::string>& options, + bool disableNotification, std::int32_t replyToMessageId, GenericReply::Ptr replyMarkup) const { + + return sendPoll(chatId, question, options, true, "", false, 0, "", "", 0, 0, false, false, 0); +} + +Message::Ptr Api::sendDice(std::int64_t chatId, const std::string& emoji, bool disableNotification, + std::int32_t replyToMessageId, GenericReply::Ptr replyMarkup) const { + vector<HttpReqArg> args; + args.reserve(5); + + args.emplace_back("chat_id", chatId); + if (disableNotification) { + args.emplace_back("disable_notification", disableNotification); + } + if (!emoji.empty()) { + args.emplace_back("emoji", emoji); + } + if (replyToMessageId != 0) { + args.emplace_back("reply_to_message_id", replyToMessageId); + } + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } + + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendDice", args)); +} + void Api::sendChatAction(std::int64_t chatId, const string& action) const { vector<HttpReqArg> args; args.reserve(2); @@ -742,13 +618,163 @@ UserProfilePhotos::Ptr Api::getUserProfilePhotos(std::int64_t userId, std::int32 return _tgTypeParser.parseJsonAndGetUserProfilePhotos(sendRequest("getUserProfilePhotos", args)); } -File::Ptr Api::getFile(const string &fileId) const { +File::Ptr Api::getFile(const string& fileId) const { vector<HttpReqArg> args; args.reserve(1); args.emplace_back("file_id", fileId); return _tgTypeParser.parseJsonAndGetFile(sendRequest("getFile", args)); } +string Api::downloadFile(const string& filePath, const std::vector<HttpReqArg>& args) const { + string url(_url); + url += "/file/bot"; + url += _token; + url += "/"; + url += filePath; + + string serverResponse = _httpClient.makeRequest(url, args); + + return serverResponse; +} + +bool Api::kickChatMember(std::int64_t chatId, std::int64_t userId, std::uint64_t untilDate) const { + vector<HttpReqArg> args; + args.reserve(3); + args.emplace_back("chat_id", chatId); + args.emplace_back("user_id", userId); + if (untilDate) { + args.emplace_back("until_date", untilDate); + } + return sendRequest("kickChatMember", args).get<bool>("", false); +} + +bool Api::unbanChatMember(std::int64_t chatId, std::int64_t userId) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("user_id", userId); + return sendRequest("unbanChatMember", args).get<bool>("", false); +} + +bool Api::restrictChatMember(std::int64_t chatId, std::int64_t userId, TgBot::ChatPermissions::Ptr permissions, + std::uint64_t untilDate) const { + vector<HttpReqArg> args; + args.reserve(4); + args.emplace_back("chat_id", chatId); + args.emplace_back("user_id", userId); + args.emplace_back("permissions", _tgTypeParser.parseChatPermissions(permissions)); + if (untilDate) { + args.emplace_back("until_date", untilDate); + } + + return sendRequest("restrictChatMember", args).get<bool>("", false); +} + +bool Api::promoteChatMember(std::int64_t chatId, std::int64_t userId, bool canChangeInfo, bool canPostMessages, + bool canEditMessages, bool canDeleteMessages, bool canInviteUsers, bool canPinMessages, bool canPromoteMembers) const { + vector<HttpReqArg> args; + args.reserve(9); + args.emplace_back("chat_id", chatId); + args.emplace_back("user_id", userId); + if (canChangeInfo) { + args.emplace_back("can_change_info", canChangeInfo); + } + if (canPostMessages) { + args.emplace_back("can_post_messages", canPostMessages); + } + if (canEditMessages) { + args.emplace_back("can_edit_messages", canEditMessages); + } + if (canDeleteMessages) { + args.emplace_back("can_delete_messages", canDeleteMessages); + } + if (canInviteUsers) { + args.emplace_back("can_invite_users", canInviteUsers); + } + if (canPinMessages) { + args.emplace_back("can_pin_messages", canPinMessages); + } + if (canPromoteMembers) { + args.emplace_back("can_promote_members", canPromoteMembers); + } + return sendRequest("promoteChatMember", args).get<bool>("", false); +} + +bool Api::setChatAdministratorCustomTitle(std::int64_t chatId, std::int64_t userId, const std::string& customTitle) const { + vector<HttpReqArg> args; + args.reserve(3); + + args.emplace_back("chat_id", chatId); + args.emplace_back("user_id", userId); + args.emplace_back("custom_title", customTitle); + + return sendRequest("setChatAdministratorCustomTitle", args).get<bool>("", false); +} + +bool Api::setChatPermissions(std::int64_t chatId, ChatPermissions::Ptr permissions) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("permissions", _tgTypeParser.parseChatPermissions(permissions)); + return sendRequest("setChatPermissions", args).get<bool>("", false); +} + +string Api::exportChatInviteLink(std::int64_t chatId) const { + vector<HttpReqArg> args; + args.reserve(1); + args.emplace_back("chat_id", chatId); + return sendRequest("exportChatInviteLink", args).get("", ""); +} + +bool Api::setChatPhoto(std::int64_t chatId, const InputFile::Ptr photo) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("photo", photo->data, true, photo->mimeType, photo->fileName); + return sendRequest("setChatPhoto", args).get<bool>("", false); +} + +bool Api::deleteChatPhoto(std::int64_t chatId) const { + vector<HttpReqArg> args; + args.reserve(1); + args.emplace_back("chat_id", chatId); + return sendRequest("deleteChatPhoto", args).get<bool>("", false); +} + +bool Api::setChatTitle(std::int64_t chatId, const string& title) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("title", title); + return sendRequest("setChatTitle", args).get<bool>("", false); +} + +bool Api::setChatDescription(std::int64_t chatId, const string& description) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("description", description); + return sendRequest("setChatDescription", args).get<bool>("", false); +} + +bool Api::pinChatMessage(std::int64_t chatId, std::int32_t messageId, bool disableNotification) const { + vector<HttpReqArg> args; + args.reserve(3); + args.emplace_back("chat_id", chatId); + args.emplace_back("message_id", messageId); + if (disableNotification) { + args.emplace_back("disable_notification", disableNotification); + } + return sendRequest("pinChatMessage", args).get<bool>("", false); +} + +bool Api::unpinChatMessage(std::int64_t chatId) const { + vector<HttpReqArg> args; + args.reserve(1); + args.emplace_back("chat_id", chatId); + return sendRequest("unpinChatMessage", args).get<bool>("", false); +} + bool Api::leaveChat(std::int64_t chatId) const { vector<HttpReqArg> args; args.reserve(1); @@ -777,7 +803,30 @@ int32_t Api::getChatMembersCount(std::int64_t chatId) const { return sendRequest("getChatMembersCount", args).get<int32_t>("", 0); } -bool Api::answerCallbackQuery(const string & callbackQueryId, const string & text, bool showAlert, const string &url, std::int32_t cacheTime) const { +ChatMember::Ptr Api::getChatMember(std::int64_t chatId, std::int64_t userId) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("user_id", userId); + return _tgTypeParser.parseJsonAndGetChatMember(sendRequest("getChatMember", args)); +} + +bool Api::setChatStickerSet(std::int64_t chatId, const string& stickerSetName) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("chat_id", chatId); + args.emplace_back("sticker_set_name ", stickerSetName); + return sendRequest("setChatStickerSet", args).get<bool>("", false); +} + +bool Api::deleteChatStickerSet(std::int64_t chatId) const { + vector<HttpReqArg> args; + args.reserve(1); + args.emplace_back("chat_id", chatId); + return sendRequest("deleteChatStickerSet", args).get<bool>("", false); +} + +bool Api::answerCallbackQuery(const string& callbackQueryId, const string& text, bool showAlert, const string& url, std::int32_t cacheTime) const { vector<HttpReqArg> args; args.reserve(5); args.emplace_back("callback_query_id", callbackQueryId); @@ -796,8 +845,22 @@ bool Api::answerCallbackQuery(const string & callbackQueryId, const string & tex return sendRequest("answerCallbackQuery", args).get<bool>("", false); } +bool Api::setMyCommands(const std::vector<BotCommand::Ptr>& commands) const { + vector<HttpReqArg> args; + args.reserve(5); + + string commandsJson = _tgTypeParser.parseArray<BotCommand>(&TgTypeParser::parseBotCommand, commands); + args.emplace_back("commands", commandsJson); + + return sendRequest("setMyCommands", args).get<bool>("", false); +} + +std::vector<BotCommand::Ptr> Api::getMyCommands() const { + return _tgTypeParser.parseJsonAndGetArray<BotCommand>(&TgTypeParser::parseJsonAndGetBotCommand, sendRequest("getMyCommands")); +} + Message::Ptr Api::editMessageText(const string& text, std::int64_t chatId, std::int32_t messageId, const string& inlineMessageId, - const string& parseMode, bool disableWebPagePreview, const GenericReply::Ptr replyMarkup) const { + const string& parseMode, bool disableWebPagePreview, const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; args.reserve(7); @@ -830,7 +893,6 @@ Message::Ptr Api::editMessageText(const string& text, std::int64_t chatId, std:: Message::Ptr Api::editMessageCaption(std::int64_t chatId, std::int32_t messageId, const string& caption, const string& inlineMessageId, const GenericReply::Ptr replyMarkup) const { - vector<HttpReqArg> args; args.reserve(5); if (chatId) { @@ -856,11 +918,12 @@ Message::Ptr Api::editMessageCaption(std::int64_t chatId, std::int32_t messageId } } -Message::Ptr Api::editMessageReplyMarkup(std::int64_t chatId, std::int32_t messageId, const string& inlineMessageId, - const GenericReply::Ptr replyMarkup) const { +Message::Ptr Api::editMessageMedia(InputMedia::Ptr media, std::int64_t chatId, std::int32_t messageId, const std::string& inlineMessageId, + GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; - args.reserve(4); + args.reserve(5); + args.emplace_back("media", _tgTypeParser.parseInputMedia(media)); if (chatId) { args.emplace_back("chat_id", chatId); } @@ -873,7 +936,7 @@ Message::Ptr Api::editMessageReplyMarkup(std::int64_t chatId, std::int32_t messa if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - ptree p = sendRequest("editMessageReplyMarkup", args); + ptree p = sendRequest("editMessageMedia", args); if (p.get_child_optional("message_id")) { return _tgTypeParser.parseJsonAndGetMessage(p); } else { @@ -881,12 +944,11 @@ Message::Ptr Api::editMessageReplyMarkup(std::int64_t chatId, std::int32_t messa } } -Message::Ptr Api::editMessageMedia(InputMedia::Ptr media, std::int64_t chatId, std::int32_t messageId, const std::string& inlineMessageId, - GenericReply::Ptr replyMarkup) const { +Message::Ptr Api::editMessageReplyMarkup(std::int64_t chatId, std::int32_t messageId, const string& inlineMessageId, + const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; - args.reserve(5); - args.emplace_back("media", _tgTypeParser.parseInputMedia(media)); + args.reserve(4); if (chatId) { args.emplace_back("chat_id", chatId); } @@ -899,7 +961,7 @@ Message::Ptr Api::editMessageMedia(InputMedia::Ptr media, std::int64_t chatId, s if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - ptree p = sendRequest("editMessageMedia", args); + ptree p = sendRequest("editMessageReplyMarkup", args); if (p.get_child_optional("message_id")) { return _tgTypeParser.parseJsonAndGetMessage(p); } else { @@ -907,74 +969,159 @@ Message::Ptr Api::editMessageMedia(InputMedia::Ptr media, std::int64_t chatId, s } } -ChatMember::Ptr Api::getChatMember(std::int64_t chatId, std::int64_t userId) const { +Poll::Ptr Api::stopPoll(std::int64_t chatId, std::int64_t messageId, const InlineKeyboardMarkup::Ptr replyMarkup) const { vector<HttpReqArg> args; - args.reserve(2); + args.reserve(3); args.emplace_back("chat_id", chatId); - args.emplace_back("user_id", userId); - return _tgTypeParser.parseJsonAndGetChatMember(sendRequest("getChatMember", args)); + args.emplace_back("message_id", messageId); + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } + return _tgTypeParser.parseJsonAndGetPoll(sendRequest("stopPoll", args)); } -vector<Update::Ptr> Api::getUpdates(std::int32_t offset, std::int32_t limit, std::int32_t timeout, const StringArrayPtr &allowedUpdates) const { +void Api::deleteMessage(std::int64_t chatId, std::int32_t messageId) const { + sendRequest("deleteMessage", { HttpReqArg("chat_id", chatId), HttpReqArg("message_id", messageId) }); +} + +Message::Ptr Api::sendSticker(std::int64_t chatId, boost::variant<InputFile::Ptr, std::string> sticker, std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { vector<HttpReqArg> args; - args.reserve(4); - if (offset) { - args.emplace_back("offset", offset); + args.reserve(5); + args.emplace_back("chat_id", chatId); + if (sticker.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(sticker); + args.emplace_back("sticker", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("sticker", boost::get<std::string>(sticker)); } - limit = max(1, min(100, limit)); - args.emplace_back("limit", limit); - if (timeout) { - args.emplace_back("timeout", timeout); + if (replyToMessageId) { + args.emplace_back("reply_to_message_id", replyToMessageId); } - if (allowedUpdates != nullptr) { - string allowedUpdatesJson = _tgTypeParser.parseArray<string>( - [](const string &s)->string { - return s; - }, *allowedUpdates); - args.emplace_back("allowed_updates", allowedUpdatesJson); + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } - return _tgTypeParser.parseJsonAndGetArray<Update>(&TgTypeParser::parseJsonAndGetUpdate, sendRequest("getUpdates", args)); + if (disableNotification) { + args.emplace_back("disable_notification", disableNotification); + } + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendSticker", args)); } -void Api::setWebhook(const string& url, const InputFile::Ptr certificate, std::int32_t maxConnection, const StringArrayPtr &allowedUpdates) const { +StickerSet::Ptr Api::getStickerSet(const string& name) const { vector<HttpReqArg> args; - args.reserve(4); - if (!url.empty()) { - args.emplace_back("url", url); + args.reserve(1); + args.emplace_back("name", name); + return _tgTypeParser.parseJsonAndGetStickerSet(sendRequest("getStickerSet", args)); +} + +File::Ptr Api::uploadStickerFile(std::int64_t userId, const InputFile::Ptr pngSticker) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("user_id", userId); + args.emplace_back("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName); + return _tgTypeParser.parseJsonAndGetFile(sendRequest("uploadStickerFile", args)); +} + +bool Api::createNewStickerSet(std::int64_t userId, const std::string& name, const std::string& title, + const std::string& emojis, boost::variant<InputFile::Ptr, std::string> pngSticker, boost::variant<InputFile::Ptr, std::string> tgsSticker, + bool containsMasks, MaskPosition::Ptr maskPosition) const { + vector<HttpReqArg> args; + args.reserve(8); + + args.emplace_back("user_id", userId); + args.emplace_back("name", name); + args.emplace_back("title", title); + args.emplace_back("emojis", emojis); + if (pngSticker.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(pngSticker); + args.emplace_back("png_sticker", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("png_sticker", boost::get<std::string>(pngSticker)); } - if (certificate != nullptr) { - args.emplace_back("certificate", certificate->data, true, certificate->mimeType, certificate->fileName); + if (tgsSticker.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(tgsSticker); + args.emplace_back("tgs_sticker", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("tgs_sticker", boost::get<std::string>(tgsSticker)); } - if (maxConnection != 40) { - args.emplace_back("max_connections", maxConnection); + if (containsMasks) { + args.emplace_back("contains_mask", containsMasks); } - if (allowedUpdates != nullptr) { - auto allowedUpdatesJson = _tgTypeParser.parseArray<string>( - [](const string &s)->string { - return s; - }, *allowedUpdates); - args.emplace_back("allowed_updates", allowedUpdatesJson); + if (maskPosition != nullptr) { + args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); } - sendRequest("setWebhook", args); + return sendRequest("createNewStickerSet", args).get<bool>("", false); } -bool Api::deleteWebhook() const { - return sendRequest("deleteWebhook").get<bool>("", false); +bool Api::createNewStickerSet(std::int64_t userId, const std::string& name, const std::string& title, + boost::variant<InputFile::Ptr, std::string> pngSticker, const std::string& emojis, bool containsMasks, + MaskPosition::Ptr maskPosition) const { + + return createNewStickerSet(userId, name, title, emojis, pngSticker, "", containsMasks, maskPosition); } -WebhookInfo::Ptr Api::getWebhookInfo() const { - ptree p = sendRequest("getWebhookInfo"); +bool Api::addStickerToSet(std::int64_t userId, const std::string& name, const std::string& emojis, + boost::variant<InputFile::Ptr, std::string> pngSticker, boost::variant<InputFile::Ptr, std::string> tgsSticker, MaskPosition::Ptr maskPosition) const { + vector<HttpReqArg> args; + args.reserve(6); - if (!p.get_child_optional("url")) { - return nullptr; + args.emplace_back("user_id", userId); + args.emplace_back("name", name); + args.emplace_back("emojis", emojis); + if (pngSticker.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(pngSticker); + args.emplace_back("png_sticker", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("png_sticker", boost::get<std::string>(pngSticker)); } - if (p.get<string>("url","") != string("")) { - return _tgTypeParser.parseJsonAndGetWebhookInfo(p); + if (tgsSticker.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(tgsSticker); + args.emplace_back("tgs_sticker", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("tgs_sticker", boost::get<std::string>(tgsSticker)); } - else { - return nullptr; + if (maskPosition != nullptr) { + args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); } + + return sendRequest("addStickerToSet", args).get<bool>("", false); +} + +bool Api::addStickerToSet(std::int64_t userId, const std::string& name, boost::variant<InputFile::Ptr, std::string> pngSticker, + const std::string& emojis, MaskPosition::Ptr maskPosition) const { + + return addStickerToSet(userId, name, emojis, pngSticker, "", maskPosition); +} + +bool Api::setStickerPositionInSet(const string& sticker, std::uint32_t position) const { + vector<HttpReqArg> args; + args.reserve(2); + args.emplace_back("sticker", sticker); + args.emplace_back("position", position); + return sendRequest("setStickerPositionInSet", args).get<bool>("", false); +} + +bool Api::deleteStickerFromSet(const string& sticker) const { + vector<HttpReqArg> args; + args.reserve(1); + args.emplace_back("sticker", sticker); + return sendRequest("deleteStickerFromSet", args).get<bool>("", false); +} + +bool Api::setStickerSetThumb(const std::string& name, std::int64_t userId, boost::variant<InputFile::Ptr, std::string> thumb) const { + vector<HttpReqArg> args; + args.reserve(3); + + args.emplace_back("name", name); + args.emplace_back("user_id", userId); + if (thumb.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(thumb); + args.emplace_back("thumb", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("thumb", boost::get<std::string>(thumb)); + } + + return sendRequest("setStickerSetThumb", args).get<bool>("", false); } bool Api::answerInlineQuery(const string& inlineQueryId, const std::vector<InlineQueryResult::Ptr>& results, @@ -1002,139 +1149,111 @@ bool Api::answerInlineQuery(const string& inlineQueryId, const std::vector<Inlin return sendRequest("answerInlineQuery", args).get<bool>("", false); } -bool Api::kickChatMember(std::int64_t chatId, std::int64_t userId, std::uint64_t untilDate) const { +Message::Ptr Api::sendInvoice(std::int64_t chatId, const std::string& title, const std::string& description, const std::string& payload, + const std::string& providerToken, const std::string& startParameter, const std::string& currency, const std::vector<LabeledPrice::Ptr>& prices, + const std::string& providerData, const std::string& photoUrl, std::int32_t photoSize, + std::int32_t photoWidth, std::int32_t photoHeight, bool needName, + bool needPhoneNumber, bool needEmail, bool needShippingAddress, + bool sendPhoneNumberToProvider, bool sendEmailToProvider, bool isFlexible, + std::int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { vector<HttpReqArg> args; - args.reserve(3); + args.reserve(23); args.emplace_back("chat_id", chatId); - args.emplace_back("user_id", userId); - if (untilDate) { - args.emplace_back("until_date", untilDate); + args.emplace_back("title", title); + args.emplace_back("description", description); + args.emplace_back("payload", payload); + args.emplace_back("provider_token", providerToken); + args.emplace_back("start_parameter", startParameter); + args.emplace_back("currency", currency); + args.emplace_back("prices", _tgTypeParser.parseArray<LabeledPrice>(&TgTypeParser::parseLabeledPrice, prices)); + if (!providerData.empty()) { + args.emplace_back("provider_data", providerData); } - return sendRequest("kickChatMember", args).get<bool>("", false); -} - -bool Api::unbanChatMember(std::int64_t chatId, std::int64_t userId) const { - vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("chat_id", chatId); - args.emplace_back("user_id", userId); - return sendRequest("unbanChatMember", args).get<bool>("", false); -} -bool Api::restrictChatMember(std::int64_t chatId, std::int64_t userId, TgBot::ChatPermissions::Ptr permissions, - std::uint64_t untilDate) const { - vector<HttpReqArg> args; - args.reserve(4); - args.emplace_back("chat_id", chatId); - args.emplace_back("user_id", userId); - args.emplace_back("permissions", _tgTypeParser.parseChatPermissions(permissions)); - if (untilDate) { - args.emplace_back("until_date", untilDate); + if (!photoUrl.empty()) { + args.emplace_back("photo_url", photoUrl); } - - return sendRequest("restrictChatMember", args).get<bool>("", false); -} - -bool Api::promoteChatMember(std::int64_t chatId, std::int64_t userId, bool canChangeInfo, bool canPostMessages, - bool canEditMessages, bool canDeleteMessages, bool canInviteUsers, bool canPinMessages, bool canPromoteMembers) const { - vector<HttpReqArg> args; - args.reserve(9); - args.emplace_back("chat_id", chatId); - args.emplace_back("user_id", userId); - if (canChangeInfo) { - args.emplace_back("can_change_info", canChangeInfo); + if (photoSize) { + args.emplace_back("photo_size", photoSize); } - if (canPostMessages) { - args.emplace_back("can_post_messages", canPostMessages); + if (photoWidth) { + args.emplace_back("photo_width", photoWidth); } - if (canEditMessages) { - args.emplace_back("can_edit_messages", canEditMessages); + if (photoHeight) { + args.emplace_back("photo_height", photoHeight); } - if (canDeleteMessages) { - args.emplace_back("can_delete_messages", canDeleteMessages); + if (needName) { + args.emplace_back("need_name", needName); } - if (canInviteUsers) { - args.emplace_back("can_invite_users", canInviteUsers); + if (needPhoneNumber) { + args.emplace_back("need_phone_number", needPhoneNumber); } - if (canPinMessages) { - args.emplace_back("can_pin_messages", canPinMessages); + if (needEmail) { + args.emplace_back("need_email", needEmail); } - if (canPromoteMembers) { - args.emplace_back("can_promote_members", canPromoteMembers); + if (needShippingAddress) { + args.emplace_back("need_shipping_address", needShippingAddress); } - return sendRequest("promoteChatMember", args).get<bool>("", false); -} - -bool Api::setChatAdministratorCustomTitle(std::int64_t chatId, std::int64_t userId, const std::string& customTitle) const { - vector<HttpReqArg> args; - args.reserve(3); - args.emplace_back("chat_id", chatId); - args.emplace_back("user_id", userId); - args.emplace_back("custom_title", customTitle); - return sendRequest("setChatAdministratorCustomTitle", args).get<bool>("", false); -} - -bool Api::setChatPermissions(std::int64_t chatId, ChatPermissions::Ptr permissions) const{ - vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("chat_id", chatId); - args.emplace_back("permissions", _tgTypeParser.parseChatPermissions(permissions)); - return sendRequest("setChatPermissions", args).get<bool>("", false); -} - -string Api::exportChatInviteLink(std::int64_t chatId) const { - vector<HttpReqArg> args; - args.reserve(1); - args.emplace_back("chat_id", chatId); - return sendRequest("exportChatInviteLink", args).get("", ""); -} - -bool Api::setChatPhoto(std::int64_t chatId, const InputFile::Ptr photo) const { - vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("chat_id", chatId); - args.emplace_back("photo", photo->data, true, photo->mimeType, photo->fileName); - return sendRequest("setChatPhoto", args).get<bool>("", false); -} - -bool Api::deleteChatPhoto(std::int64_t chatId) const { - vector<HttpReqArg> args; - args.reserve(1); - args.emplace_back("chat_id", chatId); - return sendRequest("deleteChatPhoto", args).get<bool>("", false); + if (sendPhoneNumberToProvider) { + args.emplace_back("send_phone_number_to_provider", sendPhoneNumberToProvider); + } + if (sendEmailToProvider) { + args.emplace_back("send_email_to_provider", sendEmailToProvider); + } + if (isFlexible) { + args.emplace_back("is_flexible", isFlexible); + } + if (replyToMessageId) { + args.emplace_back("reply_to_message_id", replyToMessageId); + } + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } + if (disableNotification) { + args.emplace_back("disable_notification", disableNotification); + } + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendInvoice", args)); } -bool Api::setChatTitle(std::int64_t chatId, const string& title) const { +bool Api::answerShippingQuery(const std::string& shippingQueryId, bool ok, const std::vector<ShippingOption::Ptr>& shippingOptions, const std::string& errorMessage) const { vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("chat_id", chatId); - args.emplace_back("title", title); - return sendRequest("setChatTitle", args).get<bool>("", false); + args.reserve(4); + args.emplace_back("shipping_query_id", shippingQueryId); + args.emplace_back("ok", ok); + if (!shippingOptions.empty()) { + args.emplace_back("shipping_options", _tgTypeParser.parseArray<ShippingOption>(&TgTypeParser::parseShippingOption, shippingOptions)); + } + if (!errorMessage.empty()) { + args.emplace_back("error_message", errorMessage); + } + return sendRequest("answerShippingQuery", args).get<bool>("", false); } -bool Api::setChatDescription(std::int64_t chatId, const string& description) const { +bool Api::answerPreCheckoutQuery(const std::string& preCheckoutQueryId, bool ok, const std::string& errorMessage) const { vector<HttpReqArg> args; - args.reserve(2); - args.emplace_back("chat_id", chatId); - args.emplace_back("description", description); - return sendRequest("setChatDescription", args).get<bool>("", false); + args.reserve(3); + args.emplace_back("pre_checkout_query_id", preCheckoutQueryId); + args.emplace_back("ok", ok); + if (!errorMessage.empty()) { + args.emplace_back("error_message", errorMessage); + } + return sendRequest("answerPreCheckoutQuery", args).get<bool>("", false); } -bool Api::pinChatMessage(std::int64_t chatId, std::int32_t messageId, bool disableNotification) const { +Message::Ptr Api::sendGame(std::int64_t chatId, const std::string& gameShortName, std::int32_t replyToMessageId, const InlineKeyboardMarkup::Ptr replyMarkup, bool disableNotification) const { vector<HttpReqArg> args; - args.reserve(3); + args.reserve(5); args.emplace_back("chat_id", chatId); - args.emplace_back("message_id", messageId); + args.emplace_back("game_short_name", gameShortName); + if (replyToMessageId) { + args.emplace_back("reply_to_message_id", replyToMessageId); + } + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } - return sendRequest("pinChatMessage", args).get<bool>("", false); -} - -bool Api::unpinChatMessage(std::int64_t chatId) const { - vector<HttpReqArg> args; - args.reserve(1); - args.emplace_back("chat_id", chatId); - return sendRequest("unpinChatMessage", args).get<bool>("", false); + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendGame", args)); } Message::Ptr Api::setGameScore(std::int64_t userId, std::int32_t score, bool force, bool disableEditMessage, std::int64_t chatId, std::int32_t messageId, const std::string& inlineMessageId) const { @@ -1148,13 +1267,13 @@ Message::Ptr Api::setGameScore(std::int64_t userId, std::int32_t score, bool for if (disableEditMessage) { args.emplace_back("disable_edit_message", disableEditMessage); } - if (chatId){ + if (chatId) { args.emplace_back("chat_id", chatId); } - if (messageId){ + if (messageId) { args.emplace_back("message_id", messageId); } - if (!inlineMessageId.empty()){ + if (!inlineMessageId.empty()) { args.emplace_back("inline_message_id", inlineMessageId); } return _tgTypeParser.parseJsonAndGetMessage(sendRequest("setGameScore", args)); @@ -1177,98 +1296,12 @@ vector<GameHighScore::Ptr> Api::getGameHighScores(std::int64_t userId, std::int3 if (messageId) { args.emplace_back("message_id", messageId); } - if (!inlineMessageId.empty()){ + if (!inlineMessageId.empty()) { args.emplace_back("inline_message_id", inlineMessageId); } return _tgTypeParser.parseJsonAndGetArray<GameHighScore>(&TgTypeParser::parseJsonAndGetGameHighScore, sendRequest("getGameHighScores", args)); } -void Api::deleteMessage(std::int64_t chatId, std::int32_t messageId) const { - sendRequest("deleteMessage", { HttpReqArg("chat_id", chatId), HttpReqArg("message_id", messageId) }); -} - -Message::Ptr Api::sendPoll(std::int64_t chatId, const std::string& question, const std::vector<std::string>& options, bool disableNotification, std::int32_t replyToMessageId, - const GenericReply::Ptr replyMarkup, bool isAnonymous, const std::string& type, bool allowsMultipleAnswers, - std::int32_t correctOptionId, bool isClosed) const { - vector<HttpReqArg> args; - args.reserve(11); - args.emplace_back("chat_id", chatId); - args.emplace_back("question", question); - args.emplace_back("options", _tgTypeParser.parseArray<std::string>([] (const std::string& option) -> std::string { - return StringTools::urlEncode(option); - }, options)); - - if (!isAnonymous) { - args.emplace_back("is_anonymous", isAnonymous); - } - if (!type.empty()) { - args.emplace_back("type", type); - } - if (allowsMultipleAnswers) { - args.emplace_back("allows_multiple_answers", allowsMultipleAnswers); - } - if (correctOptionId != 0) { - args.emplace_back("correct_option_id", correctOptionId); - } - if (isClosed) { - args.emplace_back("is_closed", isClosed); - } - if (disableNotification) { - args.emplace_back("disable_notification", disableNotification); - } - if (replyToMessageId != 0) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendPoll", args)); -} - -Message::Ptr Api::sendDice(std::int64_t chatId, bool disableNotification, std::int32_t replyToMessageId, GenericReply::Ptr replyMarkup) const { - vector<HttpReqArg> args; - args.reserve(4); - args.emplace_back("chat_id", chatId); - - if (disableNotification) { - args.emplace_back("disable_notification", disableNotification); - } - if (replyToMessageId != 0) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendDice", args)); -} - -Poll::Ptr Api::stopPoll(std::int64_t chatId, std::int64_t messageId, const InlineKeyboardMarkup::Ptr replyMarkup) const { - vector<HttpReqArg> args; - args.reserve(3); - args.emplace_back("chat_id", chatId); - args.emplace_back("message_id", messageId); - if (replyMarkup){ - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - return _tgTypeParser.parseJsonAndGetPoll(sendRequest("stopPoll", args)); -} - -bool Api::setMyCommands(const std::vector<BotCommand::Ptr>& commands) const { - vector<HttpReqArg> args; - args.reserve(5); - - string commandsJson = _tgTypeParser.parseArray<BotCommand>(&TgTypeParser::parseBotCommand, commands); - args.emplace_back("commands", commandsJson); - - return sendRequest("setMyCommands",args).get<bool>("",false); -} - -std::vector<BotCommand::Ptr> Api::getMyCommands() const { - return _tgTypeParser.parseJsonAndGetArray<BotCommand>(&TgTypeParser::parseJsonAndGetBotCommand, sendRequest("getMyCommands")); -} - ptree Api::sendRequest(const string& method, const vector<HttpReqArg>& args) const { string url(_url); url += "/bot"; @@ -1292,19 +1325,4 @@ ptree Api::sendRequest(const string& method, const vector<HttpReqArg>& args) con throw TgException("tgbot-cpp library can't parse json response. " + string(e.what())); } } - -string Api::downloadFile(const string& filePath, const std::vector<HttpReqArg>& args) const { - string url(_url); - url += "/file/bot"; - url += _token; - url += "/"; - url += filePath; - - string serverResponse = _httpClient.makeRequest(url, args); - - return serverResponse; -} - - - } diff --git a/src/TgTypeParser.cpp b/src/TgTypeParser.cpp index 37dafb6..daa6184 100644 --- a/src/TgTypeParser.cpp +++ b/src/TgTypeParser.cpp @@ -10,8 +10,8 @@ namespace TgBot { Chat::Ptr TgTypeParser::parseJsonAndGetChat(const ptree& data) const { auto result(make_shared<Chat>()); - result->id = data.get<int64_t>("id"); - string type = data.get<string>("type"); + result->id = data.get<int64_t>("id", 0); + string type = data.get<string>("type", ""); if (type == "private") { result->type = Chat::Type::Private; } else if (type == "group") { @@ -21,20 +21,18 @@ Chat::Ptr TgTypeParser::parseJsonAndGetChat(const ptree& data) const { } else if (type == "channel") { result->type = Chat::Type::Channel; } - result->title = data.get("title", ""); - result->username = data.get("username", ""); - result->firstName = data.get("first_name", ""); - result->lastName = data.get("last_name", ""); - result->allMembersAreAdministrators = data.get<bool>("all_members_are_administrators", false); + result->title = data.get<string>("title", ""); + result->username = data.get<string>("username", ""); + result->firstName = data.get<string>("first_name", ""); + result->lastName = data.get<string>("last_name", ""); result->photo = tryParseJson<ChatPhoto>(&TgTypeParser::parseJsonAndGetChatPhoto, data, "photo"); - result->description = data.get("description", ""); - result->inviteLink = data.get("invite_link", ""); + result->description = data.get<string>("description", ""); + result->inviteLink = data.get<string>("invite_link", ""); result->pinnedMessage = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "pinned_message"); result->permissions = tryParseJson<ChatPermissions>(&TgTypeParser::parseJsonAndGetChatPermissions, data, "permissions"); - result->slowModeDelay = data.get<int32_t>("slow_mode_delay"); - result->stickerSetName = data.get("sticker_set_name", ""); + result->slowModeDelay = data.get<int32_t>("slow_mode_delay", 0); + result->stickerSetName = data.get<string>("sticker_set_name", ""); result->canSetStickerSet = data.get<bool>("can_set_sticker_set", false); - return result; } @@ -58,7 +56,6 @@ string TgTypeParser::parseChat(const Chat::Ptr& object) const { appendToJson(result, "username", object->username); appendToJson(result, "first_name", object->firstName); appendToJson(result, "last_name", object->lastName); - appendToJson(result, "all_members_are_administrators", object->allMembersAreAdministrators); appendToJson(result, "photo", parseChatPhoto(object->photo)); appendToJson(result, "description", object->description); appendToJson(result, "invite_link", object->inviteLink); @@ -74,12 +71,12 @@ string TgTypeParser::parseChat(const Chat::Ptr& object) const { User::Ptr TgTypeParser::parseJsonAndGetUser(const ptree& data) const { auto result(make_shared<User>()); - result->id = data.get<int64_t>("id"); + result->id = data.get<int64_t>("id", 0); result->isBot = data.get<bool>("is_bot", false); - result->firstName = data.get<string>("first_name"); - result->lastName = data.get("last_name", ""); - result->username = data.get("username", ""); - result->languageCode = data.get("language_code", ""); + result->firstName = data.get<string>("first_name", ""); + result->lastName = data.get<string>("last_name", ""); + result->username = data.get<string>("username", ""); + result->languageCode = data.get<string>("language_code", ""); result->canJoinGroups = data.get<bool>("can_join_groups", false); result->canReadAllGroupMessages = data.get<bool>("can_read_all_group_messages", false); result->supportsInlineQueries = data.get<bool>("supports_inline_queries", false); @@ -108,9 +105,9 @@ string TgTypeParser::parseUser(const User::Ptr& object) const { MessageEntity::Ptr TgTypeParser::parseJsonAndGetMessageEntity(const ptree& data) const{ auto result(make_shared<MessageEntity>()); - result->type = data.get<string>("type"); - result->offset = data.get<int32_t>("offset"); - result->length = data.get<int32_t>("length"); + result->type = data.get<string>("type", ""); + result->offset = data.get<int32_t>("offset", 0); + result->length = data.get<int32_t>("length", 0); result->url = data.get<string>("url", ""); result->user = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "user"); result->language = data.get<string>("language", ""); @@ -136,21 +133,22 @@ string TgTypeParser::parseMessageEntity(const MessageEntity::Ptr& object) const Message::Ptr TgTypeParser::parseJsonAndGetMessage(const ptree& data) const { auto result(make_shared<Message>()); - result->messageId = data.get<int32_t>("message_id"); + result->messageId = data.get<int32_t>("message_id", 0); result->from = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "from"); - result->date = data.get<int32_t>("date"); + result->date = data.get<int32_t>("date", 0); result->chat = parseJsonAndGetChat(data.find("chat")->second); result->forwardFrom = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "forward_from"); result->forwardFromChat = tryParseJson<Chat>(&TgTypeParser::parseJsonAndGetChat, data, "forward_from_chat"); result->forwardFromMessageId = data.get<int32_t>("forward_from_message_id", 0); - result->forwardSignature = data.get("forward_signature", ""); - result->forwardSenderName = data.get("forward_sender_name", ""); - result->forwardDate = data.get("forward_date", 0); + result->forwardSignature = data.get<string>("forward_signature", ""); + result->forwardSenderName = data.get<string>("forward_sender_name", ""); + result->forwardDate = data.get<int32_t>("forward_date", 0); result->replyToMessage = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "reply_to_message"); + result->viaBot = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "via_bot"); result->editDate = data.get<int32_t>("edit_date", 0); - result->mediaGroupId = data.get("media_group_id", ""); - result->authorSignature = data.get("author_signature", ""); - result->text = data.get("text", ""); + result->mediaGroupId = data.get<string>("media_group_id", ""); + result->authorSignature = data.get<string>("author_signature", ""); + result->text = data.get<string>("text", ""); result->entities = parseJsonAndGetArray<MessageEntity>(&TgTypeParser::parseJsonAndGetMessageEntity, data, "entities"); result->captionEntities = parseJsonAndGetArray<MessageEntity>(&TgTypeParser::parseJsonAndGetMessageEntity, data, "caption_entities"); result->audio = tryParseJson<Audio>(&TgTypeParser::parseJsonAndGetAudio, data, "audio"); @@ -162,31 +160,29 @@ Message::Ptr TgTypeParser::parseJsonAndGetMessage(const ptree& data) const { result->video = tryParseJson<Video>(&TgTypeParser::parseJsonAndGetVideo, data, "video"); result->voice = tryParseJson<Voice>(&TgTypeParser::parseJsonAndGetVoice, data, "voice"); result->videoNote = tryParseJson<VideoNote>(&TgTypeParser::parseJsonAndGetVideoNote, data, "video_note"); - result->caption = data.get("caption", ""); + result->caption = data.get<string>("caption", ""); result->contact = tryParseJson<Contact>(&TgTypeParser::parseJsonAndGetContact, data, "contact"); result->location = tryParseJson<Location>(&TgTypeParser::parseJsonAndGetLocation, data, "location"); result->venue = tryParseJson<Venue>(&TgTypeParser::parseJsonAndGetVenue, data, "venue"); result->poll = tryParseJson<Poll>(&TgTypeParser::parseJsonAndGetPoll, data, "poll"); result->dice = tryParseJson<Dice>(&TgTypeParser::parseJsonAndGetDice, data, "dice"); - result->newChatMember = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "new_chat_member"); result->newChatMembers = parseJsonAndGetArray<User>(&TgTypeParser::parseJsonAndGetUser, data, "new_chat_members"); result->leftChatMember = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "left_chat_member"); - result->newChatTitle = data.get("new_chat_title", ""); + result->newChatTitle = data.get<string>("new_chat_title", ""); result->newChatPhoto = parseJsonAndGetArray<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "new_chat_photo"); - result->deleteChatPhoto = data.get("delete_chat_photo", false); - result->groupChatCreated = data.get("group_chat_created", false); - result->supergroupChatCreated = data.get("supergroup_chat_created", false); - result->channelChatCreated = data.get("channel_chat_created", false); + result->deleteChatPhoto = data.get<bool>("delete_chat_photo", false); + result->groupChatCreated = data.get<bool>("group_chat_created", false); + result->supergroupChatCreated = data.get<bool>("supergroup_chat_created", false); + result->channelChatCreated = data.get<bool>("channel_chat_created", false); result->migrateToChatId = data.get<int64_t>("migrate_to_chat_id", 0); result->migrateFromChatId = data.get<int64_t>("migrate_from_chat_id", 0); result->pinnedMessage = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "pinned_message"); result->invoice = tryParseJson<Invoice>(&TgTypeParser::parseJsonAndGetInvoice, data, "invoice"); result->successfulPayment = tryParseJson<SuccessfulPayment>(&TgTypeParser::parseJsonAndGetSuccessfulPayment, data, "successful_payment"); - result->connectedWebsite = data.get("connected_website", ""); + result->connectedWebsite = data.get<string>("connected_website", ""); // result->passportData = tryParseJson<PassportData>(&TgTypeParser::parseJsonAndGetPassportData, data, "passport_data"); result->replyMarkup = tryParseJson<InlineKeyboardMarkup>(&TgTypeParser::parseJsonAndGetInlineKeyboardMarkup, data, "reply_markup"); - result->automaticForward = data.get("is_automatic_forward", false); - + result->automaticForward = data.get<bool>("is_automatic_forward", false); return result; } @@ -207,6 +203,7 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const { appendToJson(result, "forward_sender_name", object->forwardSenderName); appendToJson(result, "forward_date", object->forwardDate); appendToJson(result, "reply_to_message", parseMessage(object->replyToMessage)); + appendToJson(result, "via_bot", parseUser(object->viaBot)); appendToJson(result, "edit_date", object->editDate); appendToJson(result, "media_group_id", object->mediaGroupId); appendToJson(result, "author_signature", object->authorSignature); @@ -228,7 +225,6 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const { appendToJson(result, "venue", parseVenue(object->venue)); appendToJson(result, "poll", parsePoll(object->poll)); appendToJson(result, "dice", parseDice(object->dice)); - appendToJson(result, "new_chat_member", parseUser(object->newChatMember)); appendToJson(result, "new_chat_members", parseArray(&TgTypeParser::parseUser, object->newChatMembers)); appendToJson(result, "left_chat_member", parseUser(object->leftChatMember)); appendToJson(result, "new_chat_title", object->newChatTitle); @@ -245,6 +241,7 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const { appendToJson(result, "connected_website", object->connectedWebsite); // appendToJson(result, "passport_data", parsePassportData(object->passportData)); appendToJson(result, "reply_markup", parseInlineKeyboardMarkup(object->replyMarkup)); + appendToJson(result, "is_automatic_forward", object->automaticForward); removeLastComma(result); result += '}'; return result; @@ -252,11 +249,11 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const { PhotoSize::Ptr TgTypeParser::parseJsonAndGetPhotoSize(const ptree& data) const { auto result(make_shared<PhotoSize>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); - result->width = data.get<int32_t>("width"); - result->height = data.get<int32_t>("height"); - result->fileSize = data.get("file_size", 0); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); + result->width = data.get<int32_t>("width", 0); + result->height = data.get<int32_t>("height", 0); + result->fileSize = data.get<int32_t>("file_size", 0); return result; } @@ -278,13 +275,13 @@ string TgTypeParser::parsePhotoSize(const PhotoSize::Ptr& object) const { Audio::Ptr TgTypeParser::parseJsonAndGetAudio(const ptree& data) const { auto result(make_shared<Audio>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); - result->duration = data.get<int32_t>("duration"); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); + result->duration = data.get<int32_t>("duration", 0); result->performer = data.get<string>("performer", ""); result->title = data.get<string>("title", ""); - result->mimeType = data.get("mime_type", ""); - result->fileSize = data.get("file_size", 0); + result->mimeType = data.get<string>("mime_type", ""); + result->fileSize = data.get<int32_t>("file_size", 0); result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); return result; } @@ -310,12 +307,12 @@ string TgTypeParser::parseAudio(const Audio::Ptr& object) const { Document::Ptr TgTypeParser::parseJsonAndGetDocument(const ptree& data) const { auto result(make_shared<Document>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); - result->fileName = data.get("file_name", ""); - result->mimeType = data.get("mime_type", ""); - result->fileSize = data.get("file_size", 0); + result->fileName = data.get<string>("file_name", ""); + result->mimeType = data.get<string>("mime_type", ""); + result->fileSize = data.get<int32_t>("file_size", 0); return result; } @@ -338,16 +335,16 @@ string TgTypeParser::parseDocument(const Document::Ptr& object) const { Sticker::Ptr TgTypeParser::parseJsonAndGetSticker(const ptree& data) const { auto result(make_shared<Sticker>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); - result->width = data.get<int32_t>("width"); - result->height = data.get<int32_t>("height"); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); + result->width = data.get<int32_t>("width", 0); + result->height = data.get<int32_t>("height", 0); result->isAnimated = data.get<bool>("is_animated", false); result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); - result->emoji = data.get("emoji", ""); - result->setName = data.get("set_name", ""); + result->emoji = data.get<string>("emoji", ""); + result->setName = data.get<string>("set_name", ""); result->maskPosition = tryParseJson<MaskPosition>(&TgTypeParser::parseJsonAndGetMaskPosition, data, "mask_position"); - result->fileSize = data.get("file_size", 0); + result->fileSize = data.get<int32_t>("file_size", 0); return result; } @@ -374,8 +371,8 @@ string TgTypeParser::parseSticker(const Sticker::Ptr& object) const { StickerSet::Ptr TgTypeParser::parseJsonAndGetStickerSet(const ptree& data) const { auto result(make_shared<StickerSet>()); - result->name = data.get("name", ""); - result->title = data.get("title", ""); + result->name = data.get<string>("name", ""); + result->title = data.get<string>("title", ""); result->isAnimated = data.get<bool>("is_animated", false); result->containsMasks = data.get<bool>("contains_masks", false); result->stickers = parseJsonAndGetArray<Sticker>(&TgTypeParser::parseJsonAndGetSticker, data, "stickers"); @@ -426,15 +423,19 @@ string TgTypeParser::parseMaskPosition(const MaskPosition::Ptr& object) const { Poll::Ptr TgTypeParser::parseJsonAndGetPoll(const ptree& data) const { auto result(make_shared<Poll>()); - result->id = data.get("id", 0); - result->question = data.get("question", ""); + result->id = data.get<string>("id", ""); + result->question = data.get<string>("question", ""); result->options = parseJsonAndGetArray<PollOption>(&TgTypeParser::parseJsonAndGetPollOption, data, "options"); - result->totalVoterCount = data.get("total_voter_count", 0); - result->isClosed = data.get<bool>("is_closed"); - result->isAnonymous = data.get<bool>("is_anonymous"); - result->type = data.get("type", ""); - result->allowsMultipleAnswers = data.get<bool>("allows_multiple_answers"); - result->correctOptionId = data.get("correct_option_id", 0); + result->totalVoterCount = data.get<int32_t>("total_voter_count", 0); + result->isClosed = data.get<bool>("is_closed", false); + result->isAnonymous = data.get<bool>("is_anonymous", true); + result->type = data.get<string>("type", ""); + result->allowsMultipleAnswers = data.get<bool>("allows_multiple_answers", false); + result->correctOptionId = data.get<int32_t>("correct_option_id", 0); + result->explanation = data.get<string>("explanation", ""); + result->explanationEntities = parseJsonAndGetArray<MessageEntity>(&TgTypeParser::parseJsonAndGetMessageEntity, data, "explanation_entities"); + result->openPeriod = data.get<int32_t>("open_period", 0); + result->closeDate = data.get<int64_t>("close_date", 0); return result; } @@ -453,6 +454,10 @@ string TgTypeParser::parsePoll(const Poll::Ptr& object) const { appendToJson(result, "type", object->type); appendToJson(result, "allows_multiple_answers", object->allowsMultipleAnswers); appendToJson(result, "correct_option_id", object->correctOptionId); + appendToJson(result, "explanation", object->correctOptionId); + appendToJson(result, "explanation_entities", parseArray(&TgTypeParser::parseMessageEntity, object->explanationEntities)); + appendToJson(result, "open_period", object->openPeriod); + appendToJson(result, "close_date", object->closeDate); removeLastComma(result); result += '}'; return result; @@ -460,7 +465,8 @@ string TgTypeParser::parsePoll(const Poll::Ptr& object) const { Dice::Ptr TgTypeParser::parseJsonAndGetDice(const ptree& data) const { auto result(make_shared<Dice>()); - result->value = data.get("value", 0); + result->emoji = data.get<string>("emoji", ""); + result->value = data.get<int8_t>("value", 0); return result; } @@ -470,6 +476,7 @@ string TgTypeParser::parseDice(const Dice::Ptr& object) const { } string result; result += '{'; + appendToJson(result, "emoji", object->emoji); appendToJson(result, "value", object->value); removeLastComma(result); result += '}'; @@ -478,12 +485,11 @@ string TgTypeParser::parseDice(const Dice::Ptr& object) const { PollAnswer::Ptr TgTypeParser::parseJsonAndGetPollAnswer(const ptree& data) const { auto result(make_shared<PollAnswer>()); - result->pollId = data.get("poll_id", ""); + result->pollId = data.get<string>("poll_id", ""); result->user = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "user"); result->optionIds = parseJsonAndGetArray<std::int32_t>([] (const ptree& innerData)->std::int32_t { return innerData.get<std::int32_t>(0); }, data, "option_ids"); - return result; } @@ -557,14 +563,14 @@ string TgTypeParser::parseChatPermissions(const ChatPermissions::Ptr& object) co Video::Ptr TgTypeParser::parseJsonAndGetVideo(const ptree& data) const { auto result(make_shared<Video>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); - result->width = data.get<int32_t>("width"); - result->height = data.get<int32_t>("height"); - result->duration = data.get<int32_t>("duration"); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); + result->width = data.get<int32_t>("width", 0); + result->height = data.get<int32_t>("height", 0); + result->duration = data.get<int32_t>("duration", 0); result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); - result->mimeType = data.get("mime_type", ""); - result->fileSize = data.get("file_size", 0); + result->mimeType = data.get<string>("mime_type", ""); + result->fileSize = data.get<int32_t>("file_size", 0); return result; } @@ -589,11 +595,11 @@ string TgTypeParser::parseVideo(const Video::Ptr& object) const { Voice::Ptr TgTypeParser::parseJsonAndGetVoice(const ptree& data) const { auto result(make_shared<Voice>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); - result->duration = data.get<int32_t>("duration"); - result->mimeType = data.get("mime_type", ""); - result->fileSize = data.get("file_size", 0); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); + result->duration = data.get<int32_t>("duration", 0); + result->mimeType = data.get<string>("mime_type", ""); + result->fileSize = data.get<int32_t>("file_size", 0); return result; } @@ -615,10 +621,10 @@ string TgTypeParser::parseVoice(const Voice::Ptr& object) const { VideoNote::Ptr TgTypeParser::parseJsonAndGetVideoNote(const ptree& data) const { auto result(make_shared<VideoNote>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); - result->length = data.get<int32_t>("length"); - result->duration = data.get<int32_t>("duration"); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); + result->length = data.get<int32_t>("length", 0); + result->duration = data.get<int32_t>("duration", 0); result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); result->fileSize = data.get("file_size", 0); return result; @@ -636,8 +642,8 @@ string TgTypeParser::parseVideoNote(const VideoNote::Ptr& object) const { appendToJson(result, "duration", object->duration); appendToJson(result, "thumb", parsePhotoSize(object->thumb)); appendToJson(result, "file_size", object->fileSize); + removeLastComma(result); result += '}'; - result.erase(); return result; } @@ -693,14 +699,14 @@ string TgTypeParser::parseGameHighScore(const GameHighScore::Ptr& object) const Animation::Ptr TgTypeParser::parseJsonAndGetAnimation(const ptree& data) const { auto result(make_shared<Animation>()); - result->fileId = data.get("file_id", ""); - result->fileUniqueId = data.get("file_unique_id", ""); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); result->width = data.get<int32_t>("width", 0); result->height = data.get<int32_t>("height", 0); result->duration = data.get<int32_t>("duration", 0); result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); - result->fileName = data.get("file_name", ""); - result->mimeType = data.get("mime_type", ""); + result->fileName = data.get<string>("file_name", ""); + result->mimeType = data.get<string>("mime_type", ""); result->fileSize = data.get<int32_t>("file_size", 0); return result; } @@ -778,7 +784,6 @@ Venue::Ptr TgTypeParser::parseJsonAndGetVenue(const ptree& data) const { result->address = data.get<string>("address", ""); result->foursquareId = data.get<string>("foursquare_id", ""); result->foursquareType = data.get<string>("foursquare_type", ""); - return result; } @@ -800,7 +805,7 @@ string TgTypeParser::parseVenue(const Venue::Ptr& object) const { Update::Ptr TgTypeParser::parseJsonAndGetUpdate(const ptree& data) const { auto result(make_shared<Update>()); - result->updateId = data.get<int32_t>("update_id"); + result->updateId = data.get<int32_t>("update_id", 0); result->message = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "message"); result->editedMessage = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "edited_message"); result->channelPost = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "channel_post"); @@ -961,10 +966,10 @@ string TgTypeParser::parseInputMedia(const InputMedia::Ptr& object) const { return result; } -File::Ptr TgTypeParser::parseJsonAndGetFile(const boost::property_tree::ptree& data) const { +File::Ptr TgTypeParser::parseJsonAndGetFile(const ptree& data) const { auto result(make_shared<File>()); - result->fileId = data.get<string>("file_id"); - result->fileUniqueId = data.get<string>("file_unique_id"); + result->fileId = data.get<string>("file_id", ""); + result->fileUniqueId = data.get<string>("file_unique_id", ""); result->fileSize = data.get<int32_t>("file_size", 0); result->filePath = data.get<string>("file_path", ""); return result; @@ -1023,17 +1028,16 @@ std::string TgTypeParser::parseReplyKeyboardMarkup(const ReplyKeyboardMarkup::Pt return result; } -KeyboardButton::Ptr TgTypeParser::parseJsonAndGetKeyboardButton(const boost::property_tree::ptree& data) const { +KeyboardButton::Ptr TgTypeParser::parseJsonAndGetKeyboardButton(const ptree& data) const { auto result(make_shared<KeyboardButton>()); - result->text = data.get<string>("text"); + result->text = data.get<string>("text", ""); result->requestContact = data.get<bool>("request_contact", false); result->requestLocation = data.get<bool>("request_location", false); result->requestPoll = tryParseJson<KeyboardButtonPollType>(&TgTypeParser::parseJsonAndGetKeyboardButtonPollType, data, "request_poll"); - return result; } -std::string TgTypeParser::parseKeyboardButton(const KeyboardButton::Ptr& object) const { +string TgTypeParser::parseKeyboardButton(const KeyboardButton::Ptr& object) const { if (!object) { return ""; } @@ -1050,7 +1054,7 @@ std::string TgTypeParser::parseKeyboardButton(const KeyboardButton::Ptr& object) KeyboardButtonPollType::Ptr TgTypeParser::parseJsonAndGetKeyboardButtonPollType(const ptree& data) const { auto result(make_shared<KeyboardButtonPollType>()); - result->type = data.get<string>("type"); + result->type = data.get<string>("type", ""); return result; } @@ -1104,11 +1108,11 @@ std::string TgTypeParser::parseForceReply(const ForceReply::Ptr& object) const { return result; } -ChatMember::Ptr TgTypeParser::parseJsonAndGetChatMember(const boost::property_tree::ptree& data) const { +ChatMember::Ptr TgTypeParser::parseJsonAndGetChatMember(const ptree& data) const { auto result(make_shared<ChatMember>()); result->user = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "user"); - result->status = data.get("status", ""); - result->customTitle = data.get("custom_title", ""); + result->status = data.get<string>("status", ""); + result->customTitle = data.get<string>("custom_title", ""); result->untilDate = data.get<uint64_t>("until_date", 0); result->canBeEdited = data.get<bool>("can_be_edited", false); result->canPostMessages = data.get<bool>("can_post_messages", false); @@ -1128,7 +1132,7 @@ ChatMember::Ptr TgTypeParser::parseJsonAndGetChatMember(const boost::property_tr return result; } -std::string TgTypeParser::parseChatMember(const ChatMember::Ptr& object) const { +string TgTypeParser::parseChatMember(const ChatMember::Ptr& object) const { if (!object) { return ""; } @@ -1158,16 +1162,16 @@ std::string TgTypeParser::parseChatMember(const ChatMember::Ptr& object) const { return result; } -ChatPhoto::Ptr TgTypeParser::parseJsonAndGetChatPhoto(const boost::property_tree::ptree& data) const { +ChatPhoto::Ptr TgTypeParser::parseJsonAndGetChatPhoto(const ptree& data) const { auto result(make_shared<ChatPhoto>()); - result->smallFileId = data.get("small_file_id", ""); - result->smallFileUniqueId = data.get("small_file_unique_id", ""); - result->bigFileId = data.get("big_file_id", ""); - result->bigFileUniqueId = data.get("big_file_unique_id", ""); + result->smallFileId = data.get<string>("small_file_id", ""); + result->smallFileUniqueId = data.get<string>("small_file_unique_id", ""); + result->bigFileId = data.get<string>("big_file_id", ""); + result->bigFileUniqueId = data.get<string>("big_file_unique_id", ""); return result; } -std::string TgTypeParser::parseChatPhoto(const ChatPhoto::Ptr& object) const { +string TgTypeParser::parseChatPhoto(const ChatPhoto::Ptr& object) const { if (!object) { return ""; } @@ -1258,8 +1262,8 @@ std::string TgTypeParser::parseInlineQuery(const InlineQuery::Ptr& object) const return result; } -InlineQueryResult::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult(const boost::property_tree::ptree& data) const { - string type = data.get<string>("type"); +InlineQueryResult::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult(const ptree& data) const { + string type = data.get<string>("type", ""); InlineQueryResult::Ptr result; if (type == InlineQueryResultCachedAudio::TYPE) { @@ -1306,26 +1310,27 @@ InlineQueryResult::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult(const boos result = make_shared<InlineQueryResult>(); } - result->id = data.get<string>("id"); + result->id = data.get<string>("id", ""); result->title = data.get<string>("title", ""); result->caption = data.get<string>("caption", ""); + result->parseMode = data.get<string>("parse_mode", ""); result->replyMarkup = tryParseJson<InlineKeyboardMarkup>(&TgTypeParser::parseJsonAndGetInlineKeyboardMarkup, data, "reply_markup"); result->inputMessageContent = tryParseJson<InputMessageContent>(&TgTypeParser::parseJsonAndGetInputMessageContent, data, "input_message_content"); return result; } -std::string TgTypeParser::parseInlineQueryResult(const InlineQueryResult::Ptr& object) const { +string TgTypeParser::parseInlineQueryResult(const InlineQueryResult::Ptr& object) const { if (!object){ return ""; } - string result; result += '{'; appendToJson(result, "id", object->id); appendToJson(result, "type", object->type); appendToJson(result, "title", object->title); appendToJson(result, "caption", object->caption); + appendToJson(result, "parse_mode", object->parseMode); appendToJson(result, "reply_markup", parseInlineKeyboardMarkup(object->replyMarkup)); appendToJson(result, "input_message_content", parseInputMessageContent(object->inputMessageContent)); @@ -1396,7 +1401,7 @@ std::string TgTypeParser::parseInlineQueryResult(const InlineQueryResult::Ptr& o } InlineQueryResultCachedAudio::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedAudio(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedAudio>()); result->audioFileId = data.get<string>("audio_file_id"); return result; @@ -1415,7 +1420,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedAudio(const InlineQueryRes } InlineQueryResultCachedDocument::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedDocument(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedDocument>()); result->documentFileId = data.get<string>("document_file_id"); result->description = data.get<string>("description", ""); @@ -1437,7 +1442,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedDocument(const InlineQuery InlineQueryResultCachedGif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedGif(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedGif>()); result->gifFileId = data.get<string>("gif_file_id"); return result; @@ -1457,7 +1462,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedGif(const InlineQueryResul InlineQueryResultCachedMpeg4Gif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedMpeg4Gif(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedMpeg4Gif>()); result->mpeg4FileId = data.get<string>("mpeg4_file_id"); return result; @@ -1477,7 +1482,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedMpeg4Gif(const InlineQuery InlineQueryResultCachedPhoto::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedPhoto(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedPhoto>()); result->photoFileId = data.get<string>("photo_file_id"); result->description = data.get<string>("description", ""); @@ -1499,7 +1504,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedPhoto(const InlineQueryRes InlineQueryResultCachedSticker::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedSticker(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedSticker>()); result->stickerFileId = data.get<string>("sticker_file_id"); return result; @@ -1518,7 +1523,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedSticker(const InlineQueryR } InlineQueryResultCachedVideo::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedVideo(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedVideo>()); result->videoFileId = data.get<string>("video_file_id"); result->description = data.get<string>("description", ""); @@ -1540,7 +1545,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedVideo(const InlineQueryRes InlineQueryResultCachedVoice::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCachedVoice(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultCachedVoice>()); result->voiceFileId = data.get<string>("voice_file_id"); return result; @@ -1559,7 +1564,7 @@ std::string TgTypeParser::parseInlineQueryResultCachedVoice(const InlineQueryRes } InlineQueryResultArticle::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultArticle(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultArticle>()); result->url = data.get<string>("url", ""); result->hideUrl = data.get("hide_url", false); @@ -1588,7 +1593,7 @@ std::string TgTypeParser::parseInlineQueryResultArticle(const InlineQueryResultA } InlineQueryResultAudio::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultAudio(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultAudio>()); result->audioUrl = data.get<string>("audio_url"); result->performer = data.get<string>("performer", ""); @@ -1612,7 +1617,7 @@ std::string TgTypeParser::parseInlineQueryResultAudio(const InlineQueryResultAud InlineQueryResultContact::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultContact(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultContact>()); result->phoneNumber = data.get<string>("phone_number"); result->firstName = data.get<string>("first_name"); @@ -1644,7 +1649,7 @@ std::string TgTypeParser::parseInlineQueryResultContact(const InlineQueryResultC InlineQueryResultGame::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultGame(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultGame>()); result->gameShortName = data.get<string>("game_short_name"); return result; @@ -1663,7 +1668,7 @@ std::string TgTypeParser::parseInlineQueryResultGame(const InlineQueryResultGame } InlineQueryResultDocument::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultDocument(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultDocument>()); result->documentUrl = data.get<string>("document_url"); result->mimeType = data.get<string>("mime_type"); @@ -1692,7 +1697,7 @@ std::string TgTypeParser::parseInlineQueryResultDocument(const InlineQueryResult } InlineQueryResultLocation::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultLocation(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultLocation>()); result->latitude = data.get<float>("latitude"); result->longitude = data.get<float>("longitude"); @@ -1720,7 +1725,7 @@ std::string TgTypeParser::parseInlineQueryResultLocation(const InlineQueryResult InlineQueryResultVenue::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVenue(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultVenue>()); result->latitude = data.get<float>("latitude"); result->longitude = data.get<float>("longitude"); @@ -1753,7 +1758,7 @@ std::string TgTypeParser::parseInlineQueryResultVenue(const InlineQueryResultVen } InlineQueryResultVoice::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVoice(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultVoice>()); result->voiceUrl = data.get<string>("voice_url"); result->voiceDuration = data.get<int32_t>("voice_duration", 0); @@ -1774,7 +1779,7 @@ std::string TgTypeParser::parseInlineQueryResultVoice(const InlineQueryResultVoi } InlineQueryResultPhoto::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultPhoto(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultPhoto>()); result->photoUrl = data.get<string>("photo_url", ""); result->thumbUrl = data.get<string>("thumb_url"); @@ -1800,17 +1805,19 @@ std::string TgTypeParser::parseInlineQueryResultPhoto(const InlineQueryResultPho return result; } -InlineQueryResultGif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultGif(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). +InlineQueryResultGif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultGif(const ptree& data) const { + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultGif>()); result->gifUrl = data.get<string>("gif_url", ""); - result->gifWidth = data.get("gif_width", 0); - result->gifHeight = data.get("gif_height", 0); - result->gifDuration = data.get("gif_duration", 0); - result->thumbUrl = data.get<string>("thumb_url"); + result->gifWidth = data.get<int32_t>("gif_width", 0); + result->gifHeight = data.get<int32_t>("gif_height", 0); + result->gifDuration = data.get<int32_t>("gif_duration", 0); + result->thumbUrl = data.get<string>("thumb_url", ""); + result->thumbMimeType = data.get<string>("thumb_mime_type", ""); return result; } -std::string TgTypeParser::parseInlineQueryResultGif(const InlineQueryResultGif::Ptr& object) const { + +string TgTypeParser::parseInlineQueryResultGif(const InlineQueryResultGif::Ptr& object) const { if (!object){ return ""; } @@ -1822,18 +1829,20 @@ std::string TgTypeParser::parseInlineQueryResultGif(const InlineQueryResultGif:: appendToJson(result, "gif_height", object->gifHeight); appendToJson(result, "gif_duration", object->gifDuration); appendToJson(result, "thumb_url", object->thumbUrl); + appendToJson(result, "thumb_mime_type", object->thumbMimeType); // The last comma will be erased by parseInlineQueryResult(). return result; } -InlineQueryResultMpeg4Gif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultMpeg4Gif(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). +InlineQueryResultMpeg4Gif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultMpeg4Gif(const ptree& data) const { + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultMpeg4Gif>()); - result->mpeg4Url = data.get<string>("mpeg4_url"); - result->mpeg4Width = data.get("mpeg4_width", 0); - result->mpeg4Height = data.get("mpeg4_height", 0); - result->mpeg4Duration = data.get("mpeg4_duration", 0); - result->thumbUrl = data.get<string>("thumb_url"); + result->mpeg4Url = data.get<string>("mpeg4_url", ""); + result->mpeg4Width = data.get<int32_t>("mpeg4_width", 0); + result->mpeg4Height = data.get<int32_t>("mpeg4_height", 0); + result->mpeg4Duration = data.get<int32_t>("mpeg4_duration", 0); + result->thumbUrl = data.get<string>("thumb_url", ""); + result->thumbMimeType = data.get<string>("thumb_mime_type", ""); return result; } @@ -1849,12 +1858,13 @@ std::string TgTypeParser::parseInlineQueryResultMpeg4Gif(const InlineQueryResult appendToJson(result, "mpeg4_height", object->mpeg4Height); appendToJson(result, "mpeg4_duration", object->mpeg4Duration); appendToJson(result, "thumb_url", object->thumbUrl); + appendToJson(result, "thumb_mime_type", object->thumbMimeType); // The last comma will be erased by parseInlineQueryResult(). return result; } InlineQueryResultVideo::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVideo(const boost::property_tree::ptree& data) const { - // NOTE: This function will be called by parseJsonAndGgetInlineQueryResult(). + // NOTE: This function will be called by parseJsonAndGetInlineQueryResult(). auto result(make_shared<InlineQueryResultVideo>()); result->videoUrl = data.get<string>("video_url"); result->mimeType = data.get<string>("mime_type"); |