Synchronize chat.pinned_message_id with message.is_pinned changes.

GitOrigin-RevId: 7d5debbdd6d44af3209c75745f49ad4a67b7a523
This commit is contained in:
levlam 2020-10-20 19:07:11 +03:00
parent 14f5df397d
commit a9b7366296
2 changed files with 30 additions and 15 deletions

View File

@ -644,14 +644,7 @@ class UpdateDialogPinnedMessageQuery : public Td::ResultHandler {
}
void on_error(uint64 id, Status status) override {
if (status.message() == "CHAT_NOT_MODIFIED") {
if (!td->auth_manager_->is_bot()) {
promise_.set_value(Unit());
return;
}
} else {
td->messages_manager_->on_get_dialog_error(dialog_id_, status, "UpdateDialogPinnedMessageQuery");
}
td->messages_manager_->on_get_dialog_error(dialog_id_, status, "UpdateDialogPinnedMessageQuery");
promise_.set_error(std::move(status));
}
};
@ -9625,6 +9618,19 @@ bool MessagesManager::update_message_is_pinned(Dialog *d, Message *m, bool is_pi
m->is_pinned = is_pinned;
send_closure(G()->td(), &Td::send_update,
make_tl_object<td_api::updateMessageIsPinned>(d->dialog_id.get(), m->message_id.get(), is_pinned));
if (is_pinned) {
if (m->message_id > d->pinned_message_id) {
on_update_dialog_pinned_message_id(d->dialog_id, m->message_id);
}
} else {
if (m->message_id == d->pinned_message_id) {
if (d->message_count_by_index[message_search_filter_index(MessageSearchFilter::Pinned)] == 1) {
set_dialog_pinned_message_id(d, MessageId());
} else {
drop_dialog_pinned_message_id(d);
}
}
}
return true;
}
@ -13756,7 +13762,6 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vector<tl_object_ptr<te
}
if (!d->is_pinned_message_id_inited && !td_->auth_manager_->is_bot()) {
// asynchronously get dialog pinned message from the server
// TODO add pinned_message_id to telegram_api::dialog
get_dialog_pinned_message(dialog_id, Auto());
}
@ -28466,6 +28471,20 @@ void MessagesManager::set_dialog_pinned_message_id(Dialog *d, MessageId pinned_m
make_tl_object<td_api::updateChatPinnedMessage>(d->dialog_id.get(), pinned_message_id.get()));
}
void MessagesManager::drop_dialog_pinned_message_id(Dialog *d) {
d->pinned_message_id = MessageId();
d->is_pinned_message_id_inited = false;
on_dialog_updated(d->dialog_id, "drop_dialog_pinned_message_id");
LOG(INFO) << "Drop " << d->dialog_id << " pinned message";
LOG_CHECK(d->is_update_new_chat_sent) << "Wrong " << d->dialog_id << " in drop_dialog_pinned_message_id";
send_closure(G()->td(), &Td::send_update, make_tl_object<td_api::updateChatPinnedMessage>(d->dialog_id.get(), 0));
if (!td_->auth_manager_->is_bot()) {
get_dialog_info_full(d->dialog_id, Auto());
}
}
void MessagesManager::repair_dialog_scheduled_messages(Dialog *d) {
if (td_->auth_manager_->is_bot() || d->dialog_id.get_type() == DialogType::SecretChat) {
return;
@ -31318,12 +31337,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
register_message_content(td_, m->content.get(), {dialog_id, m->message_id}, "add_message_to_dialog");
if (*need_update && m->message_id.is_server() && message_content_type == MessageContentType::PinMessage) {
// always update pinned message from service message, even new pinned_message_id is invalid
auto pinned_message_id = get_message_content_pinned_message_id(m->content.get());
on_update_dialog_pinned_message_id(dialog_id, pinned_message_id);
}
if (from_update) {
speculatively_update_channel_participants(dialog_id, m);
update_sent_message_contents(dialog_id, m);

View File

@ -2313,6 +2313,8 @@ class MessagesManager : public Actor {
void set_dialog_pinned_message_id(Dialog *d, MessageId pinned_message_id);
void drop_dialog_pinned_message_id(Dialog *d);
void repair_dialog_scheduled_messages(Dialog *d);
void set_dialog_has_scheduled_server_messages(Dialog *d, bool has_scheduled_server_messages);