Fix multi-forward grouping bug
This commit is contained in:
parent
27767caf9d
commit
b6fb3f89d6
1 changed files with 62 additions and 32 deletions
|
|
@ -1044,12 +1044,16 @@ QPointer<Ui::RpWidget> ShowForwardMessagesBox(
|
||||||
base::flat_set<mtpRequestId> requests;
|
base::flat_set<mtpRequestId> requests;
|
||||||
FnMut<void()> submitCallback;
|
FnMut<void()> submitCallback;
|
||||||
};
|
};
|
||||||
|
struct MsgIdsGroup {
|
||||||
|
HistoryItemsList items;
|
||||||
|
QVector<MTPint> ids;
|
||||||
|
bool grouped = false;
|
||||||
|
};
|
||||||
const auto weak = std::make_shared<QPointer<ShareBox>>();
|
const auto weak = std::make_shared<QPointer<ShareBox>>();
|
||||||
const auto firstItem = navigation->session().data().message(items[0]);
|
const auto firstItem = navigation->session().data().message(items[0]);
|
||||||
const auto history = firstItem->history();
|
const auto history = firstItem->history();
|
||||||
const auto owner = &history->owner();
|
const auto owner = &history->owner();
|
||||||
const auto session = &history->session();
|
const auto session = &history->session();
|
||||||
const auto isGroup = (owner->groups().find(firstItem) != nullptr);
|
|
||||||
const auto isGame = firstItem->getMessageBot()
|
const auto isGame = firstItem->getMessageBot()
|
||||||
&& firstItem->media()
|
&& firstItem->media()
|
||||||
&& (firstItem->media()->game() != nullptr);
|
&& (firstItem->media()->game() != nullptr);
|
||||||
|
|
@ -1116,22 +1120,46 @@ QPointer<Ui::RpWidget> ShowForwardMessagesBox(
|
||||||
|
|
||||||
const auto sendFlags = MTPmessages_ForwardMessages::Flag(0)
|
const auto sendFlags = MTPmessages_ForwardMessages::Flag(0)
|
||||||
| MTPmessages_ForwardMessages::Flag::f_with_my_score
|
| MTPmessages_ForwardMessages::Flag::f_with_my_score
|
||||||
| (isGroup
|
|
||||||
? MTPmessages_ForwardMessages::Flag::f_grouped
|
|
||||||
: MTPmessages_ForwardMessages::Flag(0))
|
|
||||||
| (options.silent
|
| (options.silent
|
||||||
? MTPmessages_ForwardMessages::Flag::f_silent
|
? MTPmessages_ForwardMessages::Flag::f_silent
|
||||||
: MTPmessages_ForwardMessages::Flag(0))
|
: MTPmessages_ForwardMessages::Flag(0))
|
||||||
| (options.scheduled
|
| (options.scheduled
|
||||||
? MTPmessages_ForwardMessages::Flag::f_schedule_date
|
? MTPmessages_ForwardMessages::Flag::f_schedule_date
|
||||||
: MTPmessages_ForwardMessages::Flag(0));
|
: MTPmessages_ForwardMessages::Flag(0));
|
||||||
auto msgIds = QVector<MTPint>();
|
const auto groupedSendFlags = sendFlags | MTPmessages_ForwardMessages::Flag::f_grouped;
|
||||||
msgIds.reserve(data->msgIds.size());
|
|
||||||
|
auto groupedMsgIds = QVector<MsgIdsGroup>();
|
||||||
for (const auto fullId : data->msgIds) {
|
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 generateRandom = [&] (int size) {
|
||||||
auto result = QVector<MTPlong>(data->msgIds.size());
|
auto result = QVector<MTPlong>(size);
|
||||||
for (auto &value : result) {
|
for (auto &value : result) {
|
||||||
value = rand_value<MTPlong>();
|
value = rand_value<MTPlong>();
|
||||||
}
|
}
|
||||||
|
|
@ -1149,29 +1177,31 @@ QPointer<Ui::RpWidget> ShowForwardMessagesBox(
|
||||||
message.action.clearDraft = false;
|
message.action.clearDraft = false;
|
||||||
api.sendMessage(std::move(message));
|
api.sendMessage(std::move(message));
|
||||||
}
|
}
|
||||||
histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
|
for (auto group : groupedMsgIds) {
|
||||||
auto &api = history->session().api();
|
histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
|
||||||
history->sendRequestId = api.request(MTPmessages_ForwardMessages(
|
auto &api = history->session().api();
|
||||||
MTP_flags(sendFlags),
|
history->sendRequestId = api.request(MTPmessages_ForwardMessages(
|
||||||
data->peer->input,
|
MTP_flags(group.grouped ? groupedSendFlags : sendFlags),
|
||||||
MTP_vector<MTPint>(msgIds),
|
data->peer->input,
|
||||||
MTP_vector<MTPlong>(generateRandom()),
|
MTP_vector<MTPint>(group.ids),
|
||||||
peer->input,
|
MTP_vector<MTPlong>(generateRandom(group.ids.size())),
|
||||||
MTP_int(options.scheduled)
|
peer->input,
|
||||||
)).done([=](const MTPUpdates &updates, mtpRequestId requestId) {
|
MTP_int(options.scheduled)
|
||||||
history->session().api().applyUpdates(updates);
|
)).done([=](const MTPUpdates &updates, mtpRequestId requestId) {
|
||||||
data->requests.remove(requestId);
|
history->session().api().applyUpdates(updates);
|
||||||
if (data->requests.empty()) {
|
data->requests.remove(requestId);
|
||||||
Ui::Toast::Show(tr::lng_share_done(tr::now));
|
if (data->requests.empty()) {
|
||||||
Ui::hideLayer();
|
Ui::Toast::Show(tr::lng_share_done(tr::now));
|
||||||
}
|
Ui::hideLayer();
|
||||||
finish();
|
}
|
||||||
}).fail([=](const RPCError &error) {
|
finish();
|
||||||
finish();
|
}).fail([=](const RPCError &error) {
|
||||||
}).afterRequest(history->sendRequestId).send();
|
finish();
|
||||||
return history->sendRequestId;
|
}).afterRequest(history->sendRequestId).send();
|
||||||
});
|
return history->sendRequestId;
|
||||||
data->requests.insert(history->sendRequestId);
|
});
|
||||||
|
data->requests.insert(history->sendRequestId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (data->submitCallback && !cForwardRetainSelection()) {
|
if (data->submitCallback && !cForwardRetainSelection()) {
|
||||||
data->submitCallback();
|
data->submitCallback();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue