Keep reply_to_message_id for yet unsent messages between restarts.
This commit is contained in:
parent
190117c839
commit
26ceefb2d4
@ -15696,8 +15696,7 @@ unique_ptr<MessagesManager::Message> MessagesManager::delete_message(Dialog *d,
|
|||||||
|
|
||||||
void MessagesManager::add_random_id_to_message_id_correspondence(Dialog *d, int64 random_id, MessageId message_id) {
|
void MessagesManager::add_random_id_to_message_id_correspondence(Dialog *d, int64 random_id, MessageId message_id) {
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
CHECK(d->dialog_id.get_type() == DialogType::SecretChat);
|
CHECK(d->dialog_id.get_type() == DialogType::SecretChat || message_id.is_yet_unsent());
|
||||||
CHECK(message_id.is_valid());
|
|
||||||
auto it = d->random_id_to_message_id.find(random_id);
|
auto it = d->random_id_to_message_id.find(random_id);
|
||||||
if (it == d->random_id_to_message_id.end() || it->second < message_id) {
|
if (it == d->random_id_to_message_id.end() || it->second < message_id) {
|
||||||
LOG(INFO) << "Add correspondence from random_id " << random_id << " to " << message_id << " in " << d->dialog_id;
|
LOG(INFO) << "Add correspondence from random_id " << random_id << " to " << message_id << " in " << d->dialog_id;
|
||||||
@ -15707,8 +15706,7 @@ void MessagesManager::add_random_id_to_message_id_correspondence(Dialog *d, int6
|
|||||||
|
|
||||||
void MessagesManager::delete_random_id_to_message_id_correspondence(Dialog *d, int64 random_id, MessageId message_id) {
|
void MessagesManager::delete_random_id_to_message_id_correspondence(Dialog *d, int64 random_id, MessageId message_id) {
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
CHECK(d->dialog_id.get_type() == DialogType::SecretChat);
|
CHECK(d->dialog_id.get_type() == DialogType::SecretChat || message_id.is_yet_unsent());
|
||||||
CHECK(message_id.is_valid());
|
|
||||||
auto it = d->random_id_to_message_id.find(random_id);
|
auto it = d->random_id_to_message_id.find(random_id);
|
||||||
if (it != d->random_id_to_message_id.end() && it->second == message_id) {
|
if (it != d->random_id_to_message_id.end() && it->second == message_id) {
|
||||||
LOG(INFO) << "Delete correspondence from random_id " << random_id << " to " << message_id << " in " << d->dialog_id;
|
LOG(INFO) << "Delete correspondence from random_id " << random_id << " to " << message_id << " in " << d->dialog_id;
|
||||||
@ -16168,7 +16166,8 @@ void MessagesManager::on_message_deleted(Dialog *d, Message *m, bool is_permanen
|
|||||||
|
|
||||||
cancel_send_deleted_message(d->dialog_id, m, is_permanently_deleted);
|
cancel_send_deleted_message(d->dialog_id, m, is_permanently_deleted);
|
||||||
|
|
||||||
switch (d->dialog_id.get_type()) {
|
auto dialog_type = d->dialog_id.get_type();
|
||||||
|
switch (dialog_type) {
|
||||||
case DialogType::User:
|
case DialogType::User:
|
||||||
case DialogType::Chat:
|
case DialogType::Chat:
|
||||||
if (m->message_id.is_server()) {
|
if (m->message_id.is_server()) {
|
||||||
@ -16176,10 +16175,8 @@ void MessagesManager::on_message_deleted(Dialog *d, Message *m, bool is_permanen
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DialogType::Channel:
|
case DialogType::Channel:
|
||||||
// nothing to do
|
|
||||||
break;
|
|
||||||
case DialogType::SecretChat:
|
case DialogType::SecretChat:
|
||||||
delete_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
// nothing to do
|
||||||
break;
|
break;
|
||||||
case DialogType::None:
|
case DialogType::None:
|
||||||
default:
|
default:
|
||||||
@ -16193,6 +16190,9 @@ void MessagesManager::on_message_deleted(Dialog *d, Message *m, bool is_permanen
|
|||||||
if (m->notification_id.is_valid()) {
|
if (m->notification_id.is_valid()) {
|
||||||
delete_notification_id_to_message_id_correspondence(d, m->notification_id, m->message_id);
|
delete_notification_id_to_message_id_correspondence(d, m->notification_id, m->message_id);
|
||||||
}
|
}
|
||||||
|
if (m->message_id.is_yet_unsent() || dialog_type == DialogType::SecretChat) {
|
||||||
|
delete_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
||||||
|
}
|
||||||
|
|
||||||
added_message_count_--;
|
added_message_count_--;
|
||||||
}
|
}
|
||||||
@ -24476,11 +24476,12 @@ bool MessagesManager::get_dialog_silent_send_message(DialogId dialog_id) const {
|
|||||||
return d->notification_settings.silent_send_message;
|
return d->notification_settings.silent_send_message;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 MessagesManager::generate_new_random_id() {
|
int64 MessagesManager::generate_new_random_id(const Dialog *d) {
|
||||||
int64 random_id;
|
int64 random_id;
|
||||||
do {
|
do {
|
||||||
random_id = Random::secure_int64();
|
random_id = Random::secure_int64();
|
||||||
} while (random_id == 0 || being_sent_messages_.count(random_id) > 0);
|
} while (random_id == 0 || being_sent_messages_.count(random_id) > 0 ||
|
||||||
|
d->random_id_to_message_id.count(random_id) > 0);
|
||||||
return random_id;
|
return random_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24590,16 +24591,18 @@ unique_ptr<MessagesManager::Message> MessagesManager::create_message_to_send(
|
|||||||
m->ttl = 0;
|
m->ttl = 0;
|
||||||
}
|
}
|
||||||
m->is_content_secret = is_secret_message_content(m->ttl, m->content->get_type());
|
m->is_content_secret = is_secret_message_content(m->ttl, m->content->get_type());
|
||||||
if (reply_to_message_id.is_valid()) {
|
}
|
||||||
|
if ((reply_to_message_id.is_valid() || reply_to_message_id.is_valid_scheduled()) &&
|
||||||
|
(dialog_type == DialogType::SecretChat || reply_to_message_id.is_yet_unsent())) {
|
||||||
// the message was forcely preloaded in get_reply_to_message_id
|
// the message was forcely preloaded in get_reply_to_message_id
|
||||||
auto *reply_to_message = get_message(d, reply_to_message_id);
|
auto *reply_to_message = get_message(d, reply_to_message_id);
|
||||||
if (reply_to_message != nullptr) {
|
if (reply_to_message == nullptr || (reply_to_message->message_id.is_yet_unsent() && is_scheduled)) {
|
||||||
m->reply_to_random_id = reply_to_message->random_id;
|
|
||||||
} else {
|
|
||||||
m->reply_to_message_id = MessageId();
|
m->reply_to_message_id = MessageId();
|
||||||
|
} else {
|
||||||
|
m->reply_to_random_id = reply_to_message->random_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24619,7 +24622,7 @@ MessagesManager::Message *MessagesManager::get_message_to_send(
|
|||||||
message->have_previous = true;
|
message->have_previous = true;
|
||||||
message->have_next = true;
|
message->have_next = true;
|
||||||
|
|
||||||
message->random_id = generate_new_random_id();
|
message->random_id = generate_new_random_id(d);
|
||||||
|
|
||||||
bool need_update = false;
|
bool need_update = false;
|
||||||
CHECK(have_input_peer(d->dialog_id, AccessRights::Read));
|
CHECK(have_input_peer(d->dialog_id, AccessRights::Read));
|
||||||
@ -30797,10 +30800,11 @@ void MessagesManager::on_send_message_file_part_missing(int64 random_id, int bad
|
|||||||
Dialog *d = get_dialog(dialog_id);
|
Dialog *d = get_dialog(dialog_id);
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
|
|
||||||
// need to change message random_id before resending
|
delete_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
||||||
m->random_id = generate_new_random_id();
|
|
||||||
|
// need to change message random_id before resending
|
||||||
|
m->random_id = generate_new_random_id(d);
|
||||||
|
|
||||||
delete_random_id_to_message_id_correspondence(d, random_id, m->message_id);
|
|
||||||
add_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
add_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
||||||
|
|
||||||
auto log_event = SendMessageLogEvent(dialog_id, m);
|
auto log_event = SendMessageLogEvent(dialog_id, m);
|
||||||
@ -30846,10 +30850,11 @@ void MessagesManager::on_send_message_file_reference_error(int64 random_id) {
|
|||||||
Dialog *d = get_dialog(dialog_id);
|
Dialog *d = get_dialog(dialog_id);
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
|
|
||||||
// need to change message random_id before resending
|
delete_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
||||||
m->random_id = generate_new_random_id();
|
|
||||||
|
// need to change message random_id before resending
|
||||||
|
m->random_id = generate_new_random_id(d);
|
||||||
|
|
||||||
delete_random_id_to_message_id_correspondence(d, random_id, m->message_id);
|
|
||||||
add_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
add_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
||||||
|
|
||||||
auto log_event = SendMessageLogEvent(dialog_id, m);
|
auto log_event = SendMessageLogEvent(dialog_id, m);
|
||||||
@ -34551,7 +34556,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
// nothing to do
|
// nothing to do
|
||||||
break;
|
break;
|
||||||
case DialogType::SecretChat:
|
case DialogType::SecretChat:
|
||||||
add_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
|
||||||
break;
|
break;
|
||||||
case DialogType::None:
|
case DialogType::None:
|
||||||
default:
|
default:
|
||||||
@ -34561,6 +34565,9 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
if (m->notification_id.is_valid()) {
|
if (m->notification_id.is_valid()) {
|
||||||
add_notification_id_to_message_id_correspondence(d, m->notification_id, m->message_id);
|
add_notification_id_to_message_id_correspondence(d, m->notification_id, m->message_id);
|
||||||
}
|
}
|
||||||
|
if (m->message_id.is_yet_unsent() || dialog_type == DialogType::SecretChat) {
|
||||||
|
add_random_id_to_message_id_correspondence(d, m->random_id, m->message_id);
|
||||||
|
}
|
||||||
|
|
||||||
try_add_bot_command_message_id(dialog_id, m);
|
try_add_bot_command_message_id(dialog_id, m);
|
||||||
|
|
||||||
|
@ -1349,7 +1349,7 @@ class MessagesManager final : public Actor {
|
|||||||
int32 pending_read_channel_inbox_pts = 0; // for channels only
|
int32 pending_read_channel_inbox_pts = 0; // for channels only
|
||||||
int32 pending_read_channel_inbox_server_unread_count = 0; // for channels only
|
int32 pending_read_channel_inbox_server_unread_count = 0; // for channels only
|
||||||
MessageId pending_read_channel_inbox_max_message_id; // for channels only
|
MessageId pending_read_channel_inbox_max_message_id; // for channels only
|
||||||
std::unordered_map<int64, MessageId> random_id_to_message_id; // for secret chats only
|
std::unordered_map<int64, MessageId> random_id_to_message_id; // for secret chats and yet unsent messages only
|
||||||
|
|
||||||
MessageId last_assigned_message_id; // identifier of the last local or yet unsent message, assigned after
|
MessageId last_assigned_message_id; // identifier of the last local or yet unsent message, assigned after
|
||||||
// application start, used to guarantee that all assigned message identifiers
|
// application start, used to guarantee that all assigned message identifiers
|
||||||
@ -1864,7 +1864,7 @@ class MessagesManager final : public Actor {
|
|||||||
|
|
||||||
bool is_anonymous_administrator(DialogId dialog_id, string *author_signature) const;
|
bool is_anonymous_administrator(DialogId dialog_id, string *author_signature) const;
|
||||||
|
|
||||||
int64 generate_new_random_id();
|
int64 generate_new_random_id(const Dialog *d);
|
||||||
|
|
||||||
unique_ptr<Message> create_message_to_send(Dialog *d, MessageId top_thread_message_id, MessageId reply_to_message_id,
|
unique_ptr<Message> create_message_to_send(Dialog *d, MessageId top_thread_message_id, MessageId reply_to_message_id,
|
||||||
const MessageSendOptions &options, unique_ptr<MessageContent> &&content,
|
const MessageSendOptions &options, unique_ptr<MessageContent> &&content,
|
||||||
|
Loading…
Reference in New Issue
Block a user