diff options
author | Oleg Morozenkov <omorozenkov@gmail.com> | 2018-07-31 04:40:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-31 04:40:43 +0300 |
commit | 5a1bcfdddecaba039e458c957f79ecc60d12a5fb (patch) | |
tree | 17df84fbd12907fa3b668446eaebb5e0cd4b78d8 /src | |
parent | 90140927a052f55c633a976c6c404ac284d647a4 (diff) | |
parent | 6d1a96043c63f346b03df4c54d8200bc320ebe3e (diff) |
Merge pull request #78 from JellyBrick/master
Bot API 4.0
Diffstat (limited to 'src')
-rw-r--r-- | src/Api.cpp | 351 | ||||
-rw-r--r-- | src/TgTypeParser.cpp | 120 | ||||
-rw-r--r-- | src/net/HttpParser.cpp | 2 |
3 files changed, 240 insertions, 233 deletions
diff --git a/src/Api.cpp b/src/Api.cpp index 08f5fac..6b41947 100644 --- a/src/Api.cpp +++ b/src/Api.cpp @@ -75,34 +75,16 @@ Message::Ptr Api::forwardMessage(int64_t chatId, int64_t fromChatId, int32_t mes return _tgTypeParser.parseJsonAndGetMessage(sendRequest("forwardMessage", args)); } -Message::Ptr Api::sendPhoto(int64_t chatId, const InputFile::Ptr photo, const string& caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendPhoto(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> photo, const string& caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(7); args.emplace_back("chat_id", chatId); - args.emplace_back("photo", photo->data, true, photo->mimeType, photo->fileName); - if (!caption.empty()) { - args.emplace_back("caption", caption); - } - 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); + if (photo.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(photo); + args.emplace_back("photo", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("photo", boost::get<std::string>(photo)); } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendPhoto", args)); -} - -Message::Ptr Api::sendPhoto(int64_t chatId, const string& photoId, const string& caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(7); - args.emplace_back("chat_id", chatId); - args.emplace_back("photo", photoId); if (!caption.empty()) { args.emplace_back("caption", caption); } @@ -121,43 +103,16 @@ Message::Ptr Api::sendPhoto(int64_t chatId, const string& photoId, const string& return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendPhoto", args)); } -Message::Ptr Api::sendAudio(int64_t chatId, const InputFile::Ptr audio, const string &caption, int32_t duration, const string& performer, const string& title, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendAudio(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> audio, const string &caption, int32_t duration, const string& performer, const string& title, const boost::variant<InputFile::Ptr, std::string> thumb, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; - args.reserve(10); + args.reserve(11); args.emplace_back("chat_id", chatId); - args.emplace_back("audio", audio->data, true, audio->mimeType, audio->fileName); - if (!caption.empty()) { - args.emplace_back("caption", caption); + if (audio.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(audio); + args.emplace_back("audio", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("audio", boost::get<std::string>(audio)); } - if (duration) { - args.emplace_back("duration", duration); - } - if (!performer.empty()){ - args.emplace_back("performer", performer); - } - if (!title.empty()){ - args.emplace_back("title", title); - } - 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("sendAudio", args)); -} - -Message::Ptr Api::sendAudio(int64_t chatId, const string& audioId, const string &caption, int32_t duration, const string& performer, const string& title, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(10); - args.emplace_back("chat_id", chatId); - args.emplace_back("audio", audioId); if (!caption.empty()) { args.emplace_back("caption", caption); } @@ -170,6 +125,15 @@ Message::Ptr Api::sendAudio(int64_t chatId, const string& audioId, const string if (!title.empty()){ args.emplace_back("title", title); } + 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 */ { + auto thumbStr = boost::get<std::string>(thumb); + if (!thumbStr.empty()) { + args.emplace_back("thumb", thumbStr); + } + } if (replyToMessageId) { args.emplace_back("reply_to_message_id", replyToMessageId); } @@ -185,34 +149,25 @@ Message::Ptr Api::sendAudio(int64_t chatId, const string& audioId, const string return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendAudio", args)); } -Message::Ptr Api::sendDocument(int64_t chatId, const InputFile::Ptr document, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendDocument(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> document, const boost::variant<InputFile::Ptr, std::string> thumb, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; - args.reserve(7); + args.reserve(8); args.emplace_back("chat_id", chatId); - args.emplace_back("document", document->data, true, document->mimeType, document->fileName); - if (!caption.empty()) { - args.emplace_back("caption", caption); - } - 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); + if (document.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(document); + args.emplace_back("document", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("document", boost::get<std::string>(document)); + } + 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 */ { + auto thumbStr = boost::get<std::string>(thumb); + if (!thumbStr.empty()) { + args.emplace_back("thumb", thumbStr); + } } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendDocument", args)); -} - -Message::Ptr Api::sendDocument(int64_t chatId, const string& document, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(7); - args.emplace_back("chat_id", chatId); - args.emplace_back("document", document); if (!caption.empty()) { args.emplace_back("caption", caption); } @@ -321,28 +276,16 @@ bool Api::answerPreCheckoutQuery(const std::string& preCheckoutQueryId, bool ok, return sendRequest("answerPreCheckoutQuery", args).get<bool>("", false); } -Message::Ptr Api::sendSticker(int64_t chatId, const InputFile::Ptr sticker, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { +Message::Ptr Api::sendSticker(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> sticker, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(5); args.emplace_back("chat_id", chatId); - args.emplace_back("sticker", sticker->data, true, sticker->mimeType, sticker->fileName); - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); + 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 (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); - } - if (disableNotification){ - args.emplace_back("disable_notification", disableNotification); - } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendSticker", args)); -} - -Message::Ptr Api::sendSticker(int64_t chatId, const string& stickerId, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const { - vector<HttpReqArg> args; - args.reserve(5); - args.emplace_back("chat_id", chatId); - args.emplace_back("sticker", stickerId); if (replyToMessageId) { args.emplace_back("reply_to_message_id", replyToMessageId); } @@ -370,30 +313,18 @@ File::Ptr Api::uploadStickerFile(int32_t userId, const InputFile::Ptr pngSticker return _tgTypeParser.parseJsonAndGetFile(sendRequest("uploadStickerFile", args)); } -bool Api::createNewStickerSet(int32_t userId, const string& name, const string& title, InputFile::Ptr pngSticker, const string& emojis, bool containsMasks, MaskPosition::Ptr maskPosition) const { +bool Api::createNewStickerSet(int32_t userId, const string& name, const string& title, const boost::variant<InputFile::Ptr, std::string> pngSticker, const string& emojis, bool containsMasks, MaskPosition::Ptr maskPosition) const { vector<HttpReqArg> args; args.reserve(7); args.emplace_back("user_id", userId); args.emplace_back("name", name); args.emplace_back("title", title); - args.emplace_back("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName); - args.emplace_back("emojis", emojis); - if (containsMasks) { - args.emplace_back("contains_mask", containsMasks); + 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 (maskPosition != nullptr) { - args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); - } - return sendRequest("createNewStickerSet", args).get<bool>("", false); -} - -bool Api::createNewStickerSet(int32_t userId, const string& name, const string& title, const string& pngSticker, const string& emojis, bool containsMasks, MaskPosition::Ptr maskPosition) const { - vector<HttpReqArg> args; - args.reserve(7); - args.emplace_back("user_id", userId); - args.emplace_back("name", name); - args.emplace_back("title", title); - args.emplace_back("png_sticker", pngSticker); args.emplace_back("emojis", emojis); if (containsMasks) { args.emplace_back("contains_mask", containsMasks); @@ -404,27 +335,18 @@ bool Api::createNewStickerSet(int32_t userId, const string& name, const string& return sendRequest("createNewStickerSet", args).get<bool>("", false); } -bool Api::addStickerToSet(int32_t userId, const string& name, const string& title, InputFile::Ptr pngSticker, const string& emojis, MaskPosition::Ptr maskPosition) const { +bool Api::addStickerToSet(int32_t userId, const string& name, const string& title, const boost::variant<InputFile::Ptr, std::string> pngSticker, const string& emojis, MaskPosition::Ptr maskPosition) const { vector<HttpReqArg> args; args.reserve(6); args.emplace_back("user_id", userId); args.emplace_back("name", name); args.emplace_back("title", title); - args.emplace_back("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName); - args.emplace_back("emojis", emojis); - if (maskPosition != nullptr) { - args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); + 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)); } - return sendRequest("addStickerToSet", args).get<bool>("", false); -} - -bool Api::addStickerToSet(int32_t userId, const string& name, const string& title, const string& pngSticker, const string& emojis, MaskPosition::Ptr maskPosition) const { - vector<HttpReqArg> args; - args.reserve(6); - args.emplace_back("user_id", userId); - args.emplace_back("name", name); - args.emplace_back("title", title); - args.emplace_back("png_sticker", pngSticker); args.emplace_back("emojis", emojis); if (maskPosition != nullptr) { args.emplace_back("mask_position", _tgTypeParser.parseMaskPosition(maskPosition)); @@ -447,11 +369,16 @@ bool Api::deleteStickerPositionInSet(const string& sticker) const { return sendRequest("setStickerPositionInSet", args).get<bool>("", false); } -Message::Ptr Api::sendVideo(int64_t chatId, const InputFile::Ptr video, bool supportsStreaming, int32_t duration, int32_t width, int32_t height, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendVideo(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> video, bool supportsStreaming, int32_t duration, int32_t width, int32_t height, const boost::variant<InputFile::Ptr, std::string> thumb, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; - args.reserve(11); + args.reserve(12); args.emplace_back("chat_id", chatId); - args.emplace_back("video", video->data, true, video->mimeType, video->fileName); + if (video.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(video); + args.emplace_back("video", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("video", boost::get<std::string>(video)); + } if (supportsStreaming) { args.emplace_back("supports_streaming", supportsStreaming); } @@ -464,6 +391,15 @@ Message::Ptr Api::sendVideo(int64_t chatId, const InputFile::Ptr video, bool sup if (height) { args.emplace_back("height", height); } + 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 */ { + auto thumbStr = boost::get<std::string>(thumb); + if (!thumbStr.empty()) { + args.emplace_back("thumb", thumbStr); + } + } if (!caption.empty()) { args.emplace_back("caption", caption); } @@ -482,13 +418,15 @@ Message::Ptr Api::sendVideo(int64_t chatId, const InputFile::Ptr video, bool sup return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVideo", args)); } -Message::Ptr Api::sendVideo(int64_t chatId, const string& videoId, bool supportsStreaming, int32_t duration, int32_t width, int32_t height, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendAnimation(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> animation, int32_t duration, int32_t width, int32_t height, const boost::variant<InputFile::Ptr, std::string> thumb, const string& caption, int32_t replyToMessageId, GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { vector<HttpReqArg> args; args.reserve(11); args.emplace_back("chat_id", chatId); - args.emplace_back("video", videoId); - if (supportsStreaming) { - args.emplace_back("supports_streaming", supportsStreaming); + if (animation.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(animation); + args.emplace_back("animation", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("animation", boost::get<std::string>(animation)); } if (duration) { args.emplace_back("duration", duration); @@ -499,6 +437,15 @@ Message::Ptr Api::sendVideo(int64_t chatId, const string& videoId, bool supports if (height) { args.emplace_back("height", height); } + 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 */ { + auto thumbStr = boost::get<std::string>(thumb); + if (!thumbStr.empty()) { + args.emplace_back("thumb", thumbStr); + } + } if (!caption.empty()) { args.emplace_back("caption", caption); } @@ -514,37 +461,19 @@ Message::Ptr Api::sendVideo(int64_t chatId, const string& videoId, bool supports if (disableNotification){ args.emplace_back("disable_notification", disableNotification); } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVideo", args)); + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendAnimation", args)); } -Message::Ptr Api::sendVideoNote(int64_t chatId, const InputFile::Ptr videoNote, int64_t replyToMessageId, bool disableNotification, int32_t duration, int32_t length, const GenericReply::Ptr replyMarkup) { +Message::Ptr Api::sendVideoNote(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> videoNote, int64_t replyToMessageId, bool disableNotification, int32_t duration, int32_t length, const boost::variant<InputFile::Ptr, std::string> thumb, const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; - args.reserve(7); + args.reserve(8); args.emplace_back("chat_id", chatId); - args.emplace_back("video_note", videoNote); - if (disableNotification) { - args.emplace_back("disable_notification", disableNotification); - } - if (duration) { - args.emplace_back("duration", duration); - } - if (length) { - args.emplace_back("length", length); - } - if (replyMarkup) { - args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + if (videoNote.which() == 0 /* InputFile::Ptr */) { + auto file = boost::get<InputFile::Ptr>(videoNote); + args.emplace_back("video_note", file->data, true, file->mimeType, file->fileName); + } else /* std::string */ { + args.emplace_back("video_note", boost::get<std::string>(videoNote)); } - if (replyToMessageId) { - args.emplace_back("reply_to_message_id", replyToMessageId); - } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVoiceNote", args)); -} - -Message::Ptr Api::sendVideoNote(int64_t chatId, const string &videoNote, int64_t replyToMessageId, bool disableNotification, int32_t duration, int32_t length, const GenericReply::Ptr replyMarkup) { - vector<HttpReqArg> args; - args.reserve(7); - args.emplace_back("chat_id", chatId); - args.emplace_back("video_note", videoNote); if (disableNotification) { args.emplace_back("disable_notification", disableNotification); } @@ -554,13 +483,22 @@ Message::Ptr Api::sendVideoNote(int64_t chatId, const string &videoNote, int64_t if (length) { args.emplace_back("length", length); } + 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 */ { + auto thumbStr = boost::get<std::string>(thumb); + if (!thumbStr.empty()) { + args.emplace_back("thumb", thumbStr); + } + } if (replyMarkup) { args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); } if (replyToMessageId) { args.emplace_back("reply_to_message_id", replyToMessageId); } - return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVoiceNote", args)); + return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVideoNote", args)); } vector<Message::Ptr> Api::sendMediaGroup(int64_t chatId, const vector<InputMedia::Ptr>& media, bool disableNotification, int32_t replyToMessageId) const { @@ -574,37 +512,16 @@ vector<Message::Ptr> Api::sendMediaGroup(int64_t chatId, const vector<InputMedia return _tgTypeParser.parseJsonAndGetArray<Message>(&TgTypeParser::parseJsonAndGetMessage, sendRequest("sendMediaGroup", args)); } -Message::Ptr Api::sendVoice(int64_t chatId, const InputFile::Ptr voice, const string &caption, int duration, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, const string& parseMode, bool disableNotification) const { +Message::Ptr Api::sendVoice(int64_t chatId, const boost::variant<InputFile::Ptr, std::string> voice, const string &caption, int duration, 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); - args.emplace_back("voice", voice->data, true, voice->mimeType, voice->fileName); - if (!caption.empty()) { - args.emplace_back("caption", caption); + 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 (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::sendVoice(int64_t chatId, const string& voiceId, const string &caption, int duration, 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); - args.emplace_back("voice", voiceId); if (!caption.empty()) { args.emplace_back("caption", caption); } @@ -717,9 +634,9 @@ bool Api::deleteChatStickerSet(int64_t chatId) const { return sendRequest("deleteChatStickerSet", args).get<bool>("", false); } -Message::Ptr Api::sendVenue(int64_t chatId, float latitude, float longitude, const string& title, const string& address, const string& foursquareId, bool disableNotification, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const { +Message::Ptr Api::sendVenue(int64_t chatId, float latitude, float longitude, const string& title, const string& address, const string& foursquareId, const string& foursquareType, bool disableNotification, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; - args.reserve(9); + args.reserve(10); args.emplace_back("chat_id", chatId); args.emplace_back("latitude", latitude); args.emplace_back("longitude", longitude); @@ -728,6 +645,9 @@ Message::Ptr Api::sendVenue(int64_t chatId, float latitude, float longitude, con if (!foursquareId.empty()) { args.emplace_back("foursquare_id", foursquareId); } + if (!foursquareType.empty()) { + args.emplace_back("foursquare_type", foursquareType); + } if (replyToMessageId) { args.emplace_back("reply_to_message_id", replyToMessageId); } @@ -740,13 +660,18 @@ Message::Ptr Api::sendVenue(int64_t chatId, float latitude, float longitude, con return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendVenue", args)); } -Message::Ptr Api::sendContact(int64_t chatId, const string& phoneNumber, const string& firstName, const string& lastName, bool disableNotification, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const { +Message::Ptr Api::sendContact(int64_t chatId, const string& phoneNumber, const string& firstName, const string& lastName, const string& vcard, bool disableNotification, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const { vector<HttpReqArg> args; - args.reserve(7); + args.reserve(8); args.emplace_back("chat_id", chatId); args.emplace_back("phone_number", phoneNumber); args.emplace_back("first_name", firstName); - args.emplace_back("last_name", lastName); + if (!lastName.empty()) { + args.emplace_back("last_name", lastName); + } + if (!vcard.empty()) { + args.emplace_back("vcard", vcard); + } if (replyToMessageId) { args.emplace_back("reply_to_message_id", replyToMessageId); } @@ -918,6 +843,32 @@ Message::Ptr Api::editMessageReplyMarkup(int64_t chatId, int32_t messageId, cons } } +Message::Ptr Api::editMessageMedia(InputMedia::Ptr media, int64_t chatId, int32_t messageId, const std::string& inlineMessageId, + GenericReply::Ptr replyMarkup) const { + + vector<HttpReqArg> args; + args.reserve(5); + args.emplace_back("media", _tgTypeParser.parseInputMedia(media)); + if (chatId) { + args.emplace_back("chat_id", chatId); + } + if (messageId) { + args.emplace_back("message_id", messageId); + } + if (!inlineMessageId.empty()) { + args.emplace_back("inline_message_id", inlineMessageId); + } + if (replyMarkup) { + args.emplace_back("reply_markup", _tgTypeParser.parseGenericReply(replyMarkup)); + } + ptree p = sendRequest("editMessageMedia", args); + if (p.get_child_optional("message_id")) { + return _tgTypeParser.parseJsonAndGetMessage(p); + } else { + return nullptr; + } +} + ChatMember::Ptr Api::getChatMember(int64_t chatId, int32_t userId) const { vector<HttpReqArg> args; args.reserve(2); diff --git a/src/TgTypeParser.cpp b/src/TgTypeParser.cpp index dbfb266..ad200b3 100644 --- a/src/TgTypeParser.cpp +++ b/src/TgTypeParser.cpp @@ -153,6 +153,7 @@ Message::Ptr TgTypeParser::parseJsonAndGetMessage(const ptree& data) const { result->captionEntities = parseJsonAndGetArray<MessageEntity>(&TgTypeParser::parseJsonAndGetMessageEntity, data, "caption_entities"); result->audio = tryParseJson<Audio>(&TgTypeParser::parseJsonAndGetAudio, data, "audio"); result->document = tryParseJson<Document>(&TgTypeParser::parseJsonAndGetDocument, data, "document"); + result->animation = tryParseJson<Animation>(&TgTypeParser::parseJsonAndGetAnimation, data, "animation"); result->game = tryParseJson<Game>(&TgTypeParser::parseJsonAndGetGame, data, "game"); result->photo = parseJsonAndGetArray<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "photo"); result->sticker = tryParseJson<Sticker>(&TgTypeParser::parseJsonAndGetSticker, data, "sticker"); @@ -199,6 +200,7 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const { appendToJson(result, "text", object->text); appendToJson(result, "audio", parseAudio(object->audio)); appendToJson(result, "document", parseDocument(object->document)); + appendToJson(result, "animation", parseAnimation(object->animation)); appendToJson(result, "photo", parseArray(&TgTypeParser::parsePhotoSize, object->photo)); appendToJson(result, "sticker", parseSticker(object->sticker)); appendToJson(result, "video", parseVideo(object->video)); @@ -257,6 +259,7 @@ Audio::Ptr TgTypeParser::parseJsonAndGetAudio(const ptree& data) const { result->title = data.get<string>("title", ""); result->mimeType = data.get("mime_type", ""); result->fileSize = data.get("file_size", 0); + result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb"); return result; } @@ -270,6 +273,7 @@ string TgTypeParser::parseAudio(const Audio::Ptr& object) const { appendToJson(result, "duration", object->duration); appendToJson(result, "mime_type", object->mimeType); appendToJson(result, "file_size", object->fileSize); + appendToJson(result, "thumb", parsePhotoSize(object->thumb)); removeLastComma(result); result += '}'; return result; @@ -517,6 +521,7 @@ Contact::Ptr TgTypeParser::parseJsonAndGetContact(const ptree& data) const { result->firstName = data.get<string>("first_name"); result->lastName = data.get("last_name", ""); result->userId = data.get("user_id", ""); + result->vcard = data.get("vcard", ""); return result; } @@ -530,6 +535,7 @@ string TgTypeParser::parseContact(const Contact::Ptr& object) const { appendToJson(result, "first_name", object->firstName); appendToJson(result, "last_name", object->lastName); appendToJson(result, "user_id", object->userId); + appendToJson(result, "vcard", object->vcard); removeLastComma(result); result += '}'; return result; @@ -618,6 +624,7 @@ InputMedia::Ptr TgTypeParser::parseJsonAndGetInputMedia(const ptree& data) const result->media = data.get("media", ""); result->caption = data.get("caption", ""); result->parseMode = data.get("parse_mode", ""); + result->thumb = data.get("thumb", ""); return result; } else if (type == "video") { @@ -625,12 +632,40 @@ InputMedia::Ptr TgTypeParser::parseJsonAndGetInputMedia(const ptree& data) const result->media = data.get("media", ""); result->caption = data.get("caption", ""); result->parseMode = data.get("parse_mode", ""); + result->thumb = data.get("thumb", ""); 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->supportsStreaming = data.get<bool>("supports_streaming", false); return result; } + else if (type == "animation") { + auto result(make_shared<InputMediaAnimation>()); + result->media = data.get("media", ""); + result->caption = data.get("caption", ""); + result->parseMode = data.get("parse_mode", ""); + result->thumb = data.get("thumb", ""); + result->width = data.get<int32_t>("width", 0); + result->height = data.get<int32_t>("height", 0); + result->duration = data.get<int32_t>("duration", 0); + return result; + } else if (type == "document") { + auto result(make_shared<InputMediaDocument>()); + result->media = data.get("media", ""); + result->caption = data.get("caption", ""); + result->parseMode = data.get("parse_mode", ""); + result->thumb = data.get("thumb", ""); + return result; + } else if (type == "audio") { + auto result(make_shared<InputMediaAudio>()); + result->media = data.get("media", ""); + result->caption = data.get("caption", ""); + result->parseMode = data.get("parse_mode", ""); + result->thumb = data.get("thumb", ""); + result->duration = data.get<int32_t>("duration", 0); + result->title = data.get<int32_t>("title", 0); + result->performer = data.get<int32_t>("performer", 0); + } else { return nullptr; } @@ -642,12 +677,23 @@ string TgTypeParser::parseInputMedia(const InputMedia::Ptr& object) const { } string result; result += '{'; - if (object->type == InputMedia::TYPE::PHOTO) { - appendToJson(result, "type", "photo"); - } - else { - appendToJson(result, "type", "video"); - } + switch(object->type) { + case InputMedia::TYPE::PHOTO: + appendToJson(result, "type", "photo"); + break; + case InputMedia::TYPE::VIDEO: + appendToJson(result, "type", "video"); + break; + case InputMedia::TYPE::ANIMATION: + appendToJson(result, "type", "animation"); + break; + case InputMedia::TYPE::DOCUMENT: + appendToJson(result, "type", "document"); + break; + case InputMedia::TYPE::AUDIO: + appendToJson(result, "type", "audio"); + break; + } appendToJson(result, "media", object->media); appendToJson(result, "caption", object->caption); appendToJson(result, "parse_mode", object->parseMode); @@ -660,6 +706,9 @@ string TgTypeParser::parseInputMedia(const InputMedia::Ptr& object) const { if (object->duration) { appendToJson(result, "duration", object->duration); } + if (object->performer) { + appendToJson(result, "performer", object->performer); + } if (object->supportsStreaming) { appendToJson(result, "supports_streaming", object->supportsStreaming); } @@ -1064,7 +1113,7 @@ InlineQueryResultCachedAudio::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult std::string TgTypeParser::parseInlineQueryResultCachedAudio(const InlineQueryResultCachedAudio::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1084,7 +1133,7 @@ InlineQueryResultCachedDocument::Ptr TgTypeParser::parseJsonAndGetInlineQueryRes std::string TgTypeParser::parseInlineQueryResultCachedDocument(const InlineQueryResultCachedDocument::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1105,7 +1154,7 @@ InlineQueryResultCachedGif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCa std::string TgTypeParser::parseInlineQueryResultCachedGif(const InlineQueryResultCachedGif::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1125,7 +1174,7 @@ InlineQueryResultCachedMpeg4Gif::Ptr TgTypeParser::parseJsonAndGetInlineQueryRes std::string TgTypeParser::parseInlineQueryResultCachedMpeg4Gif(const InlineQueryResultCachedMpeg4Gif::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1146,7 +1195,7 @@ InlineQueryResultCachedPhoto::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult std::string TgTypeParser::parseInlineQueryResultCachedPhoto(const InlineQueryResultCachedPhoto::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1167,7 +1216,7 @@ InlineQueryResultCachedSticker::Ptr TgTypeParser::parseJsonAndGetInlineQueryResu std::string TgTypeParser::parseInlineQueryResultCachedSticker(const InlineQueryResultCachedSticker::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1187,7 +1236,7 @@ InlineQueryResultCachedVideo::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult std::string TgTypeParser::parseInlineQueryResultCachedVideo(const InlineQueryResultCachedVideo::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1208,7 +1257,7 @@ InlineQueryResultCachedVoice::Ptr TgTypeParser::parseJsonAndGetInlineQueryResult std::string TgTypeParser::parseInlineQueryResultCachedVoice(const InlineQueryResultCachedVoice::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1232,7 +1281,7 @@ InlineQueryResultArticle::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultArti std::string TgTypeParser::parseInlineQueryResultArticle(const InlineQueryResultArticle::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1258,7 +1307,7 @@ InlineQueryResultAudio::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultAudio( std::string TgTypeParser::parseInlineQueryResultAudio(const InlineQueryResultAudio::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1277,6 +1326,7 @@ InlineQueryResultContact::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCont result->phoneNumber = data.get<string>("phone_number"); result->firstName = data.get<string>("first_name"); result->lastName = data.get<string>("last_name", ""); + result->vcard = data.get<string>("vcard", ""); result->thumbUrl = data.get<string>("thumb_url", ""); result->thumbWidth = data.get<int32_t>("thumb_width", 0); result->thumbHeight = data.get<int32_t>("thumb_height", 0); @@ -1285,7 +1335,7 @@ InlineQueryResultContact::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultCont std::string TgTypeParser::parseInlineQueryResultContact(const InlineQueryResultContact::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1293,6 +1343,7 @@ std::string TgTypeParser::parseInlineQueryResultContact(const InlineQueryResultC appendToJson(result, "phone_number", object->phoneNumber); appendToJson(result, "first_name", object->firstName); appendToJson(result, "last_name", object->lastName); + appendToJson(result, "vcard", object->vcard); appendToJson(result, "thumb_url", object->thumbUrl); appendToJson(result, "thumb_width", object->thumbWidth); appendToJson(result, "thumb_height", object->thumbHeight); @@ -1310,7 +1361,7 @@ InlineQueryResultGame::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultGame(co std::string TgTypeParser::parseInlineQueryResultGame(const InlineQueryResultGame::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1334,7 +1385,7 @@ InlineQueryResultDocument::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultDoc std::string TgTypeParser::parseInlineQueryResultDocument(const InlineQueryResultDocument::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1362,7 +1413,7 @@ InlineQueryResultLocation::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultLoc std::string TgTypeParser::parseInlineQueryResultLocation(const InlineQueryResultLocation::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1384,6 +1435,7 @@ InlineQueryResultVenue::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVenue( result->longitude = data.get<float>("longitude"); result->address = data.get<string>("address"); result->foursquareId = data.get<string>("foursquare_id", ""); + result->foursquareType = data.get<string>("foursquare_type", ""); result->thumbUrl = data.get<string>("thumb_url", ""); result->thumbWidth = data.get<int32_t>("thumb_width", 0); result->thumbHeight = data.get<int32_t>("thumb_height", 0); @@ -1392,7 +1444,7 @@ InlineQueryResultVenue::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVenue( std::string TgTypeParser::parseInlineQueryResultVenue(const InlineQueryResultVenue::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1401,6 +1453,7 @@ std::string TgTypeParser::parseInlineQueryResultVenue(const InlineQueryResultVen appendToJson(result, "longitude", object->longitude); appendToJson(result, "address", object->address); appendToJson(result, "foursquare_id", object->foursquareId); + appendToJson(result, "foursquare_type", object->foursquareType); appendToJson(result, "thumb_url", object->thumbUrl); appendToJson(result, "thumb_width", object->thumbWidth); appendToJson(result, "thumb_height", object->thumbHeight); @@ -1418,7 +1471,7 @@ InlineQueryResultVoice::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVoice( std::string TgTypeParser::parseInlineQueryResultVoice(const InlineQueryResultVoice::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1442,7 +1495,7 @@ InlineQueryResultPhoto::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultPhoto( std::string TgTypeParser::parseInlineQueryResultPhoto(const InlineQueryResultPhoto::Ptr& object) const{ if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1468,7 +1521,7 @@ InlineQueryResultGif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultGif(cons } std::string TgTypeParser::parseInlineQueryResultGif(const InlineQueryResultGif::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1495,7 +1548,7 @@ InlineQueryResultMpeg4Gif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultMpe std::string TgTypeParser::parseInlineQueryResultMpeg4Gif(const InlineQueryResultMpeg4Gif::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1524,7 +1577,7 @@ InlineQueryResultVideo::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultVideo( std::string TgTypeParser::parseInlineQueryResultVideo(const InlineQueryResultVideo::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInlineQueryResult(), so I don't add // curly brackets to the result string. @@ -1751,7 +1804,7 @@ InputTextMessageContent::Ptr TgTypeParser::parseJsonAndGetInputTextMessageConten std::string TgTypeParser::parseInputTextMessageContent(const InputTextMessageContent::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInputMessageContent() string result; @@ -1772,7 +1825,7 @@ InputLocationMessageContent::Ptr TgTypeParser::parseJsonAndGetInputLocationMessa std::string TgTypeParser::parseInputLocationMessageContent(const InputLocationMessageContent::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInputMessageContent() string result; @@ -1790,12 +1843,13 @@ InputVenueMessageContent::Ptr TgTypeParser::parseJsonAndGetInputVenueMessageCont result->title = data.get<string>("title"); result->address = data.get<string>("address"); result->foursquareId = data.get<string>("foursquare_id", ""); + result->foursquareType = data.get<string>("foursquare_type", ""); return result; } std::string TgTypeParser::parseInputVenueMessageContent(const InputVenueMessageContent::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInputMessageContent() string result; @@ -1814,18 +1868,20 @@ InputContactMessageContent::Ptr TgTypeParser::parseJsonAndGetInputContactMessage result->phoneNumber = data.get<string>("phone_number"); result->firstName = data.get<string>("first_name"); result->lastName = data.get<string>("last_name", ""); + result->vcard = data.get<string>("vcard", ""); return result; } std::string TgTypeParser::parseInputContactMessageContent(const InputContactMessageContent::Ptr& object) const { if (!object){ - return " "; + return ""; } // This function will be called by parseInputMessageContent() string result; appendToJson(result, "phone_number", object->phoneNumber); appendToJson(result, "first_name", object->firstName); appendToJson(result, "last_name", object->lastName); + appendToJson(result, "vcard", object->vcard); // The last comma will be erased by parseInputMessageContent(). return result; } @@ -1842,7 +1898,7 @@ Invoice::Ptr TgTypeParser::parseJsonAndGetInvoice(const boost::property_tree::pt std::string TgTypeParser::parseInvoice(const Invoice::Ptr& object) const { if (!object) { - return " "; + return ""; } string result; result += '{'; @@ -1884,7 +1940,7 @@ OrderInfo::Ptr TgTypeParser::parseJsonAndGetOrderInfo(const boost::property_tree string TgTypeParser::parseOrderInfo(const OrderInfo::Ptr& object) const { if (!object) { - return " "; + return ""; } std::string result; result += '{'; diff --git a/src/net/HttpParser.cpp b/src/net/HttpParser.cpp index 41dec14..c4f8215 100644 --- a/src/net/HttpParser.cpp +++ b/src/net/HttpParser.cpp @@ -100,7 +100,7 @@ string HttpParser::generateMultipartFormData(const vector<HttpReqArg>& args, con string HttpParser::generateMultipartBoundary(const vector<HttpReqArg>& args) const { string result; - srand((unsigned int) time(nullptr)); + srand((uint32_t) time(nullptr)); for (const HttpReqArg& item : args) { if (item.isFile) { while (result.empty() || item.value.find(result) != string::npos) { |