summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Api.cpp344
-rw-r--r--src/EventHandler.cpp6
-rw-r--r--src/TgTypeParser.cpp398
3 files changed, 708 insertions, 40 deletions
diff --git a/src/Api.cpp b/src/Api.cpp
index 31e08f3..ca2f969 100644
--- a/src/Api.cpp
+++ b/src/Api.cpp
@@ -109,7 +109,7 @@ Message::Ptr Api::sendPhoto(int64_t chatId, const string& photoId, const string&
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendPhoto", args));
}
-Message::Ptr Api::sendAudio(int64_t chatId, const InputFile::Ptr audio, const std::string &caption, int32_t duration, const string& performer, const string& title, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+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, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("audio", audio->data, true, audio->mimeType, audio->fileName));
@@ -137,7 +137,7 @@ Message::Ptr Api::sendAudio(int64_t chatId, const InputFile::Ptr audio, const st
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendAudio", args));
}
-Message::Ptr Api::sendAudio(int64_t chatId, const string& audioId, const std::string &caption, int32_t duration, const string& performer, const string& title, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+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, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("audio", audioId));
@@ -165,7 +165,7 @@ Message::Ptr Api::sendAudio(int64_t chatId, const string& audioId, const std::st
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendAudio", args));
}
-Message::Ptr Api::sendDocument(int64_t chatId, const InputFile::Ptr document, const std::string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+Message::Ptr Api::sendDocument(int64_t chatId, const InputFile::Ptr document, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("document", document->data, true, document->mimeType, document->fileName));
@@ -184,7 +184,7 @@ Message::Ptr Api::sendDocument(int64_t chatId, const InputFile::Ptr document, co
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendDocument", args));
}
-Message::Ptr Api::sendDocument(int64_t chatId, const string& document, const std::string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+Message::Ptr Api::sendDocument(int64_t chatId, const string& document, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("document", document));
@@ -235,7 +235,79 @@ Message::Ptr Api::sendSticker(int64_t chatId, const string& stickerId, int32_t r
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendSticker", args));
}
-Message::Ptr Api::sendVideo(int64_t chatId, const InputFile::Ptr video, int32_t duration, int32_t width, int32_t height, const std::string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+StickerSet::Ptr Api::getStickerSet(const string& name) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("name", name));
+ return TgTypeParser::getInstance().parseJsonAndGetStickerSet(sendRequest("getStickerSet", args));
+}
+
+File::Ptr Api::uploadStickerFile(int32_t userId, const InputFile::Ptr pngSticker) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("user_id", userId));
+ args.push_back(HttpReqArg("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName));
+ return TgTypeParser::getInstance().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 {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("user_id", userId));
+ args.push_back(HttpReqArg("name", name));
+ args.push_back(HttpReqArg("title", title));
+ args.push_back(HttpReqArg("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName));
+ args.push_back(HttpReqArg("emojis", emojis));
+ args.push_back(HttpReqArg("contains_mask", containsMasks));
+ args.push_back(HttpReqArg("mask_position", TgTypeParser::getInstance().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.push_back(HttpReqArg("user_id", userId));
+ args.push_back(HttpReqArg("name", name));
+ args.push_back(HttpReqArg("title", title));
+ args.push_back(HttpReqArg("png_sticker", pngSticker));
+ args.push_back(HttpReqArg("emojis", emojis));
+ args.push_back(HttpReqArg("contains_mask", containsMasks));
+ args.push_back(HttpReqArg("mask_position", TgTypeParser::getInstance().parseMaskPosition(maskPosition)));
+ 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 {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("user_id", userId));
+ args.push_back(HttpReqArg("name", name));
+ args.push_back(HttpReqArg("title", title));
+ args.push_back(HttpReqArg("png_sticker", pngSticker->data, true, pngSticker->mimeType, pngSticker->fileName));
+ args.push_back(HttpReqArg("emojis", emojis));
+ args.push_back(HttpReqArg("mask_position", TgTypeParser::getInstance().parseMaskPosition(maskPosition)));
+ 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.push_back(HttpReqArg("user_id", userId));
+ args.push_back(HttpReqArg("name", name));
+ args.push_back(HttpReqArg("title", title));
+ args.push_back(HttpReqArg("png_sticker", pngSticker));
+ args.push_back(HttpReqArg("emojis", emojis));
+ args.push_back(HttpReqArg("mask_position", TgTypeParser::getInstance().parseMaskPosition(maskPosition)));
+ return sendRequest("addStickerToSet", args).get<bool>("", false);
+}
+
+bool Api::setStickerPositionInSet(const string& sticker, uint32_t position) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("sticker", sticker));
+ args.push_back(HttpReqArg("position", position));
+ return sendRequest("setStickerPositionInSet", args).get<bool>("", false);
+}
+
+bool Api::deleteStickerPositionInSet(const string& sticker) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("sticker", sticker));
+ return sendRequest("setStickerPositionInSet", args).get<bool>("", false);
+}
+
+Message::Ptr Api::sendVideo(int64_t chatId, const InputFile::Ptr video, int32_t duration, int32_t width, int32_t height, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("video", video->data, true, video->mimeType, video->fileName));
@@ -263,7 +335,7 @@ Message::Ptr Api::sendVideo(int64_t chatId, const InputFile::Ptr video, int32_t
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendVideo", args));
}
-Message::Ptr Api::sendVideo(int64_t chatId, const string& videoId, int32_t duration, int32_t width, int32_t height, const std::string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+Message::Ptr Api::sendVideo(int64_t chatId, const string& videoId, int32_t duration, int32_t width, int32_t height, const string &caption, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("video", videoId));
@@ -291,7 +363,61 @@ Message::Ptr Api::sendVideo(int64_t chatId, const string& videoId, int32_t durat
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendVideo", args));
}
-Message::Ptr Api::sendVoice(int64_t chatId, const InputFile::Ptr voice, const std::string &caption, int duration, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+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) {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("video_note", videoNote));
+ if (disableNotification) {
+ args.push_back(HttpReqArg("disable_notification", disableNotification));
+ }
+ if (duration) {
+ args.push_back(HttpReqArg("duration", duration));
+ }
+ if (length) {
+ args.push_back(HttpReqArg("length", length));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ return TgTypeParser::getInstance().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.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("video_note", videoNote));
+ if (disableNotification) {
+ args.push_back(HttpReqArg("disable_notification", disableNotification));
+ }
+ if (duration) {
+ args.push_back(HttpReqArg("duration", duration));
+ }
+ if (length) {
+ args.push_back(HttpReqArg("length", length));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseGenericReply(replyMarkup)));
+ }
+ if (replyToMessageId) {
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ }
+ return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendVoiceNote", args));
+}
+
+vector<Message::Ptr> Api::sendMediaGroup(int64_t chatId, const vector<InputMedia::Ptr>& media, bool disableNotification, int32_t replyToMessageId) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ string mediaJson = TgTypeParser::getInstance().parseArray<InputMedia>(&TgTypeParser::parseInputMedia, media);
+ args.push_back(HttpReqArg("media", mediaJson));
+ args.push_back(HttpReqArg("disable_notification", disableNotification));
+ args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
+ return TgTypeParser::getInstance().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, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("voice", voice->data, true, voice->mimeType, voice->fileName));
@@ -313,7 +439,7 @@ Message::Ptr Api::sendVoice(int64_t chatId, const InputFile::Ptr voice, const st
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendVoice", args));
}
-Message::Ptr Api::sendVoice(int64_t chatId, const std::string& voiceId, const std::string &caption, int duration, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+Message::Ptr Api::sendVoice(int64_t chatId, const string& voiceId, const string &caption, int duration, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("voice", voiceId));
@@ -335,11 +461,14 @@ Message::Ptr Api::sendVoice(int64_t chatId, const std::string& voiceId, const st
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendVoice", args));
}
-Message::Ptr Api::sendLocation(int64_t chatId, float latitude, float longitude, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
+Message::Ptr Api::sendLocation(int64_t chatId, float latitude, float longitude, uint32_t livePeriod, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup, bool disableNotification) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("latitude", latitude));
args.push_back(HttpReqArg("longitude", longitude));
+ if (livePeriod) {
+ args.push_back(HttpReqArg("live_period", livePeriod));
+ }
if (replyToMessageId) {
args.push_back(HttpReqArg("reply_to_message_id", replyToMessageId));
}
@@ -352,7 +481,56 @@ Message::Ptr Api::sendLocation(int64_t chatId, float latitude, float longitude,
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendLocation", args));
}
-Message::Ptr Api::sendVenue(int64_t chatId, float latitude, float longitude, std::string title, std::string address, std::string foursquareId, bool disableNotification, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const {
+Message::Ptr Api::editMessageLiveLocation(float latitude, float longitude, int64_t chatId, int32_t messageId, int32_t inlineMessageId, const InlineKeyboardMarkup::Ptr replyMarkup) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("latitude", latitude));
+ args.push_back(HttpReqArg("longitude", longitude));
+ if (chatId) {
+ args.push_back(HttpReqArg("chat_id", chatId));
+ }
+ if (messageId) {
+ args.push_back(HttpReqArg("message_id", messageId));
+ }
+ if (inlineMessageId) {
+ args.push_back(HttpReqArg("inline_message_id", inlineMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseInlineKeyboardMarkup(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("editMessageLiveLocation", args));
+}
+
+Message::Ptr Api::stopMessageLiveLocation(int64_t chatId, int32_t messageId, int32_t inlineMessageId, const InlineKeyboardMarkup::Ptr replyMarkup) const {
+ vector<HttpReqArg> args;
+ if (chatId) {
+ args.push_back(HttpReqArg("chat_id", chatId));
+ }
+ if (messageId) {
+ args.push_back(HttpReqArg("message_id", messageId));
+ }
+ if (inlineMessageId) {
+ args.push_back(HttpReqArg("inline_message_id", inlineMessageId));
+ }
+ if (replyMarkup) {
+ args.push_back(HttpReqArg("reply_markup", TgTypeParser::getInstance().parseInlineKeyboardMarkup(replyMarkup)));
+ }
+ return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("editMessageLiveLocation", args));
+}
+
+bool Api::setChatStickerSet(int64_t chatId, const string& stickerSetName) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("sticker_set_name ", stickerSetName));
+ return sendRequest("setChatStickerSet", args).get<bool>("", false);
+}
+
+bool Api::deleteChatStickerSet(int64_t chatId) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ 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 {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("latitude", latitude));
@@ -374,7 +552,7 @@ Message::Ptr Api::sendVenue(int64_t chatId, float latitude, float longitude, std
return TgTypeParser::getInstance().parseJsonAndGetMessage(sendRequest("sendVenue", args));
}
-Message::Ptr Api::sendContact(int64_t chatId, std::string phoneNumber, std::string firstName, std::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, bool disableNotification, int32_t replyToMessageId, const GenericReply::Ptr replyMarkup) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("phone_number", phoneNumber));
@@ -410,7 +588,7 @@ UserProfilePhotos::Ptr Api::getUserProfilePhotos(int32_t userId, int32_t offset,
return TgTypeParser::getInstance().parseJsonAndGetUserProfilePhotos(sendRequest("getUserProfilePhotos", args));
}
-File::Ptr Api::getFile(const std::string &fileId) const
+File::Ptr Api::getFile(const string &fileId) const
{
vector<HttpReqArg> args;
args.push_back(HttpReqArg("file_id", fileId));
@@ -431,7 +609,7 @@ Chat::Ptr Api::getChat(int64_t chatId) const
return TgTypeParser::getInstance().parseJsonAndGetChat(sendRequest("getChat", args));
}
-std::vector<ChatMember::Ptr> Api::getChatAdministrators(int64_t chatId) const
+vector<ChatMember::Ptr> Api::getChatAdministrators(int64_t chatId) const
{
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
@@ -445,7 +623,7 @@ int32_t Api::getChatMembersCount(int64_t chatId) const
return sendRequest("getChatMembersCount", args).get<int32_t>("", 0);
}
-bool Api::answerCallbackQuery(const std::string & callbackQueryId, const std::string & text, bool showAlert, const std::string &url, int32_t cacheTime) const
+bool Api::answerCallbackQuery(const string & callbackQueryId, const string & text, bool showAlert, const string &url, int32_t cacheTime) const
{
vector<HttpReqArg> args;
args.push_back(HttpReqArg("callback_query_id", callbackQueryId));
@@ -464,8 +642,8 @@ bool Api::answerCallbackQuery(const std::string & callbackQueryId, const std::st
return sendRequest("answerCallbackQuery", args).get<bool>("", false);
}
-Message::Ptr Api::editMessageText(const std::string& text, int64_t chatId, int32_t messageId, const std::string& inlineMessageId,
- const std::string& parseMode, bool disableWebPagePreview, const GenericReply::Ptr replyMarkup) const {
+Message::Ptr Api::editMessageText(const string& text, int64_t chatId, int32_t messageId, const string& inlineMessageId,
+ const string& parseMode, bool disableWebPagePreview, const GenericReply::Ptr replyMarkup) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("text", text));
@@ -495,8 +673,8 @@ Message::Ptr Api::editMessageText(const std::string& text, int64_t chatId, int32
}
}
-Message::Ptr Api::editMessageCaption(int64_t chatId, int32_t messageId, const std::string& caption,
- const std::string& inlineMessageId, const GenericReply::Ptr replyMarkup) const {
+Message::Ptr Api::editMessageCaption(int64_t chatId, int32_t messageId, const string& caption,
+ const string& inlineMessageId, const GenericReply::Ptr replyMarkup) const {
vector<HttpReqArg> args;
if (chatId) {
@@ -523,7 +701,7 @@ Message::Ptr Api::editMessageCaption(int64_t chatId, int32_t messageId, const st
}
-Message::Ptr Api::editMessageReplyMarkup(int64_t chatId, int32_t messageId, const std::string& inlineMessageId,
+Message::Ptr Api::editMessageReplyMarkup(int64_t chatId, int32_t messageId, const string& inlineMessageId,
const GenericReply::Ptr replyMarkup) const {
vector<HttpReqArg> args;
@@ -565,9 +743,9 @@ vector<Update::Ptr> Api::getUpdates(int32_t offset, int32_t limit, int32_t timeo
if (timeout) {
args.push_back(HttpReqArg("timeout", timeout));
}
- if (allowedUpdates!=nullptr) {
- string allowedUpdatesJson = TgTypeParser::getInstance().parseArray<std::string>(
- [](const std::string &s)->std::string {
+ if (allowedUpdates != nullptr) {
+ string allowedUpdatesJson = TgTypeParser::getInstance().parseArray<string>(
+ [](const string &s)->string {
return s;
}, *allowedUpdates);
args.push_back(HttpReqArg("allowed_updates", allowedUpdatesJson));
@@ -581,13 +759,13 @@ void Api::setWebhook(const string& url, const InputFile::Ptr certificate, int32_
args.push_back(HttpReqArg("url", url));
if (certificate != nullptr)
args.push_back(HttpReqArg("certificate", certificate->data, true, certificate->mimeType, certificate->fileName));
- if (maxConnection!=40)
+ if (maxConnection != 40)
args.push_back(HttpReqArg("max_connections", maxConnection));
- if (allowedUpdates!=nullptr)
+ if (allowedUpdates != nullptr)
{
- string allowedUpdatesJson = TgTypeParser::getInstance().parseArray<std::string>(
- [](const std::string &s)->std::string {
+ string allowedUpdatesJson = TgTypeParser::getInstance().parseArray<string>(
+ [](const string &s)->string {
return s;
}, *allowedUpdates);
args.push_back(HttpReqArg("allowed_updates", allowedUpdatesJson));
@@ -609,7 +787,7 @@ WebhookInfo::Ptr Api::getWebhookInfo() const
if (!p.get_child_optional("url"))
return nullptr;
- if (p.get<string>("url","")!=string(""))
+ if (p.get<string>("url","") != string(""))
{
return TgTypeParser::getInstance().parseJsonAndGetWebhookInfo(p);
}
@@ -619,8 +797,8 @@ WebhookInfo::Ptr Api::getWebhookInfo() const
}
}
-bool Api::answerInlineQuery(const std::string& inlineQueryId, const std::vector<InlineQueryResult::Ptr>& results,
- int32_t cacheTime, bool isPersonal, const std::string& nextOffset, const std::string& switchPmText, const std::string& switchPmParameter) const {
+bool Api::answerInlineQuery(const string& inlineQueryId, const std::vector<InlineQueryResult::Ptr>& results,
+ int32_t cacheTime, bool isPersonal, const string& nextOffset, const string& switchPmText, const string& switchPmParameter) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("inline_query_id", inlineQueryId));
string resultsJson = TgTypeParser::getInstance().parseArray<InlineQueryResult>(&TgTypeParser::parseInlineQueryResult, results);
@@ -643,10 +821,13 @@ bool Api::answerInlineQuery(const std::string& inlineQueryId, const std::vector<
return sendRequest("answerInlineQuery", args).get<bool>("", false);
}
-bool Api::kickChatMember(int64_t chatId, int32_t userId) const {
+bool Api::kickChatMember(int64_t chatId, int32_t userId, uint64_t untilDate) const {
vector<HttpReqArg> args;
args.push_back(HttpReqArg("chat_id", chatId));
args.push_back(HttpReqArg("user_id", userId));
+ if (untilDate) {
+ args.push_back(HttpReqArg("until_date", untilDate));
+ }
return sendRequest("kickChatMember", args).get<bool>("", false);
}
@@ -657,6 +838,107 @@ bool Api::unbanChatMember(int64_t chatId, int32_t userId) const {
return sendRequest("unbanChatMember", args).get<bool>("", false);
}
+bool Api::restrictChatMember(int64_t chatId, int32_t userId, uint64_t untilDate, bool canSendMessages,
+ bool canSendMediaMessages, bool canSendOtherMessages, bool canAddWebPagePreviews) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("user_id", userId));
+ if (untilDate) {
+ args.push_back(HttpReqArg("until_date", untilDate));
+ }
+ if (canSendMessages) {
+ args.push_back(HttpReqArg("can_send_messages", canSendMessages));
+ }
+ if (canSendMediaMessages) {
+ args.push_back(HttpReqArg("can_send_media_messages", canSendMediaMessages));
+ }
+ if (canSendOtherMessages) {
+ args.push_back(HttpReqArg("can_send_other_messages", canSendOtherMessages));
+ }
+ if (canAddWebPagePreviews) {
+ args.push_back(HttpReqArg("can_add_web_page_previews", canAddWebPagePreviews));
+ }
+ return sendRequest("restrictChatMember", args).get<bool>("", false);
+}
+
+bool Api::promoteChatMember(int64_t chatId, int32_t userId, bool canChangeInfo, bool canPostMessages,
+ bool canEditMessages, bool canDeleteMessages, bool canInviteUsers, bool canPinMessages, bool canPromoteMembers) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("user_id", userId));
+ if (canChangeInfo) {
+ args.push_back(HttpReqArg("can_change_info", canChangeInfo));
+ }
+ if (canPostMessages) {
+ args.push_back(HttpReqArg("can_post_messages", canPostMessages));
+ }
+ if (canEditMessages) {
+ args.push_back(HttpReqArg("can_edit_messages", canEditMessages));
+ }
+ if (canDeleteMessages) {
+ args.push_back(HttpReqArg("can_delete_messages", canDeleteMessages));
+ }
+ if (canInviteUsers) {
+ args.push_back(HttpReqArg("can_invite_users", canInviteUsers));
+ }
+ if (canPinMessages) {
+ args.push_back(HttpReqArg("can_pin_messages", canPinMessages));
+ }
+ if (canPromoteMembers) {
+ args.push_back(HttpReqArg("can_promote_members", canPromoteMembers));
+ }
+ return sendRequest("promoteChatMember", args).get<bool>("", false);
+}
+
+string Api::exportChatInviteLink(int64_t chatId) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ return sendRequest("exportChatInviteLink", args).get("", "");
+}
+
+bool Api::setChatPhoto(int64_t chatId, const InputFile::Ptr photo) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("photo", photo->data, true, photo->mimeType, photo->fileName));
+ return sendRequest("setChatPhoto", args).get<bool>("", false);
+}
+
+bool Api::deleteChatPhoto(int64_t chatId) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ return sendRequest("deleteChatPhoto", args).get<bool>("", false);
+}
+
+bool Api::setChatTitle(int64_t chatId, const string& title) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("title", title));
+ return sendRequest("setChatTitle", args).get<bool>("", false);
+}
+
+bool Api::setChatDescription(int64_t chatId, const string& description) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("description", description));
+ return sendRequest("setChatDescription", args).get<bool>("", false);
+}
+
+bool Api::pinChatMessage(int64_t chatId, int32_t messageId, bool disableNotification) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ args.push_back(HttpReqArg("message_id", messageId));
+ if (disableNotification) {
+ args.push_back(HttpReqArg("disable_notification", disableNotification));
+ }
+ return sendRequest("pinChatMessage", args).get<bool>("", false);
+}
+
+bool Api::unpinChatMessage(int64_t chatId) const {
+ vector<HttpReqArg> args;
+ args.push_back(HttpReqArg("chat_id", chatId));
+ return sendRequest("unpinChatMessage", args).get<bool>("", false);
+}
+
void Api::deleteMessage(int64_t chatId, int32_t messageId) const {
sendRequest("deleteMessage", { HttpReqArg("chat_id", chatId), HttpReqArg("message_id", messageId) });
}
@@ -684,7 +966,7 @@ ptree Api::sendRequest(const string& method, const vector<HttpReqArg>& args) con
}
}
-std::string Api::downloadFile(const std::string& filePath, const std::vector<HttpReqArg>& args) const {
+string Api::downloadFile(const string& filePath, const std::vector<HttpReqArg>& args) const {
string url = "https://api.telegram.org/file/bot";
url += _token;
url += "/";
diff --git a/src/EventHandler.cpp b/src/EventHandler.cpp
index 32efe3e..ba0ce54 100644
--- a/src/EventHandler.cpp
+++ b/src/EventHandler.cpp
@@ -26,9 +26,9 @@ void EventHandler::handleMessage(const Message::Ptr message) const {
_broadcaster->broadcastAnyMessage(message);
if (StringTools::startsWith(message->text, "/")) {
- uint32_t splitPosition;
- uint32_t spacePosition = message->text.find(' ');
- uint32_t atSymbolPosition = message->text.find('@');
+ uint16_t splitPosition;
+ uint16_t spacePosition = message->text.find(' ');
+ uint16_t atSymbolPosition = message->text.find('@');
if (spacePosition == message->text.npos) {
if (atSymbolPosition == message->text.npos) {
splitPosition = message->text.size();
diff --git a/src/TgTypeParser.cpp b/src/TgTypeParser.cpp
index 1b80d7f..f910761 100644
--- a/src/TgTypeParser.cpp
+++ b/src/TgTypeParser.cpp
@@ -47,9 +47,15 @@ Chat::Ptr TgTypeParser::parseJsonAndGetChat(const ptree& data) const {
}
result->title = data.get("title", "");
result->username = data.get("username", "");
- result->firstName = data.get<string>("first_name", "");
+ result->firstName = data.get("first_name", "");
result->lastName = data.get("last_name", "");
result->allMembersAreAdministrators = data.get<bool>("all_members_are_administrators", false);
+ result->photo = tryParseJson<ChatPhoto>(&TgTypeParser::parseJsonAndGetChatPhoto, data, "photo");
+ result->description = data.get("description", "");
+ result->inviteLink = data.get("invite_link", "");
+ result->pinnedMessage = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "pinned_message");
+ result->stickerSetName = data.get("sticker_set_name", "");
+ result->canSetStickerSet = data.get<bool>("can_set_sticker_set", false);
return result;
}
@@ -82,9 +88,11 @@ 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<int32_t>("id");
+ 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", "");
return result;
}
@@ -95,9 +103,11 @@ string TgTypeParser::parseUser(const User::Ptr& object) const {
string result;
result += '{';
appendToJson(result, "id", object->id);
+ appendToJson(result, "is_bot", object->isBot);
appendToJson(result, "first_name", object->firstName);
appendToJson(result, "last_name", object->lastName);
appendToJson(result, "username", object->username);
+ appendToJson(result, "language_code", object->languageCode);
result.erase(result.length() - 1);
result += '}';
return result;
@@ -105,10 +115,10 @@ string TgTypeParser::parseUser(const User::Ptr& object) const {
MessageEntity::Ptr TgTypeParser::parseJsonAndGetEntity(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->url=data.get<string>("url", "");
+ result->type = data.get<string>("type");
+ result->offset = data.get<int32_t>("offset");
+ result->length = data.get<int32_t>("length");
+ result->url = data.get<string>("url", "");
result->user = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "user");
return result;
}
@@ -122,11 +132,14 @@ Message::Ptr TgTypeParser::parseJsonAndGetMessage(const ptree& data) const {
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->forwardDate = data.get("forward_date", 0);
result->replyToMessage = tryParseJson<Message>(&TgTypeParser::parseJsonAndGetMessage, data, "reply_to_message");
result->editDate = data.get<int32_t>("edit_date", 0);
+ result->authorSignature = data.get("author_signature", "");
result->text = data.get("text", "");
result->entities = parseJsonAndGetArray<MessageEntity>(&TgTypeParser::parseJsonAndGetEntity, data, "entities");
+ result->captionEntities = parseJsonAndGetArray<MessageEntity>(&TgTypeParser::parseJsonAndGetEntity, data, "caption_entities");
result->audio = tryParseJson<Audio>(&TgTypeParser::parseJsonAndGetAudio, data, "audio");
result->document = tryParseJson<Document>(&TgTypeParser::parseJsonAndGetDocument, data, "document");
result->photo = parseJsonAndGetArray<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "photo");
@@ -135,6 +148,7 @@ Message::Ptr TgTypeParser::parseJsonAndGetMessage(const ptree& data) const {
result->contact = tryParseJson<Contact>(&TgTypeParser::parseJsonAndGetContact, data, "contact");
result->location = tryParseJson<Location>(&TgTypeParser::parseJsonAndGetLocation, data, "location");
result->newChatMember = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "new_chat_participant");
+ result->newChatMembers = parseJsonAndGetArray<User>(&TgTypeParser::parseJsonAndGetUser, data, "new_chat_members");
result->leftChatMember = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "left_chat_participant");
result->newChatTitle = data.get("new_chat_title", "");
result->newChatPhoto = parseJsonAndGetArray<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "new_chat_photo");
@@ -161,9 +175,11 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const {
appendToJson(result, "forward_from", parseUser(object->forwardFrom));
appendToJson(result, "forward_from_chat", parseChat(object->forwardFromChat));
appendToJson(result, "forward_from_message_id", object->forwardFromMessageId);
+ appendToJson(result, "forward_signature", object->forwardSignature);
appendToJson(result, "forward_date", object->forwardDate);
appendToJson(result, "reply_to_message", parseMessage(object->replyToMessage));
appendToJson(result, "edit_date", object->editDate);
+ appendToJson(result, "author_signature", object->authorSignature);
appendToJson(result, "text", object->text);
appendToJson(result, "audio", parseAudio(object->audio));
appendToJson(result, "document", parseDocument(object->document));
@@ -173,6 +189,7 @@ string TgTypeParser::parseMessage(const Message::Ptr& object) const {
appendToJson(result, "contact", parseContact(object->contact));
appendToJson(result, "location", parseLocation(object->location));
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);
appendToJson(result, "new_chat_photo", parseArray(&TgTypeParser::parsePhotoSize, object->newChatPhoto));
@@ -271,6 +288,8 @@ Sticker::Ptr TgTypeParser::parseJsonAndGetSticker(const ptree& data) const {
result->height = data.get<int32_t>("height");
result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb");
result->emoji = data.get("emoji", "");
+ result->setName = data.get("set_name", "");
+ result->maskPosition = tryParseJson<MaskPosition>(&TgTypeParser::parseJsonAndGetMaskPosition, data, "mask_position");
result->fileSize = data.get("file_size", 0);
return result;
}
@@ -292,6 +311,54 @@ string TgTypeParser::parseSticker(const Sticker::Ptr& object) const {
return result;
}
+StickerSet::Ptr TgTypeParser::parseJsonAndGetStickerSet(const ptree& data) const {
+ auto result(make_shared<StickerSet>());
+ result->name = data.get("name", "");
+ result->title = data.get("title", "");
+ result->containsMasks = data.get<bool>("contains_masks", false);
+ result->stickers = parseJsonAndGetArray<Sticker>(&TgTypeParser::parseJsonAndGetSticker, data, "stickers");
+ return result;
+}
+
+string TgTypeParser::parseStickerSet(const StickerSet::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ string result;
+ result += '{';
+ appendToJson(result, "name", object->name);
+ appendToJson(result, "title", object->title);
+ appendToJson(result, "contains_masks", object->containsMasks);
+ appendToJson(result, "stickers", parseArray(&TgTypeParser::parseSticker, object->stickers));
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+MaskPosition::Ptr TgTypeParser::parseJsonAndGetMaskPosition(const ptree& data) const {
+ auto result(make_shared<MaskPosition>());
+ result->point = data.get("point", "");
+ result->xShift = data.get<float>("x_shift", 0);
+ result->yShift = data.get<float>("y_shift", 0);
+ result->scale = data.get<float>("scale", 0);
+ return result;
+}
+
+string TgTypeParser::parseMaskPosition(const MaskPosition::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ string result;
+ result += '{';
+ appendToJson(result, "point", object->point);
+ appendToJson(result, "x_shift", object->xShift);
+ appendToJson(result, "y_shift", object->yShift);
+ appendToJson(result, "scale", object->scale);
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
Video::Ptr TgTypeParser::parseJsonAndGetVideo(const ptree& data) const {
auto result(make_shared<Video>());
result->fileId = data.get<string>("file_id");
@@ -322,6 +389,32 @@ string TgTypeParser::parseVideo(const Video::Ptr& object) const {
return result;
}
+VideoNote::Ptr TgTypeParser::parseJsonAndGetVideoNote(const ptree& data) const {
+ VideoNote::Ptr result(new VideoNote);
+ result->fileId = data.get<string>("file_id");
+ result->length = data.get<int32_t>("length");
+ result->duration = data.get<int32_t>("duration");
+ result->thumb = tryParseJson<PhotoSize>(&TgTypeParser::parseJsonAndGetPhotoSize, data, "thumb");
+ result->fileSize = data.get("file_size", 0);
+ return result;
+}
+
+string TgTypeParser::parseVideoNote(const VideoNote::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ string result;
+ result += '{';
+ appendToJson(result, "file_id", object->fileId);
+ appendToJson(result, "length", object->length);
+ appendToJson(result, "duration", object->duration);
+ appendToJson(result, "thumb", parsePhotoSize(object->thumb));
+ appendToJson(result, "file_size", object->fileSize);
+ result += '}';
+ result.erase();
+ return result;
+}
+
Contact::Ptr TgTypeParser::parseJsonAndGetContact(const ptree& data) const {
auto result(make_shared<Contact>());
result->phoneNumber = data.get<string>("phone_number");
@@ -418,6 +511,63 @@ string TgTypeParser::parseUserProfilePhotos(const UserProfilePhotos::Ptr& object
return result;
}
+InputMedia::Ptr TgTypeParser::parseJsonAndGetInputMedia(const ptree& data) const {
+ string type = data.get("type", "");
+ if (type == "photo") {
+ auto result(make_shared<InputMediaPhoto>());
+ result->media = data.get("media", "");
+ result->caption = data.get("caption", "");
+ result->parseMode = data.get("parse_mode", "");
+ return result;
+ }
+ else if (type == "video") {
+ auto result(make_shared<InputMediaVideo>());
+ result->media = data.get("media", "");
+ result->caption = data.get("caption", "");
+ result->parseMode = data.get("parse_mode", "");
+ 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 {
+ return nullptr;
+ }
+}
+
+string TgTypeParser::parseInputMedia(const InputMedia::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ string result;
+ result += '{';
+ if (object->type == InputMedia::TYPE::PHOTO) {
+ appendToJson(result, "type", "photo");
+ }
+ else {
+ appendToJson(result, "type", "video");
+ }
+ appendToJson(result, "media", object->media);
+ appendToJson(result, "caption", object->caption);
+ appendToJson(result, "parse_mode", object->parseMode);
+ if (object->width) {
+ appendToJson(result, "width", object->width);
+ }
+ if (object->height) {
+ appendToJson(result, "height", object->height);
+ }
+ if (object->duration) {
+ appendToJson(result, "duration", object->duration);
+ }
+ if (object->supportsStreaming) {
+ appendToJson(result, "supports_streaming", object->supportsStreaming);
+ }
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
File::Ptr TgTypeParser::parseJsonAndGetFile(const boost::property_tree::ptree& data) const {
auto result(make_shared<File>());
result->fileId = data.get<string>("file_id");
@@ -541,7 +691,21 @@ std::string TgTypeParser::parseForceReply(const ForceReply::Ptr& object) const {
ChatMember::Ptr TgTypeParser::parseJsonAndGetChatMember(const boost::property_tree::ptree& data) const {
auto result(make_shared<ChatMember>());
result->user = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "user");
- result->status = data.get<string>("status");
+ result->status = data.get("status", "");
+ result->untilDate = data.get<uint64_t>("until_date", 0);
+ result->canBeEdited = data.get<bool>("can_be_edited", false);
+ result->canChangeInfo = data.get<bool>("can_change_info", false);
+ result->canPostMessages = data.get<bool>("can_post_messages", false);
+ result->canEditMessages = data.get<bool>("can_edit_messages", false);
+ result->canDeleteMessages = data.get<bool>("can_delete_messages", false);
+ result->canInviteUsers = data.get<bool>("can_invite_users", false);
+ result->canRestrictMembers = data.get<bool>("can_restrict_members", false);
+ result->canPinMessages = data.get<bool>("can_pin_messages", false);
+ result->canPromoteMembers = data.get<bool>("can_promote_messages", false);
+ result->canSendMessages = data.get<bool>("can_send_messages", false);
+ result->canSendMediaMessages = data.get<bool>("can_send_media_messages", false);
+ result->canSendOtherMessages = data.get<bool>("can_send_other_messages", false);
+ result->canAddWebPagePreviews = data.get<bool>("can_add_web_page_previews", false);
return result;
}
@@ -558,6 +722,26 @@ std::string TgTypeParser::parseChatMember(const ChatMember::Ptr& object) const {
return result;
}
+ChatPhoto::Ptr TgTypeParser::parseJsonAndGetChatPhoto(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<ChatPhoto>());
+ result->smallFileId = data.get("small_file_id", "");
+ result->bigFileId = data.get("big_file_id", "");
+ return result;
+}
+
+std::string TgTypeParser::parseChatPhoto(const ChatPhoto::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ string result;
+ result += '{';
+ appendToJson(result, "small_file_id", object->smallFileId);
+ appendToJson(result, "big_file_id", object->bigFileId);
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
ResponseParameters::Ptr TgTypeParser::parseJsonAndGetResponseParameters(const boost::property_tree::ptree& data) const {
auto result(make_shared<ResponseParameters>());
result->migrateToChatId = data.get<int32_t>("migrate_to_chat_id", 0);
@@ -1178,6 +1362,7 @@ InlineQueryResultGif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultGif(cons
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");
return result;
}
@@ -1191,6 +1376,7 @@ std::string TgTypeParser::parseInlineQueryResultGif(const InlineQueryResultGif::
appendToJson(result, "gif_url", object->gifUrl);
appendToJson(result, "gif_width", object->gifWidth);
appendToJson(result, "gif_height", object->gifHeight);
+ appendToJson(result, "gif_duration", object->gifDuration);
appendToJson(result, "thumb_url", object->thumbUrl);
// The last comma will be erased by parseInlineQueryResult().
return result;
@@ -1202,6 +1388,7 @@ InlineQueryResultMpeg4Gif::Ptr TgTypeParser::parseJsonAndGetInlineQueryResultMpe
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");
return result;
}
@@ -1216,6 +1403,7 @@ std::string TgTypeParser::parseInlineQueryResultMpeg4Gif(const InlineQueryResult
appendToJson(result, "mpeg4_url", object->mpeg4Url);
appendToJson(result, "mpeg4_width", object->mpeg4Width);
appendToJson(result, "mpeg4_height", object->mpeg4Height);
+ appendToJson(result, "mpeg4_duration", object->mpeg4Duration);
appendToJson(result, "thumb_url", object->thumbUrl);
// The last comma will be erased by parseInlineQueryResult().
return result;
@@ -1539,6 +1727,204 @@ std::string TgTypeParser::parseInputContactMessageContent(const InputContactMess
return result;
}
+Invoice::Ptr TgTypeParser::parseJsonAndGetInvoice(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<Invoice>());
+ result->title = data.get<string>("title");
+ result->description = data.get<string>("description");
+ result->startParameter = data.get<string>("start_parameter");
+ result->currency = data.get<string>("currency");
+ result->totalAmount = data.get<int32_t>("total_amount");
+ return result;
+}
+
+std::string TgTypeParser::parseInvoice(const Invoice::Ptr& object) const {
+ if (!object) {
+ return " ";
+ }
+ string result;
+ result += '{';
+ appendToJson(result, "title", object->title);
+ appendToJson(result, "description", object->description);
+ appendToJson(result, "start_parameter", object->startParameter);
+ appendToJson(result, "currency", object->currency);
+ appendToJson(result, "total_amount", object->totalAmount);
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+LabeledPrice::Ptr TgTypeParser::parseJsonAndGetLabeledPrice(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<LabeledPrice>());
+ result->label = data.get<string>("label");
+ result->amount = data.get<int32_t>("amount");
+ return result;
+}
+
+string TgTypeParser::parseLabeledPrice(const LabeledPrice::Ptr& object) const {
+ std::string result;
+ result += '{';
+ appendToJson(result, "label", object->label);
+ appendToJson(result, "amount", object->amount);
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+OrderInfo::Ptr TgTypeParser::parseJsonAndGetOrderInfo(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<OrderInfo>());
+ result->name = data.get<string>("name", "");
+ result->phoneNumber = data.get<string>("phone_number", "");
+ result->email = data.get<string>("email", "");
+ result->shippingAddress = tryParseJson(&TgTypeParser::parseJsonAndGetShippingAddress, data, "shipping_address");
+ return result;
+}
+
+string TgTypeParser::parseOrderInfo(const OrderInfo::Ptr& object) const {
+ if (!object) {
+ return " ";
+ }
+ std::string result;
+ result += '{';
+ if (!object->name.empty()) {
+ appendToJson(result, "name", object->name);
+ }
+ if (!object->phoneNumber.empty()) {
+ appendToJson(result, "phone_number", object->phoneNumber);
+ }
+ if (!object->email.empty()) {
+ appendToJson(result, "email", object->email);
+ }
+ if (!object->shippingAddress) {
+ result += R"("shipping_address":)";
+ result += parseShippingAddress(object->shippingAddress);
+ result += ",";
+ }
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+PreCheckoutQuery::Ptr TgTypeParser::parseJsonAndGetPreCheckoutQuery(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<PreCheckoutQuery>());
+ result->id = data.get<string>("id");
+ result->from = tryParseJson(&TgTypeParser::parseJsonAndGetUser, data, "user");
+ result->currency = data.get<string>("currency");
+ result->totalAmount = data.get<int32_t>("total_amount");
+ return result;
+}
+
+string TgTypeParser::parsePreCheckoutQuery(const PreCheckoutQuery::Ptr& object) const {
+ std::string result;
+ result += '{';
+ appendToJson(result, "id", object->id);
+ result += R"("user":)";
+ result += parseUser(object->from);
+ result += ",";
+ appendToJson(result, "currency", object->currency);
+ appendToJson(result, "total_amount", object->totalAmount);
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+ShippingAddress::Ptr TgTypeParser::parseJsonAndGetShippingAddress(const boost::property_tree::ptree& data) const {
+ ShippingAddress::Ptr result;
+ result->countryCode = data.get<string>("country_code");
+ result->state = data.get<string>("state", "");
+ result->city = data.get<string>("city");
+ result->streetLine1 = data.get<string>("street_line1");
+ result->streetLine2 = data.get<string>("street_line2");
+ result->postCode = data.get<string>("post_code");
+ return result;
+}
+
+string TgTypeParser::parseShippingAddress(const ShippingAddress::Ptr& object) const {
+ std::string result;
+ result += '{';
+ appendToJson(result, "country_code", object->countryCode);
+ if (!object->state.empty()) {
+ appendToJson(result, "state", object->state);
+ }
+ appendToJson(result, "city", object->city);
+ appendToJson(result, "street_line1", object->streetLine1);
+ appendToJson(result, "street_line2", object->streetLine2);
+ appendToJson(result, "post_code", object->postCode);
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+ShippingOption::Ptr TgTypeParser::parseJsonAndGetShippingOption(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<ShippingOption>());
+ result->id = data.get<string>("id");
+ result->title = data.get<string>("title");
+ result->prices = parseJsonAndGetArray<LabeledPrice>(&TgTypeParser::parseJsonAndGetLabeledPrice, data, "prices");
+ return result;
+}
+
+string TgTypeParser::parseShippingOption(const ShippingOption::Ptr& object) const {
+ std::string result;
+ result += '{';
+ appendToJson(result, "id", object->id);
+ appendToJson(result, "title", object->title);
+ result.erase(result.length() - 1);
+ result += R"("prices":)";
+ result += parseArray(&TgTypeParser::parseLabeledPrice, object->prices);
+ result += '}';
+ return result;
+}
+
+ShippingQuery::Ptr TgTypeParser::parseJsonAndGetShippingQuery(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<ShippingQuery>());
+ result->id = data.get<string>("id");
+ result->from = tryParseJson(&TgTypeParser::parseJsonAndGetUser, data, "from");
+ result->invoicePayload = data.get<string>("invoice_payload");
+ result->shippingAddress = tryParseJson(&TgTypeParser::parseJsonAndGetShippingAddress, data, "shipping_address");
+ return result;
+}
+
+string TgTypeParser::parseShippingQuery(const ShippingQuery::Ptr& object) const {
+ string result;
+ result += '{';
+ appendToJson(result, "id", object->id);
+ result += R"("from":)";
+ result += parseUser(object->from);
+ result += ",";
+ appendToJson(result, "invoice_payload", object->invoicePayload);
+ result += R"("shipping_address":)";
+ result += parseShippingAddress(object->shippingAddress);
+ result += ",";
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+SuccessfulPayment::Ptr TgTypeParser::parseJsonAndGetSucessfulPayment(const boost::property_tree::ptree& data) const {
+ auto result(make_shared<SuccessfulPayment>());
+ result->currency = data.get<string>("currency");
+ result->totalAmount = data.get<int32_t>("total_amount");
+ result->invoicePayload = data.get<string>("invoice_payload");
+ result->shippingOptionId = data.get<string>("shipping_option_id");
+ result->orderInfo = tryParseJson(&TgTypeParser::parseJsonAndGetOrderInfo, data, "order_info");
+ return result;
+}
+
+std::string TgTypeParser::parseSucessfulPayment(const SuccessfulPayment::Ptr& object) const {
+ string result;
+ result += '{';
+ appendToJson(result, "currency", object->currency);
+ appendToJson(result, "total_amount", object->totalAmount);
+ appendToJson(result, "invoice_payload", object->invoicePayload);
+ appendToJson(result, "shipping_option_id", object->shippingOptionId);
+ result += R"("order_info":)";
+ result += parseOrderInfo(object->orderInfo);
+ result += ",";
+ result.erase(result.length() - 1);
+ result += '}';
+ return result;
+}
+
+
void TgTypeParser::appendToJson(string& json, const string& varName, const string& value) const {
if (value.empty()) {
return;