diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 5705d267e..7dcd768cb 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/boxes/confirm_box.h" #include "data/business/data_shortcut_messages.h" #include "data/components/scheduled_messages.h" +#include "data/data_file_origin.h" #include "data/data_histories.h" #include "data/data_session.h" #include "data/data_web_page.h" @@ -254,37 +255,90 @@ mtpRequestId EditTextMessage( Fn done, Fn fail, std::optional spoilerMediaOverride) { - const auto callback = [=](Fn applyUpdates, mtpRequestId id) { - applyUpdates(); - done(id); - }; - auto inputMedia = std::optional(); if (spoilerMediaOverride) { const auto spoiler = *spoilerMediaOverride; if (const auto media = item->media()) { + auto takeInputMedia = Fn()>(nullptr); + auto takeFileReference = Fn(nullptr); if (const auto photo = media->photo()) { using Flag = MTPDinputMediaPhoto::Flag; const auto flags = Flag() | (media->ttlSeconds() ? Flag::f_ttl_seconds : Flag()) | (spoiler ? Flag::f_spoiler : Flag()); - inputMedia = MTP_inputMediaPhoto( - MTP_flags(flags), - photo->mtpInput(), - MTP_int(media->ttlSeconds())); + takeInputMedia = [=] { + return MTP_inputMediaPhoto( + MTP_flags(flags), + photo->mtpInput(), + MTP_int(media->ttlSeconds())); + }; + takeFileReference = [=] { return photo->fileReference(); }; } else if (const auto document = media->document()) { using Flag = MTPDinputMediaDocument::Flag; const auto flags = Flag() | (media->ttlSeconds() ? Flag::f_ttl_seconds : Flag()) | (spoiler ? Flag::f_spoiler : Flag()); - inputMedia = MTP_inputMediaDocument( - MTP_flags(flags), - document->mtpInput(), - MTP_int(media->ttlSeconds()), - MTPstring()); // query + takeInputMedia = [=] { + return MTP_inputMediaDocument( + MTP_flags(flags), + document->mtpInput(), + MTP_int(media->ttlSeconds()), + MTPstring()); // query + }; + takeFileReference = [=] { return document->fileReference(); }; } + + const auto usedFileReference = takeFileReference + ? takeFileReference() + : QByteArray(); + const auto origin = item->fullId(); + const auto api = &item->history()->session().api(); + const auto performRequest = [=]( + const auto &repeatRequest, + mtpRequestId originalRequestId) -> mtpRequestId { + const auto handleReference = [=]( + const QString &error, + mtpRequestId requestId) { + if (error.startsWith(u"FILE_REFERENCE_"_q)) { + api->refreshFileReference(origin, [=](const auto &) { + if (takeFileReference && + (takeFileReference() != usedFileReference)) { + repeatRequest( + repeatRequest, + originalRequestId + ? originalRequestId + : requestId); + } else { + fail(error, requestId); + } + }); + } else { + fail(error, requestId); + } + }; + const auto callback = [=]( + Fn applyUpdates, + mtpRequestId requestId) { + applyUpdates(); + done(originalRequestId ? originalRequestId : requestId); + }; + const auto requestId = EditMessage( + item, + caption, + webpage, + options, + callback, + handleReference, + takeInputMedia ? takeInputMedia() : std::nullopt); + return originalRequestId ? originalRequestId : requestId; + }; + return performRequest(performRequest, 0); } } + const auto callback = [=](Fn applyUpdates, mtpRequestId id) { + applyUpdates(); + done(id); + }; return EditMessage( item, caption, @@ -292,7 +346,7 @@ mtpRequestId EditTextMessage( options, callback, fail, - inputMedia); + std::nullopt); } } // namespace Api