diff --git a/td/telegram/InlineQueriesManager.cpp b/td/telegram/InlineQueriesManager.cpp index c37db8f95..8223970c2 100644 --- a/td/telegram/InlineQueriesManager.cpp +++ b/td/telegram/InlineQueriesManager.cpp @@ -376,8 +376,8 @@ Result> InlineQueriesManager: return contact.get_input_bot_inline_message_media_contact(std::move(input_reply_markup)); } if (constructor_id == td_api::inputMessageInvoice::ID) { - TRY_RESULT(input_invoice, process_input_message_invoice(std::move(input_message_content), td_)); - return get_input_bot_inline_message_media_invoice(input_invoice, std::move(input_reply_markup), td_); + TRY_RESULT(input_invoice, InputInvoice::process_input_message_invoice(std::move(input_message_content), td_)); + return input_invoice.get_input_bot_inline_message_media_invoice(std::move(input_reply_markup), td_); } if (constructor_id == td_api::inputMessageLocation::ID) { TRY_RESULT(location, process_input_message_location(std::move(input_message_content))); diff --git a/td/telegram/InputInvoice.cpp b/td/telegram/InputInvoice.cpp index e5fb17c89..273d4fbd7 100644 --- a/td/telegram/InputInvoice.cpp +++ b/td/telegram/InputInvoice.cpp @@ -65,60 +65,56 @@ bool operator!=(const InputInvoice &lhs, const InputInvoice &rhs) { return !(lhs == rhs); } -InputInvoice get_input_invoice(tl_object_ptr &&message_invoice, Td *td, - DialogId owner_dialog_id, FormattedText &&message) { - InputInvoice result; - result.title_ = std::move(message_invoice->title_); - result.description_ = std::move(message_invoice->description_); - result.photo_ = get_web_document_photo(td->file_manager_.get(), std::move(message_invoice->photo_), owner_dialog_id); - result.start_parameter_ = std::move(message_invoice->start_param_); - result.invoice_.currency_ = std::move(message_invoice->currency_); - result.invoice_.is_test_ = message_invoice->test_; - result.invoice_.need_shipping_address_ = message_invoice->shipping_address_requested_; - // result.payload_ = string(); - // result.provider_token_ = string(); - // result.provider_data_ = string(); - result.extended_media_ = +InputInvoice::InputInvoice(tl_object_ptr &&message_invoice, Td *td, + DialogId owner_dialog_id, FormattedText &&message) { + title_ = std::move(message_invoice->title_); + description_ = std::move(message_invoice->description_); + photo_ = get_web_document_photo(td->file_manager_.get(), std::move(message_invoice->photo_), owner_dialog_id); + start_parameter_ = std::move(message_invoice->start_param_); + invoice_.currency_ = std::move(message_invoice->currency_); + invoice_.is_test_ = message_invoice->test_; + invoice_.need_shipping_address_ = message_invoice->shipping_address_requested_; + // payload_ = string(); + // provider_token_ = string(); + // provider_data_ = string(); + extended_media_ = MessageExtendedMedia(td, std::move(message_invoice->extended_media_), std::move(message), owner_dialog_id); if (message_invoice->total_amount_ <= 0 || !check_currency_amount(message_invoice->total_amount_)) { LOG(ERROR) << "Receive invalid total amount " << message_invoice->total_amount_; message_invoice->total_amount_ = 0; } - result.total_amount_ = message_invoice->total_amount_; + total_amount_ = message_invoice->total_amount_; if ((message_invoice->flags_ & telegram_api::messageMediaInvoice::RECEIPT_MSG_ID_MASK) != 0) { - result.receipt_message_id_ = MessageId(ServerMessageId(message_invoice->receipt_msg_id_)); - if (!result.receipt_message_id_.is_valid()) { - LOG(ERROR) << "Receive as receipt message " << result.receipt_message_id_ << " in " << owner_dialog_id; - result.receipt_message_id_ = MessageId(); + receipt_message_id_ = MessageId(ServerMessageId(message_invoice->receipt_msg_id_)); + if (!receipt_message_id_.is_valid()) { + LOG(ERROR) << "Receive as receipt message " << receipt_message_id_ << " in " << owner_dialog_id; + receipt_message_id_ = MessageId(); } } - return result; } -InputInvoice get_input_invoice(tl_object_ptr &&message_invoice, Td *td, - DialogId owner_dialog_id) { - InputInvoice result; - result.title_ = std::move(message_invoice->title_); - result.description_ = std::move(message_invoice->description_); - result.photo_ = get_web_document_photo(td->file_manager_.get(), std::move(message_invoice->photo_), owner_dialog_id); - // result.start_parameter_ = string(); - result.invoice_.currency_ = std::move(message_invoice->currency_); - result.invoice_.is_test_ = message_invoice->test_; - result.invoice_.need_shipping_address_ = message_invoice->shipping_address_requested_; - // result.payload_ = string(); - // result.provider_token_ = string(); - // result.provider_data_ = string(); - // result.extended_media_ = MessageExtendedMedia(); +InputInvoice::InputInvoice(tl_object_ptr &&message_invoice, Td *td, + DialogId owner_dialog_id) { + title_ = std::move(message_invoice->title_); + description_ = std::move(message_invoice->description_); + photo_ = get_web_document_photo(td->file_manager_.get(), std::move(message_invoice->photo_), owner_dialog_id); + // start_parameter_ = string(); + invoice_.currency_ = std::move(message_invoice->currency_); + invoice_.is_test_ = message_invoice->test_; + invoice_.need_shipping_address_ = message_invoice->shipping_address_requested_; + // payload_ = string(); + // provider_token_ = string(); + // provider_data_ = string(); + // extended_media_ = MessageExtendedMedia(); if (message_invoice->total_amount_ <= 0 || !check_currency_amount(message_invoice->total_amount_)) { LOG(ERROR) << "Receive invalid total amount " << message_invoice->total_amount_; message_invoice->total_amount_ = 0; } - result.total_amount_ = message_invoice->total_amount_; - // result.receipt_message_id_ = MessageId(); - return result; + total_amount_ = message_invoice->total_amount_; + // receipt_message_id_ = MessageId(); } -Result process_input_message_invoice( +Result InputInvoice::process_input_message_invoice( td_api::object_ptr &&input_message_content, Td *td) { CHECK(input_message_content != nullptr); CHECK(input_message_content->get_id() == td_api::inputMessageInvoice::ID); @@ -247,14 +243,13 @@ Result process_input_message_invoice( return result; } -tl_object_ptr get_message_invoice_object(const InputInvoice &input_invoice, Td *td, - bool skip_bot_commands, int32 max_media_timestamp) { +tl_object_ptr InputInvoice::get_message_invoice_object(Td *td, bool skip_bot_commands, + int32 max_media_timestamp) const { return make_tl_object( - input_invoice.title_, get_product_description_object(input_invoice.description_), - get_photo_object(td->file_manager_.get(), input_invoice.photo_), input_invoice.invoice_.currency_, - input_invoice.total_amount_, input_invoice.start_parameter_, input_invoice.invoice_.is_test_, - input_invoice.invoice_.need_shipping_address_, input_invoice.receipt_message_id_.get(), - input_invoice.extended_media_.get_message_extended_media_object(td, skip_bot_commands, max_media_timestamp)); + title_, get_product_description_object(description_), get_photo_object(td->file_manager_.get(), photo_), + invoice_.currency_, total_amount_, start_parameter_, invoice_.is_test_, invoice_.need_shipping_address_, + receipt_message_id_.get(), + extended_media_.get_message_extended_media_object(td, skip_bot_commands, max_media_timestamp)); } static tl_object_ptr get_input_invoice(const Invoice &invoice) { @@ -325,80 +320,77 @@ static tl_object_ptr get_input_web_document(cons std::move(attributes)); } -tl_object_ptr get_input_media_invoice(const InputInvoice &input_invoice, Td *td) { +tl_object_ptr InputInvoice::get_input_media_invoice(Td *td) const { int32 flags = 0; - if (!input_invoice.start_parameter_.empty()) { + if (!start_parameter_.empty()) { flags |= telegram_api::inputMediaInvoice::START_PARAM_MASK; } - auto input_web_document = get_input_web_document(td->file_manager_.get(), input_invoice.photo_); + auto input_web_document = get_input_web_document(td->file_manager_.get(), photo_); if (input_web_document != nullptr) { flags |= telegram_api::inputMediaInvoice::PHOTO_MASK; } return make_tl_object( - flags, input_invoice.title_, input_invoice.description_, std::move(input_web_document), - get_input_invoice(input_invoice.invoice_), BufferSlice(input_invoice.payload_), input_invoice.provider_token_, - telegram_api::make_object( - input_invoice.provider_data_.empty() ? "null" : input_invoice.provider_data_), - input_invoice.start_parameter_, nullptr); + flags, title_, description_, std::move(input_web_document), get_input_invoice(invoice_), BufferSlice(payload_), + provider_token_, + telegram_api::make_object(provider_data_.empty() ? "null" : provider_data_), + start_parameter_, nullptr); } -tl_object_ptr get_input_bot_inline_message_media_invoice( - const InputInvoice &input_invoice, tl_object_ptr &&reply_markup, Td *td) { +tl_object_ptr InputInvoice::get_input_bot_inline_message_media_invoice( + tl_object_ptr &&reply_markup, Td *td) const { int32 flags = 0; if (reply_markup != nullptr) { flags |= telegram_api::inputBotInlineMessageMediaInvoice::REPLY_MARKUP_MASK; } - auto input_web_document = get_input_web_document(td->file_manager_.get(), input_invoice.photo_); + auto input_web_document = get_input_web_document(td->file_manager_.get(), photo_); if (input_web_document != nullptr) { flags |= telegram_api::inputBotInlineMessageMediaInvoice::PHOTO_MASK; } return make_tl_object( - flags, input_invoice.title_, input_invoice.description_, std::move(input_web_document), - get_input_invoice(input_invoice.invoice_), BufferSlice(input_invoice.payload_), input_invoice.provider_token_, - telegram_api::make_object( - input_invoice.provider_data_.empty() ? "null" : input_invoice.provider_data_), + flags, title_, description_, std::move(input_web_document), get_input_invoice(invoice_), BufferSlice(payload_), + provider_token_, + telegram_api::make_object(provider_data_.empty() ? "null" : provider_data_), std::move(reply_markup)); } -vector get_input_invoice_file_ids(const Td *td, const InputInvoice &input_invoice) { - auto file_ids = photo_get_file_ids(input_invoice.photo_); - input_invoice.extended_media_.append_file_ids(td, file_ids); +vector InputInvoice::get_file_ids(const Td *td) const { + auto file_ids = photo_get_file_ids(photo_); + extended_media_.append_file_ids(td, file_ids); return file_ids; } -void input_invoice_delete_thumbnail(Td *td, InputInvoice &input_invoice) { - input_invoice.extended_media_.delete_thumbnail(td); +void InputInvoice::delete_thumbnail(Td *td) { + extended_media_.delete_thumbnail(td); } -bool has_input_invoice_media_timestamp(const InputInvoice &input_invoice) { - return input_invoice.extended_media_.has_media_timestamp(); +bool InputInvoice::has_media_timestamp() const { + return extended_media_.has_media_timestamp(); } -const FormattedText *get_input_invoice_caption(const InputInvoice &input_invoice) { - return input_invoice.extended_media_.get_caption(); +const FormattedText *InputInvoice::get_caption() const { + return extended_media_.get_caption(); } -int32 get_input_invoice_duration(const Td *td, const InputInvoice &input_invoice) { - return input_invoice.extended_media_.get_duration(td); +int32 InputInvoice::get_duration(const Td *td) const { + return extended_media_.get_duration(td); } -FileId get_input_invoice_upload_file_id(const InputInvoice &input_invoice) { - return input_invoice.extended_media_.get_upload_file_id(); +FileId InputInvoice::get_upload_file_id() const { + return extended_media_.get_upload_file_id(); } -FileId get_input_invoice_any_file_id(const InputInvoice &input_invoice) { - return input_invoice.extended_media_.get_any_file_id(); +FileId InputInvoice::get_any_file_id() const { + return extended_media_.get_any_file_id(); } -FileId get_input_invoice_thumbnail_file_id(const Td *td, const InputInvoice &input_invoice) { - return input_invoice.extended_media_.get_thumbnail_file_id(td); +FileId InputInvoice::get_thumbnail_file_id(const Td *td) const { + return extended_media_.get_thumbnail_file_id(td); } -bool update_input_invoice_extended_media(InputInvoice &input_invoice, - telegram_api::object_ptr extended_media, +bool InputInvoice::update_extended_media(telegram_api::object_ptr extended_media, DialogId owner_dialog_id, Td *td) { - return input_invoice.extended_media_.update_to(td, std::move(extended_media), owner_dialog_id); + return extended_media_.update_to(td, std::move(extended_media), owner_dialog_id); } tl_object_ptr get_product_description_object(const string &description) { diff --git a/td/telegram/InputInvoice.h b/td/telegram/InputInvoice.h index a54bfd60e..d20ea54de 100644 --- a/td/telegram/InputInvoice.h +++ b/td/telegram/InputInvoice.h @@ -56,6 +56,44 @@ struct InputInvoice { int64 total_amount_ = 0; MessageId receipt_message_id_; + + InputInvoice() = default; + + InputInvoice(tl_object_ptr &&message_invoice, Td *td, DialogId owner_dialog_id, + FormattedText &&message); + + InputInvoice(tl_object_ptr &&message_invoice, Td *td, + DialogId owner_dialog_id); + + static Result process_input_message_invoice( + td_api::object_ptr &&input_message_content, Td *td); + + tl_object_ptr get_message_invoice_object(Td *td, bool skip_bot_commands, + int32 max_media_timestamp) const; + + tl_object_ptr get_input_media_invoice(Td *td) const; + + tl_object_ptr get_input_bot_inline_message_media_invoice( + tl_object_ptr &&reply_markup, Td *td) const; + + vector get_file_ids(const Td *td) const; + + void delete_thumbnail(Td *td); + + bool has_media_timestamp() const; + + const FormattedText *get_caption() const; + + int32 get_duration(const Td *td) const; + + FileId get_upload_file_id() const; + + FileId get_any_file_id() const; + + FileId get_thumbnail_file_id(const Td *td) const; + + bool update_extended_media(telegram_api::object_ptr extended_media, + DialogId owner_dialog_id, Td *td); }; bool operator==(const Invoice &lhs, const Invoice &rhs); @@ -66,43 +104,6 @@ StringBuilder &operator<<(StringBuilder &string_builder, const Invoice &invoice) bool operator==(const InputInvoice &lhs, const InputInvoice &rhs); bool operator!=(const InputInvoice &lhs, const InputInvoice &rhs); -InputInvoice get_input_invoice(tl_object_ptr &&message_invoice, Td *td, - DialogId owner_dialog_id, FormattedText &&message); - -InputInvoice get_input_invoice(tl_object_ptr &&message_invoice, Td *td, - DialogId owner_dialog_id); - -Result process_input_message_invoice( - td_api::object_ptr &&input_message_content, Td *td); - -tl_object_ptr get_message_invoice_object(const InputInvoice &input_invoice, Td *td, - bool skip_bot_commands, int32 max_media_timestamp); - -tl_object_ptr get_input_media_invoice(const InputInvoice &input_invoice, Td *td); - -tl_object_ptr get_input_bot_inline_message_media_invoice( - const InputInvoice &input_invoice, tl_object_ptr &&reply_markup, Td *td); - -vector get_input_invoice_file_ids(const Td *td, const InputInvoice &input_invoice); - -void input_invoice_delete_thumbnail(Td *td, InputInvoice &input_invoice); - -bool has_input_invoice_media_timestamp(const InputInvoice &input_invoice); - -const FormattedText *get_input_invoice_caption(const InputInvoice &input_invoice); - -int32 get_input_invoice_duration(const Td *td, const InputInvoice &input_invoice); - -FileId get_input_invoice_upload_file_id(const InputInvoice &input_invoice); - -FileId get_input_invoice_any_file_id(const InputInvoice &input_invoice); - -FileId get_input_invoice_thumbnail_file_id(const Td *td, const InputInvoice &input_invoice); - -bool update_input_invoice_extended_media(InputInvoice &input_invoice, - telegram_api::object_ptr extended_media, - DialogId owner_dialog_id, Td *td); - tl_object_ptr get_product_description_object(const string &description); } // namespace td diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index ab303305d..bb3bb7172 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -1637,8 +1637,7 @@ InlineMessageContent create_inline_message_content(Td *td, FileId file_id, case telegram_api::botInlineMessageMediaInvoice::ID: { auto inline_message = move_tl_object_as(bot_inline_message); reply_markup = std::move(inline_message->reply_markup_); - result.message_content = - make_unique(get_input_invoice(std::move(inline_message), td, DialogId())); + result.message_content = make_unique(InputInvoice(std::move(inline_message), td, DialogId())); break; } case telegram_api::botInlineMessageMediaGeo::ID: { @@ -1955,7 +1954,7 @@ static Result create_input_message_content( return Status::Error(400, "Invoices can be sent only by bots"); } - TRY_RESULT(input_invoice, process_input_message_invoice(std::move(input_message_content), td)); + TRY_RESULT(input_invoice, InputInvoice::process_input_message_invoice(std::move(input_message_content), td)); content = make_unique(std::move(input_invoice)); break; } @@ -2358,7 +2357,7 @@ static tl_object_ptr get_input_media_impl( } case MessageContentType::Invoice: { const auto *m = static_cast(content); - return get_input_media_invoice(m->input_invoice, td); + return m->input_invoice.get_input_media_invoice(td); } case MessageContentType::LiveLocation: { const auto *m = static_cast(content); @@ -2542,7 +2541,7 @@ void delete_message_content_thumbnail(MessageContent *content, Td *td) { } case MessageContentType::Invoice: { auto *m = static_cast(content); - return input_invoice_delete_thumbnail(td, m->input_invoice); + return m->input_invoice.delete_thumbnail(td); } case MessageContentType::Photo: { auto *m = static_cast(content); @@ -3036,7 +3035,7 @@ bool can_message_content_have_media_timestamp(const MessageContent *content) { return true; case MessageContentType::Invoice: { const auto *m = static_cast(content); - return has_input_invoice_media_timestamp(m->input_invoice); + return m->input_invoice.has_media_timestamp(); } default: return has_message_content_web_page(content); @@ -4481,7 +4480,7 @@ unique_ptr get_message_content(Td *td, FormattedText message, return std::move(m); } case telegram_api::messageMediaInvoice::ID: - return td::make_unique(get_input_invoice( + return td::make_unique(InputInvoice( move_tl_object_as(media_ptr), td, owner_dialog_id, std::move(message))); case telegram_api::messageMediaWebPage::ID: { auto media = move_tl_object_as(media_ptr); @@ -5102,7 +5101,7 @@ tl_object_ptr get_message_content_object(const MessageCo } case MessageContentType::Invoice: { const auto *m = static_cast(content); - return get_message_invoice_object(m->input_invoice, td, skip_bot_commands, max_media_timestamp); + return m->input_invoice.get_message_invoice_object(td, skip_bot_commands, max_media_timestamp); } case MessageContentType::LiveLocation: { const auto *m = static_cast(content); @@ -5369,7 +5368,7 @@ const FormattedText *get_message_content_caption(const MessageContent *content) case MessageContentType::Document: return &static_cast(content)->caption; case MessageContentType::Invoice: - return get_input_invoice_caption(static_cast(content)->input_invoice); + return static_cast(content)->input_invoice.get_caption(); case MessageContentType::Photo: return &static_cast(content)->caption; case MessageContentType::Video: @@ -5393,7 +5392,7 @@ int32 get_message_content_duration(const MessageContent *content, const Td *td) return td->audios_manager_->get_audio_duration(audio_file_id); } case MessageContentType::Invoice: - return get_input_invoice_duration(td, static_cast(content)->input_invoice); + return static_cast(content)->input_invoice.get_duration(td); case MessageContentType::Video: { auto video_file_id = static_cast(content)->file_id; return td->videos_manager_->get_video_duration(video_file_id); @@ -5419,7 +5418,7 @@ int32 get_message_content_media_duration(const MessageContent *content, const Td return td->audios_manager_->get_audio_duration(audio_file_id); } case MessageContentType::Invoice: - return get_input_invoice_duration(td, static_cast(content)->input_invoice); + return static_cast(content)->input_invoice.get_duration(td); case MessageContentType::Text: { auto web_page_id = static_cast(content)->web_page_id; return td->web_pages_manager_->get_web_page_media_duration(web_page_id); @@ -5450,7 +5449,7 @@ FileId get_message_content_upload_file_id(const MessageContent *content) { case MessageContentType::Document: return static_cast(content)->file_id; case MessageContentType::Invoice: - return get_input_invoice_upload_file_id(static_cast(content)->input_invoice); + return static_cast(content)->input_invoice.get_upload_file_id(); case MessageContentType::Photo: return get_photo_upload_file_id(static_cast(content)->photo); case MessageContentType::Sticker: @@ -5473,7 +5472,7 @@ FileId get_message_content_any_file_id(const MessageContent *content) { if (content->get_type() == MessageContentType::Photo) { result = get_photo_any_file_id(static_cast(content)->photo); } else if (content->get_type() == MessageContentType::Invoice) { - result = get_input_invoice_any_file_id(static_cast(content)->input_invoice); + result = static_cast(content)->input_invoice.get_any_file_id(); } } return result; @@ -5519,7 +5518,7 @@ FileId get_message_content_thumbnail_file_id(const MessageContent *content, cons return td->documents_manager_->get_document_thumbnail_file_id( static_cast(content)->file_id); case MessageContentType::Invoice: - return get_input_invoice_thumbnail_file_id(td, static_cast(content)->input_invoice); + return static_cast(content)->input_invoice.get_thumbnail_file_id(td); case MessageContentType::Photo: return get_photo_thumbnail_file_id(static_cast(content)->photo); case MessageContentType::Sticker: @@ -5575,7 +5574,7 @@ vector get_message_content_file_ids(const MessageContent *content, const case MessageContentType::Game: return static_cast(content)->game.get_file_ids(td); case MessageContentType::Invoice: - return get_input_invoice_file_ids(td, static_cast(content)->input_invoice); + return static_cast(content)->input_invoice.get_file_ids(td); case MessageContentType::ChatChangePhoto: return photo_get_file_ids(static_cast(content)->photo); case MessageContentType::PassportDataReceived: { @@ -5628,7 +5627,7 @@ string get_message_content_search_text(const Td *td, const MessageContent *conte } case MessageContentType::Invoice: { const auto *invoice = static_cast(content); - return get_input_invoice_caption(invoice->input_invoice)->text; + return invoice->input_invoice.get_caption()->text; } case MessageContentType::Photo: { const auto *photo = static_cast(content); @@ -5695,8 +5694,8 @@ bool update_message_content_extended_media(MessageContent *content, DialogId owner_dialog_id, Td *td) { CHECK(content != nullptr); CHECK(content->get_type() == MessageContentType::Invoice); - return update_input_invoice_extended_media(static_cast(content)->input_invoice, - std::move(extended_media), owner_dialog_id, td); + return static_cast(content)->input_invoice.update_extended_media(std::move(extended_media), + owner_dialog_id, td); } void get_message_content_animated_emoji_click_sticker(const MessageContent *content, FullMessageId full_message_id, diff --git a/td/telegram/Payments.cpp b/td/telegram/Payments.cpp index e5e5ae4bf..1c4ac6f37 100644 --- a/td/telegram/Payments.cpp +++ b/td/telegram/Payments.cpp @@ -876,8 +876,8 @@ void export_invoice(Td *td, td_api::object_ptr &&in if (invoice == nullptr) { return promise.set_error(Status::Error(400, "Invoice must be non-empty")); } - TRY_RESULT_PROMISE(promise, input_invoice, process_input_message_invoice(std::move(invoice), td)); - td->create_handler(std::move(promise))->send(get_input_media_invoice(input_invoice, td)); + TRY_RESULT_PROMISE(promise, input_invoice, InputInvoice::process_input_message_invoice(std::move(invoice), td)); + td->create_handler(std::move(promise))->send(input_invoice.get_input_media_invoice(td)); } void get_bank_card_info(Td *td, const string &bank_card_number,