Add MessagesManager::fix_new_message.
This commit is contained in:
parent
1a4e91a207
commit
666af51345
|
@ -34169,44 +34169,35 @@ MessagesManager::Message *MessagesManager::on_get_message_from_database(Dialog *
|
|||
return result;
|
||||
}
|
||||
|
||||
// keep synced with add_scheduled_message_to_dialog
|
||||
MessagesManager::Message *MessagesManager::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, const char *source) {
|
||||
CHECK(message != nullptr);
|
||||
void MessagesManager::fix_new_message(const Dialog *d, Message *m, bool from_database) const {
|
||||
CHECK(d != nullptr);
|
||||
CHECK(need_update != nullptr);
|
||||
CHECK(need_update_dialog_pos != nullptr);
|
||||
CHECK(source != nullptr);
|
||||
debug_add_message_to_dialog_fail_reason_ = "success";
|
||||
CHECK(m != nullptr);
|
||||
|
||||
DialogId dialog_id = d->dialog_id;
|
||||
MessageId message_id = message->message_id;
|
||||
|
||||
if (!has_message_sender_user_id(dialog_id, message.get()) && !message->sender_dialog_id.is_valid()) {
|
||||
if (!has_message_sender_user_id(dialog_id, m) && !m->sender_dialog_id.is_valid()) {
|
||||
if (is_broadcast_channel(dialog_id)) {
|
||||
message->sender_dialog_id = dialog_id;
|
||||
m->sender_dialog_id = dialog_id;
|
||||
} else {
|
||||
if (is_discussion_message(dialog_id, message.get())) {
|
||||
message->sender_dialog_id = message->forward_info->from_dialog_id;
|
||||
if (is_discussion_message(dialog_id, m)) {
|
||||
m->sender_dialog_id = m->forward_info->from_dialog_id;
|
||||
} else {
|
||||
LOG(ERROR) << "Failed to repair sender chat in " << message_id << " in " << dialog_id;
|
||||
LOG(ERROR) << "Failed to repair sender chat in " << m->message_id << " in " << dialog_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto dialog_type = dialog_id.get_type();
|
||||
if (message->sender_user_id == ContactsManager::get_anonymous_bot_user_id() &&
|
||||
!message->sender_dialog_id.is_valid() && dialog_type == DialogType::Channel && !is_broadcast_channel(dialog_id)) {
|
||||
message->sender_user_id = UserId();
|
||||
message->sender_dialog_id = dialog_id;
|
||||
if (m->sender_user_id == ContactsManager::get_anonymous_bot_user_id() && !m->sender_dialog_id.is_valid() &&
|
||||
dialog_type == DialogType::Channel && !is_broadcast_channel(dialog_id)) {
|
||||
m->sender_user_id = UserId();
|
||||
m->sender_dialog_id = dialog_id;
|
||||
}
|
||||
|
||||
if (!from_database && message_id.is_valid()) {
|
||||
if (!from_database && m->message_id.is_valid()) {
|
||||
switch (dialog_type) {
|
||||
case DialogType::Chat:
|
||||
case DialogType::Channel: {
|
||||
message->available_reactions_generation = d->available_reactions_generation;
|
||||
m->available_reactions_generation = d->available_reactions_generation;
|
||||
break;
|
||||
}
|
||||
case DialogType::User:
|
||||
|
@ -34216,28 +34207,65 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
message->history_generation = d->history_generation;
|
||||
m->history_generation = d->history_generation;
|
||||
}
|
||||
|
||||
if (message->top_thread_message_id.is_valid()) {
|
||||
if (m->top_thread_message_id.is_valid()) {
|
||||
if (is_broadcast_channel(dialog_id)) {
|
||||
message->top_thread_message_id = MessageId();
|
||||
m->top_thread_message_id = MessageId();
|
||||
}
|
||||
} else {
|
||||
if (is_thread_message(dialog_id, message.get())) {
|
||||
message->top_thread_message_id = message_id;
|
||||
if (is_thread_message(dialog_id, m)) {
|
||||
m->top_thread_message_id = m->message_id;
|
||||
}
|
||||
}
|
||||
|
||||
if (!message_id.is_scheduled() && message_id <= d->last_clear_history_message_id) {
|
||||
LOG(INFO) << "Skip adding cleared " << message_id << " to " << dialog_id << " from " << source;
|
||||
if (from_database) {
|
||||
delete_message_from_database(d, message_id, message.get(), true, "cleared full history");
|
||||
m->last_access_date = G()->unix_time_cached();
|
||||
|
||||
if (m->contains_mention) {
|
||||
CHECK(!td_->auth_manager_->is_bot());
|
||||
auto message_content_type = m->content->get_type();
|
||||
if (message_content_type == MessageContentType::PinMessage) {
|
||||
if (is_dialog_pinned_message_notifications_disabled(d) ||
|
||||
!get_message_content_pinned_message_id(m->content.get()).is_valid()) {
|
||||
// treat message pin without pinned message as an ordinary message
|
||||
m->contains_mention = false;
|
||||
}
|
||||
} else if (is_dialog_mention_notifications_disabled(d)) {
|
||||
// disable mention notification
|
||||
m->is_mention_notification_disabled = true;
|
||||
}
|
||||
debug_add_message_to_dialog_fail_reason_ = "cleared full history";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (m->contains_unread_mention && m->message_id <= d->last_read_all_mentions_message_id) {
|
||||
m->contains_unread_mention = false;
|
||||
}
|
||||
|
||||
if (dialog_type == DialogType::Channel && !m->contains_unread_mention) {
|
||||
auto channel_read_media_period =
|
||||
td_->option_manager_->get_option_integer("channels_read_media_period", (G()->is_test_dc() ? 300 : 7 * 86400));
|
||||
if (m->date < G()->unix_time_cached() - channel_read_media_period) {
|
||||
update_opened_message_content(m->content.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// keep synced with add_scheduled_message_to_dialog
|
||||
MessagesManager::Message *MessagesManager::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, const char *source) {
|
||||
CHECK(need_update != nullptr);
|
||||
CHECK(need_update_dialog_pos != nullptr);
|
||||
CHECK(source != nullptr);
|
||||
|
||||
fix_new_message(d, message.get(), from_database);
|
||||
|
||||
debug_add_message_to_dialog_fail_reason_ = "success";
|
||||
|
||||
DialogId dialog_id = d->dialog_id;
|
||||
MessageId message_id = message->message_id;
|
||||
|
||||
LOG(INFO) << "Adding " << message_id << " of type " << message->content->get_type() << " to " << dialog_id << " from "
|
||||
<< source << ". Last new is " << d->last_new_message_id << ", last is " << d->last_message_id
|
||||
<< ", from_update = " << from_update << ", have_previous = " << have_previous
|
||||
|
@ -34257,14 +34285,22 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||
CHECK(from_update);
|
||||
}
|
||||
|
||||
if (message_id <= d->last_clear_history_message_id) {
|
||||
LOG(INFO) << "Skip adding cleared " << message_id << " to " << dialog_id;
|
||||
if (from_database) {
|
||||
delete_message_from_database(d, message_id, message.get(), true, "cleared full history");
|
||||
}
|
||||
debug_add_message_to_dialog_fail_reason_ = "cleared full history";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (is_deleted_message(d, message_id)) {
|
||||
LOG(INFO) << "Skip adding deleted " << message_id << " to " << dialog_id << " from " << source;
|
||||
LOG(INFO) << "Skip adding deleted " << message_id << " to " << dialog_id;
|
||||
debug_add_message_to_dialog_fail_reason_ = "adding deleted message";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
message->last_access_date = G()->unix_time_cached();
|
||||
|
||||
auto dialog_type = dialog_id.get_type();
|
||||
if (from_update) {
|
||||
CHECK(have_next);
|
||||
CHECK(have_previous);
|
||||
|
@ -34315,7 +34351,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||
}
|
||||
if ((message_id.is_server() || (message_id.is_local() && dialog_type == DialogType::SecretChat)) &&
|
||||
message_id <= d->max_unavailable_message_id) {
|
||||
LOG(INFO) << "Can't add an unavailable " << message_id << " to " << dialog_id << " from " << source;
|
||||
LOG(INFO) << "Can't add an unavailable " << message_id << " to " << dialog_id;
|
||||
if (from_database) {
|
||||
delete_message_from_database(d, message_id, message.get(), true, "ignore unavailable message");
|
||||
}
|
||||
|
@ -34434,27 +34470,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||
}
|
||||
}
|
||||
|
||||
if (*need_update && !td_->auth_manager_->is_bot()) {
|
||||
if (message_content_type == MessageContentType::PinMessage) {
|
||||
if (is_dialog_pinned_message_notifications_disabled(d) ||
|
||||
!get_message_content_pinned_message_id(message->content.get()).is_valid()) {
|
||||
// treat message pin without pinned message as an ordinary message
|
||||
message->contains_mention = false;
|
||||
}
|
||||
} else if (message->contains_mention && is_dialog_mention_notifications_disabled(d)) {
|
||||
// disable mention notification
|
||||
message->is_mention_notification_disabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (message->contains_unread_mention && message_id <= d->last_read_all_mentions_message_id) {
|
||||
LOG(INFO) << "Ignore unread mention in " << message_id;
|
||||
message->contains_unread_mention = false;
|
||||
if (from_database) {
|
||||
on_message_changed(d, message.get(), false, "add already read mention message to dialog");
|
||||
}
|
||||
}
|
||||
|
||||
if (*need_update && may_need_message_notification(d, message.get())) {
|
||||
// notification group must be created here because it may force adding new messages from database
|
||||
// in get_message_notification_group_force
|
||||
|
@ -34582,14 +34597,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||
*need_update_dialog_pos = true;
|
||||
}
|
||||
|
||||
if (dialog_type == DialogType::Channel && !message->contains_unread_mention) {
|
||||
auto channel_read_media_period =
|
||||
td_->option_manager_->get_option_integer("channels_read_media_period", (G()->is_test_dc() ? 300 : 7 * 86400));
|
||||
if (message->date < G()->unix_time_cached() - channel_read_media_period) {
|
||||
update_opened_message_content(message->content.get());
|
||||
}
|
||||
}
|
||||
|
||||
if (G()->keep_media_order() && message_id.is_yet_unsent() && !message->via_bot_user_id.is_valid() &&
|
||||
!message->hide_via_bot && !message->is_copy) {
|
||||
auto queue_id = ChainId(dialog_id, message_content_type).get();
|
||||
|
|
|
@ -2247,6 +2247,8 @@ class MessagesManager final : public Actor {
|
|||
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);
|
||||
|
||||
void fix_new_message(const Dialog *d, Message *m, bool from_database) const;
|
||||
|
||||
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,
|
||||
const char *source);
|
||||
|
|
Loading…
Reference in New Issue
Block a user