summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorllnulldisk <48621230+llnulldisk@users.noreply.github.com>2022-09-04 17:16:56 +0200
committerllnulldisk <48621230+llnulldisk@users.noreply.github.com>2022-09-04 17:16:56 +0200
commit38f8755a35e696c52c3bae6aceb19513b73d41af (patch)
treefefd223a3f005932f0be04bf2c459be981f00409 /src
parentb540a9cc139b0c428cd51030f8071056dfe44d79 (diff)
Update to API 5.2
Diffstat (limited to 'src')
-rw-r--r--src/Api.cpp25
-rw-r--r--src/TgTypeParser.cpp109
-rw-r--r--src/types/InputMessageContent.cpp2
3 files changed, 117 insertions, 19 deletions
diff --git a/src/Api.cpp b/src/Api.cpp
index bcb711c..5cdab54 100644
--- a/src/Api.cpp
+++ b/src/Api.cpp
@@ -893,12 +893,15 @@ Message::Ptr Api::sendDice(std::int64_t chatId,
return _tgTypeParser.parseJsonAndGetMessage(sendRequest("sendDice", args));
}
-void Api::sendChatAction(std::int64_t chatId, const string& action) const {
+bool Api::sendChatAction(std::int64_t chatId,
+ const std::string& action) const {
vector<HttpReqArg> args;
args.reserve(2);
+
args.emplace_back("chat_id", chatId);
args.emplace_back("action", action);
- sendRequest("sendChatAction", args);
+
+ return sendRequest("sendChatAction", args).get<bool>("", false);
}
UserProfilePhotos::Ptr Api::getUserProfilePhotos(std::int64_t userId, std::int32_t offset, std::int32_t limit) const {
@@ -1573,7 +1576,6 @@ Message::Ptr Api::sendInvoice(std::int64_t chatId,
const std::string& description,
const std::string& payload,
const std::string& providerToken,
- const std::string& startParameter,
const std::string& currency,
const std::vector<LabeledPrice::Ptr>& prices,
const std::string& providerData,
@@ -1591,18 +1593,29 @@ Message::Ptr Api::sendInvoice(std::int64_t chatId,
std::int32_t replyToMessageId,
GenericReply::Ptr replyMarkup,
bool disableNotification,
- bool allowSendingWithoutReply) const {
+ bool allowSendingWithoutReply,
+ std::int32_t maxTipAmount,
+ const std::vector<std::int32_t>& suggestedTipAmounts,
+ const std::string& startParameter) const {
vector<HttpReqArg> args;
- args.reserve(24);
+ args.reserve(26);
args.emplace_back("chat_id", chatId);
args.emplace_back("title", title);
args.emplace_back("description", description);
args.emplace_back("payload", payload);
args.emplace_back("provider_token", providerToken);
- args.emplace_back("start_parameter", startParameter);
args.emplace_back("currency", currency);
args.emplace_back("prices", _tgTypeParser.parseArray<LabeledPrice>(&TgTypeParser::parseLabeledPrice, prices));
+ args.emplace_back("max_tip_amount", maxTipAmount);
+ if (!suggestedTipAmounts.empty()) {
+ args.emplace_back("suggested_tip_amounts", _tgTypeParser.parseArray<std::int32_t>([] (const std::int32_t& option) -> std::int32_t {
+ return option;
+ }, suggestedTipAmounts));
+ }
+ if (!startParameter.empty()) {
+ args.emplace_back("start_parameter", startParameter);
+ }
if (!providerData.empty()) {
args.emplace_back("provider_data", providerData);
}
diff --git a/src/TgTypeParser.cpp b/src/TgTypeParser.cpp
index 0491360..48b542a 100644
--- a/src/TgTypeParser.cpp
+++ b/src/TgTypeParser.cpp
@@ -188,6 +188,7 @@ Message::Ptr TgTypeParser::parseJsonAndGetMessage(const boost::property_tree::pt
result->passportData = tryParseJson<PassportData>(&TgTypeParser::parseJsonAndGetPassportData, data, "passport_data");
result->passportData = tryParseJson<PassportData>(&TgTypeParser::parseJsonAndGetPassportData, data, "passport_data");
result->proximityAlertTriggered = tryParseJson<ProximityAlertTriggered>(&TgTypeParser::parseJsonAndGetProximityAlertTriggered, data, "proximity_alert_triggered");
+ result->voiceChatScheduled = tryParseJson<VoiceChatScheduled>(&TgTypeParser::parseJsonAndGetVoiceChatScheduled, data, "voice_chat_scheduled");
result->voiceChatStarted = tryParseJson<VoiceChatStarted>(&TgTypeParser::parseJsonAndGetVoiceChatStarted, data, "voice_chat_started");
result->voiceChatEnded = tryParseJson<VoiceChatEnded>(&TgTypeParser::parseJsonAndGetVoiceChatEnded, data, "voice_chat_ended");
result->voiceChatParticipantsInvited = tryParseJson<VoiceChatParticipantsInvited>(&TgTypeParser::parseJsonAndGetVoiceChatParticipantsInvited, data, "voice_chat_participants_invited");
@@ -253,6 +254,7 @@ std::string TgTypeParser::parseMessage(const Message::Ptr& object) const {
appendToJson(result, "connected_website", object->connectedWebsite);
appendToJson(result, "passport_data", parsePassportData(object->passportData));
appendToJson(result, "proximity_alert_triggered", parseProximityAlertTriggered(object->proximityAlertTriggered));
+ appendToJson(result, "voice_chat_scheduled", parseVoiceChatScheduled(object->voiceChatScheduled));
appendToJson(result, "voice_chat_started", parseVoiceChatStarted(object->voiceChatStarted));
appendToJson(result, "voice_chat_ended", parseVoiceChatEnded(object->voiceChatEnded));
appendToJson(result, "voice_chat_participants_invited", parseVoiceChatParticipantsInvited(object->voiceChatParticipantsInvited));
@@ -913,6 +915,24 @@ std::string TgTypeParser::parseMessageAutoDeleteTimerChanged(const MessageAutoDe
return result;
}
+VoiceChatScheduled::Ptr TgTypeParser::parseJsonAndGetVoiceChatScheduled(const boost::property_tree::ptree& data) const {
+ auto result(std::make_shared<VoiceChatScheduled>());
+ result->startDate = data.get<std::int32_t>("start_date", 0);
+ return result;
+}
+
+std::string TgTypeParser::parseVoiceChatScheduled(const VoiceChatScheduled::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ std::string result;
+ result += '{';
+ appendToJson(result, "start_date", object->startDate);
+ removeLastComma(result);
+ result += '}';
+ return result;
+}
+
VoiceChatStarted::Ptr TgTypeParser::parseJsonAndGetVoiceChatStarted(const boost::property_tree::ptree& data) const {
auto result(std::make_shared<VoiceChatStarted>());
return result;
@@ -1529,12 +1549,12 @@ std::string TgTypeParser::parseGenericReply(const GenericReply::Ptr& object) con
InlineQuery::Ptr TgTypeParser::parseJsonAndGetInlineQuery(const boost::property_tree::ptree& data) const {
auto result(std::make_shared<InlineQuery>());
- result->id = data.get<std::string>("id");
+ result->id = data.get<std::string>("id", "");
result->from = tryParseJson<User>(&TgTypeParser::parseJsonAndGetUser, data, "from");
+ result->query = data.get<std::string>("query", "");
+ result->offset = data.get<std::string>("offset", "");
+ result->chatType = data.get<std::string>("chat_type", "");
result->location = tryParseJson<Location>(&TgTypeParser::parseJsonAndGetLocation, data, "location");
- result->query = data.get<std::string>("query");
- result->offset = data.get<std::string>("offset");
-
return result;
}
@@ -1546,9 +1566,10 @@ std::string TgTypeParser::parseInlineQuery(const InlineQuery::Ptr& object) const
result += '{';
appendToJson(result, "id", object->id);
appendToJson(result, "from", parseUser(object->from));
- appendToJson(result, "location", parseLocation(object->location));
appendToJson(result, "query", object->query);
appendToJson(result, "offset", object->offset);
+ appendToJson(result, "chat_type", object->chatType);
+ appendToJson(result, "location", parseLocation(object->location));
removeLastComma(result);
result += '}';
return result;
@@ -2499,17 +2520,20 @@ InputMessageContent::Ptr TgTypeParser::parseJsonAndGetInputMessageContent(const
std::string messageText = data.get<std::string>("message_text", "");
float latitude = data.get<float>("latitude", 1000); // latitude belong (-90,90)
- std::string title = data.get<std::string>("title", "");
+ std::string address = data.get<std::string>("address", "");
std::string phoneNumber = data.get<std::string>("phone_number", "");
+ std::string description = data.get<std::string>("description", "");
if (!messageText.empty()) {
result = std::static_pointer_cast<InputMessageContent>(parseJsonAndGetInputTextMessageContent(data));
- } else if (!title.empty()) {
+ } else if (!address.empty()) {
result = std::static_pointer_cast<InputMessageContent>(parseJsonAndGetInputVenueMessageContent(data));
} else if (latitude != 1000) {
result = std::static_pointer_cast<InputMessageContent>(parseJsonAndGetInputLocationMessageContent(data));
} else if (!phoneNumber.empty()) {
result = std::static_pointer_cast<InputMessageContent>(parseJsonAndGetInputContactMessageContent(data));
+ } else if (!description.empty()) {
+ result = std::static_pointer_cast<InputMessageContent>(parseJsonAndGetInputInvoiceMessageContent(data));
} else {
result = std::make_shared<InputMessageContent>();
}
@@ -2526,15 +2550,14 @@ std::string TgTypeParser::parseInputMessageContent(const InputMessageContent::Pt
if (object->type == InputTextMessageContent::TYPE) {
result += parseInputTextMessageContent(std::static_pointer_cast<InputTextMessageContent>(object));
- }
- else if (object->type == InputLocationMessageContent::TYPE) {
+ } else if (object->type == InputLocationMessageContent::TYPE) {
result += parseInputLocationMessageContent(std::static_pointer_cast<InputLocationMessageContent>(object));
- }
- else if (object->type == InputVenueMessageContent::TYPE) {
+ } else if (object->type == InputVenueMessageContent::TYPE) {
result += parseInputVenueMessageContent(std::static_pointer_cast<InputVenueMessageContent>(object));
- }
- else if (object->type == InputContactMessageContent::TYPE) {
+ } else if (object->type == InputContactMessageContent::TYPE) {
result += parseInputContactMessageContent(std::static_pointer_cast<InputContactMessageContent>(object));
+ } else if (object->type == InputInvoiceMessageContent::TYPE) {
+ result += parseInputInvoiceMessageContent(std::static_pointer_cast<InputInvoiceMessageContent>(object));
}
removeLastComma(result);
@@ -2650,6 +2673,66 @@ std::string TgTypeParser::parseInputContactMessageContent(const InputContactMess
return result;
}
+InputInvoiceMessageContent::Ptr TgTypeParser::parseJsonAndGetInputInvoiceMessageContent(const boost::property_tree::ptree& data) const {
+ // NOTE: This function will be called by parseJsonAndGetInputMessageContent().
+ auto result(std::make_shared<InputInvoiceMessageContent>());
+ result->title = data.get<std::string>("title", "");
+ result->description = data.get<std::string>("description", "");
+ result->payload = data.get<std::string>("payload", "");
+ result->providerToken = data.get<std::string>("provider_token", "");
+ result->currency = data.get<std::string>("currency", "");
+ result->prices = parseJsonAndGetArray<LabeledPrice>(&TgTypeParser::parseJsonAndGetLabeledPrice, data, "prices");
+ result->maxTipAmount = data.get<std::int32_t>("max_tip_amount", 0);
+ result->suggestedTipAmounts = parseJsonAndGetArray<std::int32_t>([] (const boost::property_tree::ptree& innerData)->std::int32_t {
+ return innerData.get<std::int32_t>(0);
+ }, data, "suggested_tip_amounts");
+ result->providerData = data.get<std::string>("provider_data", "");
+ result->photoUrl = data.get<std::string>("photo_url", "");
+ result->photoSize = data.get<std::int32_t>("photo_size", 0);
+ result->photoWidth = data.get<std::int32_t>("photo_width", 0);
+ result->photoHeight = data.get<std::int32_t>("photo_height", 0);
+ result->needName = data.get<bool>("need_name", false);
+ result->needPhoneNumber = data.get<bool>("need_phone_number", false);
+ result->needEmail = data.get<bool>("need_email", false);
+ result->needShippingAddress = data.get<bool>("need_shipping_address", false);
+ result->sendPhoneNumberToProvider = data.get<bool>("send_phone_number_to_provider", false);
+ result->sendEmailToProvider = data.get<bool>("send_email_to_provider", false);
+ result->isFlexible = data.get<bool>("is_flexible", false);
+ return result;
+}
+
+std::string TgTypeParser::parseInputInvoiceMessageContent(const InputInvoiceMessageContent::Ptr& object) const {
+ if (!object) {
+ return "";
+ }
+ // This function will be called by parseInputMessageContent()
+ std::string result;
+ appendToJson(result, "title", object->title);
+ appendToJson(result, "description", object->description);
+ appendToJson(result, "payload", object->payload);
+ appendToJson(result, "provider_token", object->providerToken);
+ appendToJson(result, "currency", object->currency);
+ appendToJson(result, "prices", parseArray(&TgTypeParser::parseLabeledPrice, object->prices));
+ appendToJson(result, "max_tip_amount", object->maxTipAmount);
+ appendToJson(result, "suggested_tip_amounts", parseArray<std::int32_t>([] (std::int32_t i)->std::int32_t {
+ return i;
+ }, object->suggestedTipAmounts));
+ appendToJson(result, "provider_data", object->providerData);
+ appendToJson(result, "photo_url", object->photoUrl);
+ appendToJson(result, "photo_size", object->photoSize);
+ appendToJson(result, "photo_width", object->photoWidth);
+ appendToJson(result, "photo_height", object->photoHeight);
+ appendToJson(result, "need_name", object->needName);
+ appendToJson(result, "need_phone_number", object->needPhoneNumber);
+ appendToJson(result, "need_email", object->needEmail);
+ appendToJson(result, "need_shipping_address", object->needShippingAddress);
+ appendToJson(result, "send_phone_number_to_provider", object->sendPhoneNumberToProvider);
+ appendToJson(result, "send_email_to_provider", object->sendEmailToProvider);
+ appendToJson(result, "is_flexible", object->isFlexible);
+ // The last comma will be erased by parseInputMessageContent().
+ return result;
+}
+
Invoice::Ptr TgTypeParser::parseJsonAndGetInvoice(const boost::property_tree::ptree& data) const {
auto result(std::make_shared<Invoice>());
result->title = data.get<std::string>("title");
diff --git a/src/types/InputMessageContent.cpp b/src/types/InputMessageContent.cpp
index 8f6d69d..2f54e00 100644
--- a/src/types/InputMessageContent.cpp
+++ b/src/types/InputMessageContent.cpp
@@ -2,6 +2,7 @@
#include "tgbot/types/InputLocationMessageContent.h"
#include "tgbot/types/InputVenueMessageContent.h"
#include "tgbot/types/InputContactMessageContent.h"
+#include "tgbot/types/InputInvoiceMessageContent.h"
#include <string>
@@ -11,3 +12,4 @@ const std::string InputTextMessageContent::TYPE = "text";
const std::string InputLocationMessageContent::TYPE = "location";
const std::string InputVenueMessageContent::TYPE = "venue";
const std::string InputContactMessageContent::TYPE = "contact";
+const std::string InputInvoiceMessageContent::TYPE = "invoice";