From 6c89f606795bb24b297f4185306d2fe01651fd69 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 28 May 2020 16:42:50 +0300 Subject: [PATCH] Added edit messages with uploaded file to api_editing. --- Telegram/SourceFiles/api/api_editing.cpp | 62 +++++++++++++++++++- Telegram/SourceFiles/api/api_editing.h | 11 ++++ Telegram/SourceFiles/storage/file_upload.cpp | 26 ++++---- 3 files changed, 82 insertions(+), 17 deletions(-) diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index da9cd5bc6..af50e7c47 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -23,10 +23,10 @@ namespace { void EditMessage( not_null item, - std::optional inputMedia, SendOptions options, Fn)> done, - Fn fail) { + Fn fail, + std::optional inputMedia = std::nullopt) { const auto session = &item->history()->session(); const auto api = &session->api(); @@ -74,6 +74,39 @@ void EditMessage( ).send(); } +void EditMessageWithUploadedMedia( + not_null item, + SendOptions options, + MTPInputMedia media) { + const auto done = [=](const auto &result, Fn applyUpdates) { + if (item) { + item->clearSavedMedia(); + item->setIsLocalUpdateMedia(true); + applyUpdates(); + item->setIsLocalUpdateMedia(false); + } + }; + const auto fail = [=](const RPCError &error) { + const auto err = error.type(); + const auto session = &item->history()->session(); + const auto notModified = (err == u"MESSAGE_NOT_MODIFIED"_q); + const auto mediaInvalid = (err == u"MEDIA_NEW_INVALID"_q); + if (notModified || mediaInvalid) { + item->returnSavedMedia(); + session->data().sendHistoryChangeNotifications(); + if (mediaInvalid) { + Ui::show( + Box(tr::lng_edit_media_invalid_file(tr::now)), + Ui::LayerOption::KeepOther); + } + } else { + session->api().sendMessageFail(error, item->history()->peer); + } + }; + + EditMessage(item, options, done, fail, media); +} + } // namespace void RescheduleMessage( @@ -84,7 +117,30 @@ void RescheduleMessage( }; const auto fail = [](const RPCError &error) {}; - EditMessage(item, std::nullopt, options, done, fail); + EditMessage(item, options, done, fail); +} + +void EditMessageWithUploadedDocument( + HistoryItem *item, + const MTPInputFile &file, + const std::optional &thumb, + SendOptions options) { + if (!item || !item->media() || !item->media()->document()) { + return; + } + const auto media = PrepareUploadedDocument(item, file, thumb); + EditMessageWithUploadedMedia(item, options, media); +} + +void EditMessageWithUploadedPhoto( + HistoryItem *item, + const MTPInputFile &file, + SendOptions options) { + if (!item || !item->media() || !item->media()->photo()) { + return; + } + const auto media = PrepareUploadedPhoto(file); + EditMessageWithUploadedMedia(item, options, media); } diff --git a/Telegram/SourceFiles/api/api_editing.h b/Telegram/SourceFiles/api/api_editing.h index 4166ab1e8..0932da682 100644 --- a/Telegram/SourceFiles/api/api_editing.h +++ b/Telegram/SourceFiles/api/api_editing.h @@ -17,4 +17,15 @@ void RescheduleMessage( not_null item, SendOptions options); +void EditMessageWithUploadedDocument( + HistoryItem *item, + const MTPInputFile &file, + const std::optional &thumb, + SendOptions options); + +void EditMessageWithUploadedPhoto( + HistoryItem *item, + const MTPInputFile &file, + SendOptions options); + } // namespace Api diff --git a/Telegram/SourceFiles/storage/file_upload.cpp b/Telegram/SourceFiles/storage/file_upload.cpp index ffb9b1eea..430c48c20 100644 --- a/Telegram/SourceFiles/storage/file_upload.cpp +++ b/Telegram/SourceFiles/storage/file_upload.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "storage/file_upload.h" +#include "api/api_editing.h" #include "api/api_send_progress.h" #include "storage/localimageloader.h" #include "storage/file_download.h" @@ -156,15 +157,12 @@ Uploader::Uploader(not_null api) stopSessionsTimer.setSingleShot(true); connect(&stopSessionsTimer, SIGNAL(timeout()), this, SLOT(stopSessions())); + const auto session = &_api->session(); photoReady( ) | rpl::start_with_next([=](const UploadedPhoto &data) { if (data.edit) { - _api->editUploadedFile( - data.fullId, - data.file, - std::nullopt, - data.options, - false); + const auto item = session->data().message(data.fullId); + Api::EditMessageWithUploadedPhoto(item, data.file, data.options); } else { _api->sendUploadedPhoto( data.fullId, @@ -176,12 +174,12 @@ Uploader::Uploader(not_null api) documentReady( ) | rpl::start_with_next([=](const UploadedDocument &data) { if (data.edit) { - _api->editUploadedFile( - data.fullId, + const auto item = session->data().message(data.fullId); + Api::EditMessageWithUploadedDocument( + item, data.file, std::nullopt, - data.options, - true); + data.options); } else { _api->sendUploadedDocument( data.fullId, @@ -194,12 +192,12 @@ Uploader::Uploader(not_null api) thumbDocumentReady( ) | rpl::start_with_next([=](const UploadedThumbDocument &data) { if (data.edit) { - _api->editUploadedFile( - data.fullId, + const auto item = session->data().message(data.fullId); + Api::EditMessageWithUploadedDocument( + item, data.file, data.thumb, - data.options, - true); + data.options); } else { _api->sendUploadedDocument( data.fullId,