Forward messages in two passes.
This commit is contained in:
parent
398c7cfd52
commit
da1f073e22
@ -25344,6 +25344,12 @@ Result<vector<MessageId>> MessagesManager::forward_messages(DialogId to_dialog_i
|
|||||||
};
|
};
|
||||||
vector<CopiedMessage> copied_messages;
|
vector<CopiedMessage> copied_messages;
|
||||||
|
|
||||||
|
struct ForwardedMessageContent {
|
||||||
|
unique_ptr<MessageContent> content;
|
||||||
|
size_t index;
|
||||||
|
};
|
||||||
|
vector<ForwardedMessageContent> forwarded_message_contents;
|
||||||
|
|
||||||
std::unordered_map<int64, std::pair<int64, int32>> new_media_album_ids;
|
std::unordered_map<int64, std::pair<int64, int32>> new_media_album_ids;
|
||||||
|
|
||||||
auto my_id = td_->contacts_manager_->get_my_id();
|
auto my_id = td_->contacts_manager_->get_my_id();
|
||||||
@ -25351,7 +25357,7 @@ Result<vector<MessageId>> MessagesManager::forward_messages(DialogId to_dialog_i
|
|||||||
for (size_t i = 0; i < message_ids.size(); i++) {
|
for (size_t i = 0; i < message_ids.size(); i++) {
|
||||||
MessageId message_id = get_persistent_message_id(from_dialog, message_ids[i]);
|
MessageId message_id = get_persistent_message_id(from_dialog, message_ids[i]);
|
||||||
|
|
||||||
Message *forwarded_message = get_message_force(from_dialog, message_id, "forward_messages");
|
const Message *forwarded_message = get_message_force(from_dialog, message_id, "forward_messages");
|
||||||
if (forwarded_message == nullptr) {
|
if (forwarded_message == nullptr) {
|
||||||
LOG(INFO) << "Can't find " << message_id << " to forward";
|
LOG(INFO) << "Can't find " << message_id << " to forward";
|
||||||
continue;
|
continue;
|
||||||
@ -25410,9 +25416,17 @@ Result<vector<MessageId>> MessagesManager::forward_messages(DialogId to_dialog_i
|
|||||||
copied_messages.push_back({std::move(content), top_thread_message_id, reply_to_message_id,
|
copied_messages.push_back({std::move(content), top_thread_message_id, reply_to_message_id,
|
||||||
std::move(reply_markup), forwarded_message->media_album_id,
|
std::move(reply_markup), forwarded_message->media_album_id,
|
||||||
get_message_disable_web_page_preview(forwarded_message), i});
|
get_message_disable_web_page_preview(forwarded_message), i});
|
||||||
continue;
|
} else {
|
||||||
|
forwarded_message_contents.push_back({std::move(content), i});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t j = 0; j < forwarded_message_contents.size(); j++) {
|
||||||
|
MessageId message_id = get_persistent_message_id(from_dialog, message_ids[forwarded_message_contents[j].index]);
|
||||||
|
const Message *forwarded_message = get_message_force(from_dialog, message_id, "forward_messages");
|
||||||
|
CHECK(forwarded_message != nullptr);
|
||||||
|
|
||||||
|
auto content = std::move(forwarded_message_contents[j].content);
|
||||||
auto content_type = content->get_type();
|
auto content_type = content->get_type();
|
||||||
bool is_game = content_type == MessageContentType::Game;
|
bool is_game = content_type == MessageContentType::Game;
|
||||||
unique_ptr<MessageForwardInfo> forward_info;
|
unique_ptr<MessageForwardInfo> forward_info;
|
||||||
@ -25453,17 +25467,13 @@ Result<vector<MessageId>> MessagesManager::forward_messages(DialogId to_dialog_i
|
|||||||
}
|
}
|
||||||
|
|
||||||
Message *m = get_message_to_send(to_dialog, MessageId(), MessageId(), message_send_options, std::move(content),
|
Message *m = get_message_to_send(to_dialog, MessageId(), MessageId(), message_send_options, std::move(content),
|
||||||
&need_update_dialog_pos, i + 1 != message_ids.size(), std::move(forward_info));
|
&need_update_dialog_pos, j + 1 != forwarded_message_contents.size(),
|
||||||
|
std::move(forward_info));
|
||||||
m->real_forward_from_dialog_id = from_dialog_id;
|
m->real_forward_from_dialog_id = from_dialog_id;
|
||||||
m->real_forward_from_message_id = message_id;
|
m->real_forward_from_message_id = message_id;
|
||||||
m->via_bot_user_id = forwarded_message->via_bot_user_id;
|
m->via_bot_user_id = forwarded_message->via_bot_user_id;
|
||||||
m->in_game_share = in_game_share;
|
m->in_game_share = in_game_share;
|
||||||
m->media_album_id = forwarded_message->media_album_id;
|
m->media_album_id = new_media_album_ids[forwarded_message->media_album_id].first;
|
||||||
if (forwarded_message->view_count > 0 && is_broadcast_channel(from_dialog_id)) {
|
|
||||||
forwarded_message->forward_count++;
|
|
||||||
send_update_message_interaction_info(from_dialog_id, forwarded_message);
|
|
||||||
on_message_changed(from_dialog, forwarded_message, true, "forward_messages");
|
|
||||||
}
|
|
||||||
if (forwarded_message->view_count > 0 && m->forward_info != nullptr && m->view_count == 0 &&
|
if (forwarded_message->view_count > 0 && m->forward_info != nullptr && m->view_count == 0 &&
|
||||||
!(m->message_id.is_scheduled() && is_broadcast_channel(to_dialog_id))) {
|
!(m->message_id.is_scheduled() && is_broadcast_channel(to_dialog_id))) {
|
||||||
m->view_count = forwarded_message->view_count;
|
m->view_count = forwarded_message->view_count;
|
||||||
@ -25511,20 +25521,14 @@ Result<vector<MessageId>> MessagesManager::forward_messages(DialogId to_dialog_i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result[i] = m->message_id;
|
send_update_new_message(to_dialog, m);
|
||||||
|
|
||||||
|
result[forwarded_message_contents[j].index] = m->message_id;
|
||||||
forwarded_messages.push_back(m);
|
forwarded_messages.push_back(m);
|
||||||
forwarded_message_ids.push_back(message_id);
|
forwarded_message_ids.push_back(message_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!forwarded_messages.empty()) {
|
if (!forwarded_messages.empty()) {
|
||||||
for (auto m : forwarded_messages) {
|
|
||||||
if (m->media_album_id != 0) {
|
|
||||||
m->media_album_id = new_media_album_ids[m->media_album_id].first;
|
|
||||||
}
|
|
||||||
|
|
||||||
send_update_new_message(to_dialog, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
do_forward_messages(to_dialog_id, from_dialog_id, forwarded_messages, forwarded_message_ids, 0);
|
do_forward_messages(to_dialog_id, from_dialog_id, forwarded_messages, forwarded_message_ids, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user