diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 25090a4be7..50471733b8 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_media.h" #include "api/api_text_entities.h" #include "base/random.h" +#include "core/application.h" #include "ui/boxes/confirm_box.h" #include "data/business/data_shortcut_messages.h" #include "data/components/scheduled_messages.h" @@ -23,6 +24,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/controls/history_view_compose_media_edit_manager.h" #include "history/history.h" #include "history/history_item_components.h" +#include "iv/iv_instance.h" +#include "iv/iv_rich_message_serializer.h" +#include "iv/iv_rich_page.h" #include "lang/lang_keys.h" #include "main/main_session.h" #include "mtproto/mtproto_response.h" @@ -436,6 +440,45 @@ void EditMessageWithUploadedMedia( void RescheduleMessage( not_null item, SendOptions options) { + if (item->richPage()) { + const auto session = &item->history()->session(); + const auto itemId = item->fullId(); + const auto edit = [=] { + const auto item = session->data().message(itemId); + if (!item || !item->isScheduled() || !item->richPage()) { + return; + } + const auto serialize = [=]() + -> std::optional { + const auto fullPage = item->fullRichPage(); + const auto page = fullPage ? fullPage : item->richPage(); + if (!page) { + return std::nullopt; + } + auto serialized = Iv::SerializeInputRichMessage( + session, + *page, + Iv::SerializeInputRichMessageMode::FinalSubmit); + using Status = Iv::SerializeInputRichMessageStatus; + return (serialized.status == Status::Success) + && serialized.value + ? std::make_optional(std::move(*serialized.value)) + : std::nullopt; + }; + EditRichMessage(item, serialize, options, nullptr, nullptr); + }; + if (item->fullRichPage() || !item->richPage()->part) { + edit(); + } else { + Core::App().iv().resolveRichMessage(session, item, [=]( + std::shared_ptr page) { + if (page) { + edit(); + } + }); + } + return; + } const auto empty = [] {}; options.invertCaption = item->invertMedia(); EditMessage(item, options, empty, empty); diff --git a/Telegram/SourceFiles/data/components/scheduled_messages.cpp b/Telegram/SourceFiles/data/components/scheduled_messages.cpp index 3540af2059..eb0684e189 100644 --- a/Telegram/SourceFiles/data/components/scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/components/scheduled_messages.cpp @@ -249,7 +249,7 @@ void ScheduledMessages::sendNowSimpleMessage( : MTPDmessage::Flag(0)); const auto views = 1; const auto forwards = 0; - history->addNewMessage( + const auto sent = history->addNewMessage( update.vid().v, MTP_message( MTP_flags(flags), @@ -292,6 +292,14 @@ void ScheduledMessages::sendNowSimpleMessage( localFlags, NewMessageType::Unread); + if (const auto page = local->richPage()) { + sent->setRichPage(page); + if (const auto full = local->fullRichPage()) { + sent->setFullRichPage(full); + } + _session->data().requestItemTextRefresh(sent); + } + local->destroy(); } diff --git a/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp b/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp index a2267d8a4e..5df81d3858 100644 --- a/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp +++ b/Telegram/SourceFiles/iv/editor/iv_editor_session.cpp @@ -4538,7 +4538,7 @@ void ShowEditBox( } const auto weak = base::make_weak(controller); const auto itemId = item->fullId(); - Core::App().iv().resolveRichMessage(controller, item, [=]( + Core::App().iv().resolveRichMessage(&controller->session(), item, [=]( std::shared_ptr page) { const auto strong = weak.get(); const auto current = strong diff --git a/Telegram/SourceFiles/iv/iv_instance.cpp b/Telegram/SourceFiles/iv/iv_instance.cpp index 169737a5a0..6a9ca07206 100644 --- a/Telegram/SourceFiles/iv/iv_instance.cpp +++ b/Telegram/SourceFiles/iv/iv_instance.cpp @@ -1174,7 +1174,7 @@ bool Instance::MatchesRichMessageGeneration( } void Instance::resolveRichMessage( - not_null controller, + not_null session, not_null item, RichMessageResolved done) { if (const auto page = item->fullRichPage()) { @@ -1186,7 +1186,6 @@ void Instance::resolveRichMessage( done(richPage); return; } - const auto session = &controller->session(); const auto itemId = item->fullId(); const auto generation = CaptureRichMessageGeneration(item); trackSession(session); @@ -1241,7 +1240,8 @@ void Instance::showRichMessage( QString initialFragment) { const auto weak = base::make_weak(controller); const auto itemId = item->fullId(); - resolveRichMessage(controller, item, [=](std::shared_ptr page) { + resolveRichMessage(&controller->session(), item, [=]( + std::shared_ptr page) { const auto strong = weak.get(); const auto current = strong ? strong->session().data().message(itemId) diff --git a/Telegram/SourceFiles/iv/iv_instance.h b/Telegram/SourceFiles/iv/iv_instance.h index 44c22e61e2..f2e9956181 100644 --- a/Telegram/SourceFiles/iv/iv_instance.h +++ b/Telegram/SourceFiles/iv/iv_instance.h @@ -72,7 +72,7 @@ public: not_null item, QString initialFragment = QString()); void resolveRichMessage( - not_null controller, + not_null session, not_null item, RichMessageResolved done);