Explicitly create Dialog before adding a message to it.
This commit is contained in:
parent
11210427a4
commit
c612ef6764
@ -14802,11 +14802,12 @@ FullMessageId MessagesManager::on_get_message(MessageInfo &&message_info, bool f
|
|||||||
bool need_update = from_update;
|
bool need_update = from_update;
|
||||||
bool need_update_dialog_pos = false;
|
bool need_update_dialog_pos = false;
|
||||||
|
|
||||||
|
Dialog *d = get_dialog_force(dialog_id, source);
|
||||||
|
|
||||||
MessageId old_message_id = find_old_message_id(dialog_id, message_id);
|
MessageId old_message_id = find_old_message_id(dialog_id, message_id);
|
||||||
bool is_sent_message = false;
|
bool is_sent_message = false;
|
||||||
if (old_message_id.is_valid() || old_message_id.is_valid_scheduled()) {
|
if (old_message_id.is_valid() || old_message_id.is_valid_scheduled()) {
|
||||||
LOG(INFO) << "Found temporary " << old_message_id << " for " << FullMessageId{dialog_id, message_id};
|
LOG(INFO) << "Found temporary " << old_message_id << " for " << FullMessageId{dialog_id, message_id};
|
||||||
Dialog *d = get_dialog(dialog_id);
|
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
|
|
||||||
if (!from_update && !message_id.is_scheduled()) {
|
if (!from_update && !message_id.is_scheduled()) {
|
||||||
@ -14884,17 +14885,25 @@ FullMessageId MessagesManager::on_get_message(MessageInfo &&message_info, bool f
|
|||||||
have_next = true;
|
have_next = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (d == nullptr) {
|
||||||
|
if (from_update) {
|
||||||
|
CHECK(!being_added_by_new_message_dialog_id_.is_valid());
|
||||||
|
being_added_by_new_message_dialog_id_ = dialog_id;
|
||||||
|
}
|
||||||
|
d = add_dialog(dialog_id, source);
|
||||||
|
CHECK(d != nullptr);
|
||||||
|
need_update_dialog_pos = true;
|
||||||
|
being_added_by_new_message_dialog_id_ = DialogId();
|
||||||
|
}
|
||||||
|
|
||||||
const Message *m = add_message_to_dialog(dialog_id, std::move(new_message), false, have_previous, have_next,
|
const Message *m = add_message_to_dialog(d, std::move(new_message), false, have_previous, have_next, from_update,
|
||||||
from_update, &need_update, &need_update_dialog_pos, source);
|
&need_update, &need_update_dialog_pos, source);
|
||||||
being_readded_message_id_ = FullMessageId();
|
being_readded_message_id_ = FullMessageId();
|
||||||
Dialog *d = get_dialog(dialog_id);
|
|
||||||
if (m == nullptr) {
|
if (m == nullptr) {
|
||||||
if (need_update_dialog_pos && d != nullptr) {
|
if (need_update_dialog_pos) {
|
||||||
send_update_chat_last_message(d, "on_get_message");
|
send_update_chat_last_message(d, "on_get_message");
|
||||||
}
|
}
|
||||||
if (old_message_id.is_valid() || old_message_id.is_valid_scheduled()) {
|
if (old_message_id.is_valid() || old_message_id.is_valid_scheduled()) {
|
||||||
CHECK(d != nullptr);
|
|
||||||
if (!old_message_id.is_valid() || !message_id.is_valid() || old_message_id <= message_id) {
|
if (!old_message_id.is_valid() || !message_id.is_valid() || old_message_id <= message_id) {
|
||||||
LOG(ERROR) << "Failed to add just sent " << old_message_id << " to " << dialog_id << " as " << message_id
|
LOG(ERROR) << "Failed to add just sent " << old_message_id << " to " << dialog_id << " as " << message_id
|
||||||
<< " from " << source << ": " << debug_add_message_to_dialog_fail_reason_;
|
<< " from " << source << ": " << debug_add_message_to_dialog_fail_reason_;
|
||||||
@ -14905,8 +14914,6 @@ FullMessageId MessagesManager::on_get_message(MessageInfo &&message_info, bool f
|
|||||||
return FullMessageId();
|
return FullMessageId();
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK(d != nullptr);
|
|
||||||
|
|
||||||
auto pcc_it = pending_created_dialogs_.find(dialog_id);
|
auto pcc_it = pending_created_dialogs_.find(dialog_id);
|
||||||
if (from_update && pcc_it != pending_created_dialogs_.end()) {
|
if (from_update && pcc_it != pending_created_dialogs_.end()) {
|
||||||
pcc_it->second.set_value(Unit());
|
pcc_it->second.set_value(Unit());
|
||||||
@ -31328,7 +31335,7 @@ void MessagesManager::fail_send_message(FullMessageId full_message_id, int error
|
|||||||
update_failed_to_send_message_content(td_, message->content);
|
update_failed_to_send_message_content(td_, message->content);
|
||||||
|
|
||||||
bool need_update = false;
|
bool need_update = false;
|
||||||
Message *m = add_message_to_dialog(dialog_id, std::move(message), false, true, true, false, &need_update,
|
Message *m = add_message_to_dialog(d, std::move(message), false, true, true, false, &need_update,
|
||||||
&need_update_dialog_pos, "fail_send_message");
|
&need_update_dialog_pos, "fail_send_message");
|
||||||
LOG_CHECK(m != nullptr) << "Failed to add failed to send " << new_message_id << " to " << dialog_id << " due to "
|
LOG_CHECK(m != nullptr) << "Failed to add failed to send " << new_message_id << " to " << dialog_id << " due to "
|
||||||
<< debug_add_message_to_dialog_fail_reason_;
|
<< debug_add_message_to_dialog_fail_reason_;
|
||||||
@ -34180,37 +34187,6 @@ MessagesManager::Message *MessagesManager::on_get_message_from_database(Dialog *
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagesManager::Message *MessagesManager::add_message_to_dialog(DialogId dialog_id, unique_ptr<Message> message,
|
|
||||||
bool from_database, bool have_previous, bool have_next,
|
|
||||||
bool from_update, bool *need_update,
|
|
||||||
bool *need_update_dialog_pos, const char *source) {
|
|
||||||
CHECK(message != nullptr);
|
|
||||||
CHECK(dialog_id.get_type() != DialogType::None);
|
|
||||||
CHECK(need_update_dialog_pos != nullptr);
|
|
||||||
|
|
||||||
MessageId message_id = message->message_id;
|
|
||||||
if (!message_id.is_valid() && !message_id.is_valid_scheduled()) {
|
|
||||||
LOG(ERROR) << "Receive " << message_id << " in " << dialog_id << " from " << source;
|
|
||||||
debug_add_message_to_dialog_fail_reason_ = "invalid message identifier";
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Dialog *d = get_dialog_force(dialog_id, source);
|
|
||||||
if (d == nullptr) {
|
|
||||||
if (from_update) {
|
|
||||||
CHECK(!being_added_by_new_message_dialog_id_.is_valid());
|
|
||||||
being_added_by_new_message_dialog_id_ = dialog_id;
|
|
||||||
}
|
|
||||||
d = add_dialog(dialog_id, source);
|
|
||||||
*need_update_dialog_pos = true;
|
|
||||||
being_added_by_new_message_dialog_id_ = DialogId();
|
|
||||||
} else {
|
|
||||||
CHECK(d->dialog_id == dialog_id);
|
|
||||||
}
|
|
||||||
return add_message_to_dialog(d, std::move(message), from_database, have_previous, have_next, from_update, need_update,
|
|
||||||
need_update_dialog_pos, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
// keep synced with add_scheduled_message_to_dialog
|
// keep synced with add_scheduled_message_to_dialog
|
||||||
MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, unique_ptr<Message> message,
|
MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, unique_ptr<Message> message,
|
||||||
bool from_database, bool have_previous, bool have_next,
|
bool from_database, bool have_previous, bool have_next,
|
||||||
|
@ -2247,10 +2247,6 @@ class MessagesManager final : public Actor {
|
|||||||
void update_message_reply_count(Dialog *d, MessageId message_id, DialogId replier_dialog_id,
|
void update_message_reply_count(Dialog *d, MessageId message_id, DialogId replier_dialog_id,
|
||||||
MessageId reply_message_id, int32 update_date, int diff, bool is_recursive = false);
|
MessageId reply_message_id, int32 update_date, int diff, bool is_recursive = false);
|
||||||
|
|
||||||
Message *add_message_to_dialog(DialogId dialog_id, unique_ptr<Message> message, bool from_database,
|
|
||||||
bool have_previous, bool have_next, bool from_update, bool *need_update,
|
|
||||||
bool *need_update_dialog_pos, const char *source);
|
|
||||||
|
|
||||||
Message *add_message_to_dialog(Dialog *d, unique_ptr<Message> message, bool from_database, bool have_previous,
|
Message *add_message_to_dialog(Dialog *d, unique_ptr<Message> message, bool from_database, bool have_previous,
|
||||||
bool have_next, bool from_update, bool *need_update, bool *need_update_dialog_pos,
|
bool have_next, bool from_update, bool *need_update, bool *need_update_dialog_pos,
|
||||||
const char *source);
|
const char *source);
|
||||||
|
Loading…
Reference in New Issue
Block a user