From b6fb3f89d6769322c5b50f181bb025919d7de254 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Tue, 14 Jul 2020 19:23:39 +0300 Subject: [PATCH] Fix multi-forward grouping bug --- .../SourceFiles/window/window_peer_menu.cpp | 94 ++++++++++++------- 1 file changed, 62 insertions(+), 32 deletions(-) diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 4ca0e7c34..21f341a5a 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1044,12 +1044,16 @@ QPointer ShowForwardMessagesBox( base::flat_set requests; FnMut submitCallback; }; + struct MsgIdsGroup { + HistoryItemsList items; + QVector ids; + bool grouped = false; + }; const auto weak = std::make_shared>(); const auto firstItem = navigation->session().data().message(items[0]); const auto history = firstItem->history(); const auto owner = &history->owner(); const auto session = &history->session(); - const auto isGroup = (owner->groups().find(firstItem) != nullptr); const auto isGame = firstItem->getMessageBot() && firstItem->media() && (firstItem->media()->game() != nullptr); @@ -1116,22 +1120,46 @@ QPointer ShowForwardMessagesBox( const auto sendFlags = MTPmessages_ForwardMessages::Flag(0) | MTPmessages_ForwardMessages::Flag::f_with_my_score - | (isGroup - ? MTPmessages_ForwardMessages::Flag::f_grouped - : MTPmessages_ForwardMessages::Flag(0)) | (options.silent ? MTPmessages_ForwardMessages::Flag::f_silent : MTPmessages_ForwardMessages::Flag(0)) | (options.scheduled ? MTPmessages_ForwardMessages::Flag::f_schedule_date : MTPmessages_ForwardMessages::Flag(0)); - auto msgIds = QVector(); - msgIds.reserve(data->msgIds.size()); + const auto groupedSendFlags = sendFlags | MTPmessages_ForwardMessages::Flag::f_grouped; + + auto groupedMsgIds = QVector(); for (const auto fullId : data->msgIds) { - msgIds.push_back(MTP_int(fullId.msg)); + auto item = navigation->session().data().message(fullId); + auto group = owner->groups().find(item); + + if (!groupedMsgIds.size()) { + MsgIdsGroup msgIdGroupInst; + msgIdGroupInst.items.push_back(item); + msgIdGroupInst.ids.push_back(MTP_int(fullId.msg)); + if (group != nullptr) { + msgIdGroupInst.grouped = true; + } + groupedMsgIds.push_back(msgIdGroupInst); + } else { + auto prevItem = groupedMsgIds.back().items.back(); + auto prevGroup = owner->groups().find(prevItem); + if (prevGroup == group) { + groupedMsgIds.back().items.push_back(item); + groupedMsgIds.back().ids.push_back(MTP_int(fullId.msg)); + } else { + MsgIdsGroup msgIdGroupInst; + msgIdGroupInst.items.push_back(item); + msgIdGroupInst.ids.push_back(MTP_int(fullId.msg)); + if (group != nullptr) { + msgIdGroupInst.grouped = true; + } + groupedMsgIds.push_back(msgIdGroupInst); + } + } } - auto generateRandom = [&] { - auto result = QVector(data->msgIds.size()); + auto generateRandom = [&] (int size) { + auto result = QVector(size); for (auto &value : result) { value = rand_value(); } @@ -1149,29 +1177,31 @@ QPointer ShowForwardMessagesBox( message.action.clearDraft = false; api.sendMessage(std::move(message)); } - histories.sendRequest(history, requestType, [=](Fn finish) { - auto &api = history->session().api(); - history->sendRequestId = api.request(MTPmessages_ForwardMessages( - MTP_flags(sendFlags), - data->peer->input, - MTP_vector(msgIds), - MTP_vector(generateRandom()), - peer->input, - MTP_int(options.scheduled) - )).done([=](const MTPUpdates &updates, mtpRequestId requestId) { - history->session().api().applyUpdates(updates); - data->requests.remove(requestId); - if (data->requests.empty()) { - Ui::Toast::Show(tr::lng_share_done(tr::now)); - Ui::hideLayer(); - } - finish(); - }).fail([=](const RPCError &error) { - finish(); - }).afterRequest(history->sendRequestId).send(); - return history->sendRequestId; - }); - data->requests.insert(history->sendRequestId); + for (auto group : groupedMsgIds) { + histories.sendRequest(history, requestType, [=](Fn finish) { + auto &api = history->session().api(); + history->sendRequestId = api.request(MTPmessages_ForwardMessages( + MTP_flags(group.grouped ? groupedSendFlags : sendFlags), + data->peer->input, + MTP_vector(group.ids), + MTP_vector(generateRandom(group.ids.size())), + peer->input, + MTP_int(options.scheduled) + )).done([=](const MTPUpdates &updates, mtpRequestId requestId) { + history->session().api().applyUpdates(updates); + data->requests.remove(requestId); + if (data->requests.empty()) { + Ui::Toast::Show(tr::lng_share_done(tr::now)); + Ui::hideLayer(); + } + finish(); + }).fail([=](const RPCError &error) { + finish(); + }).afterRequest(history->sendRequestId).send(); + return history->sendRequestId; + }); + data->requests.insert(history->sendRequestId); + } } if (data->submitCallback && !cForwardRetainSelection()) { data->submitCallback();