From 5c097887efb2f2182014d765e05680372c82eb9c Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 30 May 2020 11:47:32 +0300 Subject: [PATCH] Added ability to edit media in scheduled messages. --- Telegram/SourceFiles/api/api_editing.cpp | 3 +- Telegram/SourceFiles/api/api_editing.h | 1 + Telegram/SourceFiles/api/api_sending.cpp | 2 + .../SourceFiles/boxes/edit_caption_box.cpp | 10 +++- Telegram/SourceFiles/data/data_groups.cpp | 2 +- .../SourceFiles/history/history_message.cpp | 3 +- .../view/history_view_context_menu.cpp | 58 ++++++++++++++++--- Telegram/SourceFiles/mainwidget.cpp | 10 ++-- .../SourceFiles/storage/localimageloader.cpp | 3 +- 9 files changed, 73 insertions(+), 19 deletions(-) diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 0bd4835e7..f0f0d4cd2 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -187,9 +187,10 @@ void EditMessageWithUploadedPhoto( mtpRequestId EditCaption( not_null item, const TextWithEntities &caption, + SendOptions options, Fn done, Fn fail) { - return EditMessage(item, caption, SendOptions(), done, fail); + return EditMessage(item, caption, options, done, fail); } mtpRequestId EditTextMessage( diff --git a/Telegram/SourceFiles/api/api_editing.h b/Telegram/SourceFiles/api/api_editing.h index b5ec23b92..d433aa0ae 100644 --- a/Telegram/SourceFiles/api/api_editing.h +++ b/Telegram/SourceFiles/api/api_editing.h @@ -38,6 +38,7 @@ void EditMessageWithUploadedPhoto( mtpRequestId EditCaption( not_null item, const TextWithEntities &caption, + SendOptions options, Fn done, Fn fail); diff --git a/Telegram/SourceFiles/api/api_sending.cpp b/Telegram/SourceFiles/api/api_sending.cpp index e88f124db..9eb036ce7 100644 --- a/Telegram/SourceFiles/api/api_sending.cpp +++ b/Telegram/SourceFiles/api/api_sending.cpp @@ -400,6 +400,8 @@ void SendConfirmedFile( } if (file->to.options.scheduled) { flags |= MTPDmessage::Flag::f_from_scheduled; + // Scheduled messages have no the 'edited' badge. + flags |= MTPDmessage::Flag::f_edit_hide; } else { clientFlags |= MTPDmessage_ClientFlag::f_local_history_entry; } diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 755805c86..8544806ca 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -936,12 +936,18 @@ void EditCaptionBox::save() { TextUtilities::ConvertTextTagsToEntities(textWithTags.tags) }; + auto options = Api::SendOptions(); + options.scheduled = item->isScheduled() ? item->date() : 0; + if (!_preparedList.files.empty()) { + auto action = Api::SendAction(item->history()); + action.options = options; + _controller->session().api().editMedia( std::move(_preparedList), (!_asFile && _photo) ? SendMediaType::Photo : SendMediaType::File, _field->getTextWithAppliedMarkdown(), - Api::SendAction(item->history()), + action, item->fullId().msg); closeBox(); return; @@ -977,7 +983,7 @@ void EditCaptionBox::save() { } }); - _saveRequestId = Api::EditCaption(item, sending, done, fail); + _saveRequestId = Api::EditCaption(item, sending, options, done, fail); } void EditCaptionBox::setName(QString nameString, qint64 size) { diff --git a/Telegram/SourceFiles/data/data_groups.cpp b/Telegram/SourceFiles/data/data_groups.cpp index 10a43467a..25968975f 100644 --- a/Telegram/SourceFiles/data/data_groups.cpp +++ b/Telegram/SourceFiles/data/data_groups.cpp @@ -71,7 +71,7 @@ void Groups::refreshMessage( unregisterMessage(item); return; } - if (!IsServerMsgId(item->id)) { + if (!IsServerMsgId(item->id) && !item->isScheduled()) { return; } const auto groupId = item->groupId(); diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index b4353a366..9a6d8fa08 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -774,11 +774,12 @@ bool HistoryMessage::allowsForward() const { } bool HistoryMessage::allowsSendNow() const { - return isScheduled() && !isSending() && !hasFailed(); + return isScheduled() && !isSending() && !hasFailed() && !isEditingMedia(); } bool HistoryMessage::isTooOldForEdit(TimeId now) const { return !_history->peer->canEditMessagesIndefinitely() + && !isScheduled() && (now - date() >= _history->session().serverConfig().editTimeLimit); } diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 0dd10bb9f..48e4c552e 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_context_menu.h" #include "api/api_editing.h" +#include "base/unixtime.h" #include "history/view/history_view_list_widget.h" #include "history/view/history_view_cursor_state.h" #include "history/history.h" @@ -23,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/ui_utility.h" #include "chat_helpers/message_field.h" #include "boxes/confirm_box.h" +#include "boxes/edit_caption_box.h" #include "boxes/sticker_set_box.h" #include "data/data_photo.h" #include "data/data_photo_media.h" @@ -74,6 +76,23 @@ MsgId ItemIdAcrossData(not_null item) { return session->data().scheduledMessages().lookupId(item); } +bool HasEditScheduledMessageAction(const ContextMenuRequest &request) { + const auto item = request.item; + if (!item + || item->isSending() + || item->isEditingMedia() + || !request.selectedItems.empty()) { + return false; + } + const auto peer = item->history()->peer; + if (const auto channel = peer->asChannel()) { + if (!channel->canEditMessages()) { + return false; + } + } + return true; +} + void SavePhotoToFile(not_null photo) { const auto media = photo->activeMediaView(); if (photo->isNull() || !media || !media->loaded()) { @@ -397,16 +416,10 @@ bool AddSendNowMessageAction( bool AddRescheduleMessageAction( not_null menu, const ContextMenuRequest &request) { - const auto item = request.item; - if (!item || item->isSending() || !request.selectedItems.empty()) { + if (!HasEditScheduledMessageAction(request)) { return false; } - const auto peer = item->history()->peer; - if (const auto channel = peer->asChannel()) { - if (!channel->canEditMessages()) { - return false; - } - } + const auto item = request.item; const auto owner = &item->history()->owner(); const auto itemId = item->fullId(); menu->addAction(tr::lng_context_reschedule(tr::now), [=] { @@ -421,6 +434,7 @@ bool AddRescheduleMessageAction( Api::RescheduleMessage(item, options); }; + const auto peer = item->history()->peer; const auto sendMenuType = !peer ? SendMenuType::Disabled : peer->isSelf() @@ -445,6 +459,33 @@ bool AddRescheduleMessageAction( return true; } +bool AddEditMessageAction( + not_null menu, + const ContextMenuRequest &request, + not_null list) { + if (!HasEditScheduledMessageAction(request)) { + return false; + } + const auto item = request.item; + if (!item->allowsEdit(base::unixtime::now())) { + return false; + } + const auto owner = &item->history()->owner(); + const auto itemId = item->fullId(); + menu->addAction(tr::lng_context_edit_msg(tr::now), [=] { + const auto item = owner->message(itemId); + if (!item) { + return; + } + if (!item->media() || !item->media()->allowsEditCaption()) { + return; + } + + Ui::show(Box(App::wnd()->sessionController(), item)); + }); + return true; +} + void AddSendNowAction( not_null menu, const ContextMenuRequest &request, @@ -590,6 +631,7 @@ void AddMessageActions( not_null menu, const ContextMenuRequest &request, not_null list) { + AddEditMessageAction(menu, request, list); AddPostLinkAction(menu, request); AddForwardAction(menu, request, list); AddSendNowAction(menu, request, list); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 6cf9d13fd..89cfa644e 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -706,16 +706,16 @@ void MainWidget::cancelUploadLayer(not_null item) { session().uploader().pause(itemId); const auto stopUpload = [=] { Ui::hideLayer(); - if (const auto item = session().data().message(itemId)) { - const auto history = item->history(); - if (!IsServerMsgId(itemId.msg)) { + auto &data = session().data(); + if (const auto item = data.message(itemId)) { + if (!item->isEditingMedia()) { item->destroy(); - history->requestChatListMessage(); + item->history()->requestChatListMessage(); } else { item->returnSavedMedia(); session().uploader().cancel(item->fullId()); } - session().data().sendHistoryChangeNotifications(); + data.sendHistoryChangeNotifications(); } session().uploader().unpause(); }; diff --git a/Telegram/SourceFiles/storage/localimageloader.cpp b/Telegram/SourceFiles/storage/localimageloader.cpp index 15f576e5a..cc7f132c9 100644 --- a/Telegram/SourceFiles/storage/localimageloader.cpp +++ b/Telegram/SourceFiles/storage/localimageloader.cpp @@ -497,7 +497,8 @@ FileLoadTask::FileLoadTask( , _type(type) , _caption(caption) , _msgIdToEdit(msgIdToEdit) { - Expects(_msgIdToEdit == 0 || IsServerMsgId(_msgIdToEdit)); + Expects(to.options.scheduled + || (_msgIdToEdit == 0 || IsServerMsgId(_msgIdToEdit))); } FileLoadTask::FileLoadTask(