diff --git a/td/telegram/AnimationsManager.cpp b/td/telegram/AnimationsManager.cpp index a816d9b0..b8320ea2 100644 --- a/td/telegram/AnimationsManager.cpp +++ b/td/telegram/AnimationsManager.cpp @@ -695,6 +695,10 @@ string AnimationsManager::get_animation_search_text(FileId file_id) const { } void AnimationsManager::get_current_state(vector> &updates) const { + if (td_->auth_manager_->is_bot()) { + return; + } + if (are_saved_animations_loaded_) { updates.push_back(get_update_saved_animatoions_object()); } diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index dfdec884..1c9951c6 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -6472,10 +6472,7 @@ bool MessagesManager::update_scope_notification_settings(NotificationSettingsSco *current_settings = new_settings; if (need_update) { - send_closure( - G()->td(), &Td::send_update, - make_tl_object( - get_notification_settings_scope_object(scope), get_scope_notification_settings_object(current_settings))); + send_closure(G()->td(), &Td::send_update, get_update_scope_notification_settings_object(scope)); } } return is_changed; @@ -6631,10 +6628,7 @@ void MessagesManager::on_scope_unmute(NotificationSettingsScope scope) { LOG(INFO) << "Unmute " << scope; update_scope_unmute_timeout(scope, notification_settings->mute_until, 0); notification_settings->mute_until = 0; - send_closure(G()->td(), &Td::send_update, - make_tl_object( - get_notification_settings_scope_object(scope), - get_scope_notification_settings_object(notification_settings))); + send_closure(G()->td(), &Td::send_update, get_update_scope_notification_settings_object(scope)); string key = get_notification_settings_scope_database_key(scope); G()->td_db()->get_binlog_pmc()->set(key, log_event_store(*notification_settings).as_slice().str()); } @@ -13637,15 +13631,8 @@ tl_object_ptr MessagesManager::get_chat_type_object(DialogId d } } -tl_object_ptr MessagesManager::get_chat_object(const Dialog *d) { - if (!td_->auth_manager_->is_bot()) { - if (!is_dialog_inited(d) && d->dialog_id.get_type() != DialogType::SecretChat && - have_input_peer(d->dialog_id, AccessRights::Read)) { - // asynchronously get dialog from the server - send_get_dialog_query(d->dialog_id, Auto()); - } - } - +tl_object_ptr MessagesManager::get_chat_object(const Dialog *d) const { + CHECK(d != nullptr); return make_tl_object( d->dialog_id.get(), get_chat_type_object(d->dialog_id), get_dialog_title(d->dialog_id), get_chat_photo_object(td_->file_manager_.get(), get_dialog_photo(d->dialog_id)), @@ -13658,10 +13645,8 @@ tl_object_ptr MessagesManager::get_chat_object(const Dialog *d) { get_draft_message_object(d->draft_message), d->client_data); } -tl_object_ptr MessagesManager::get_chat_object(DialogId dialog_id) { - auto d = get_dialog(dialog_id); - CHECK(d != nullptr); - return get_chat_object(d); +tl_object_ptr MessagesManager::get_chat_object(DialogId dialog_id) const { + return get_chat_object(get_dialog(dialog_id)); } tl_object_ptr MessagesManager::get_chats_object(const vector &dialogs) { @@ -13696,6 +13681,14 @@ tl_object_ptr MessagesManager::get_scope_noti notification_settings->show_preview); } +td_api::object_ptr +MessagesManager::get_update_scope_notification_settings_object(NotificationSettingsScope scope) const { + auto notification_settings = get_scope_notification_settings(scope); + CHECK(notification_settings != nullptr); + return td_api::make_object( + get_notification_settings_scope_object(scope), get_scope_notification_settings_object(notification_settings)); +} + std::pair MessagesManager::get_dialog_mute_until(DialogId dialog_id, const Dialog *d) const { if (d == nullptr || !d->notification_settings.is_synchronized) { return {false, get_scope_mute_until(dialog_id)}; @@ -13770,6 +13763,19 @@ ScopeNotificationSettings *MessagesManager::get_scope_notification_settings(Noti } } +const ScopeNotificationSettings *MessagesManager::get_scope_notification_settings( + NotificationSettingsScope scope) const { + switch (scope) { + case NotificationSettingsScope::Private: + return &users_notification_settings_; + case NotificationSettingsScope::Group: + return &chats_notification_settings_; + default: + UNREACHABLE(); + return nullptr; + } +} + tl_object_ptr MessagesManager::get_input_notify_peer(DialogId dialog_id) const { if (get_dialog(dialog_id) == nullptr) { return nullptr; @@ -25030,6 +25036,14 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr &&last_datab CHECK(d != nullptr); auto dialog_id = d->dialog_id; + if (!td_->auth_manager_->is_bot()) { + if (!is_dialog_inited(d) && dialog_id.get_type() != DialogType::SecretChat && + have_input_peer(dialog_id, AccessRights::Read)) { + // asynchronously get dialog from the server + send_get_dialog_query(dialog_id, Auto()); + } + } + if (d->notification_settings.is_synchronized && !d->notification_settings.is_use_default_fixed && have_input_peer(dialog_id, AccessRights::Read)) { LOG(INFO) << "Reget notification settings of " << dialog_id; @@ -27133,4 +27147,46 @@ void MessagesManager::set_sponsored_dialog_id(DialogId dialog_id) { } } +void MessagesManager::get_current_state(vector> &updates) const { + if (!td_->auth_manager_->is_bot()) { + if (G()->parameters().use_message_db) { + if (is_message_unread_count_inited_) { + int32 unread_unmuted_count = unread_message_total_count_ - unread_message_muted_count_; + updates.push_back( + td_api::make_object(unread_message_total_count_, unread_unmuted_count)); + } + if (is_dialog_unread_count_inited_) { + int32 unread_unmuted_count = unread_dialog_total_count_ - unread_dialog_muted_count_; + int32 unread_unmuted_marked_count = unread_dialog_marked_count_ - unread_dialog_muted_marked_count_; + updates.push_back(td_api::make_object( + unread_dialog_total_count_, unread_unmuted_count, unread_dialog_marked_count_, + unread_unmuted_marked_count)); + } + } + + vector scopes{NotificationSettingsScope::Private, NotificationSettingsScope::Group}; + for (auto scope : scopes) { + auto current_settings = get_scope_notification_settings(scope); + CHECK(current_settings != nullptr); + if (current_settings->is_synchronized) { + updates.push_back(get_update_scope_notification_settings_object(scope)); + } + } + } + + vector> last_message_updates; + for (auto &it : dialogs_) { + const Dialog *d = it.second.get(); + auto update = td_api::make_object(get_chat_object(d)); + if (update->chat_->last_message_ != nullptr && update->chat_->last_message_->forward_info_ != nullptr) { + DialogDate dialog_date(d->order, d->dialog_id); + last_message_updates.push_back(td_api::make_object( + d->dialog_id.get(), std::move(update->chat_->last_message_), + dialog_date <= last_dialog_date_ ? d->order : 0)); + } + updates.push_back(std::move(update)); + } + append(updates, std::move(last_message_updates)); +} + } // namespace td diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index d77e08e2..13f5ad6b 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1279,6 +1279,9 @@ class MessagesManager : public Actor { static tl_object_ptr get_scope_notification_settings_object( const ScopeNotificationSettings *notification_settings); + td_api::object_ptr get_update_scope_notification_settings_object( + NotificationSettingsScope scope) const; + const DialogNotificationSettings *get_dialog_notification_settings(DialogId dialog_id, Promise &&promise); const ScopeNotificationSettings *get_scope_notification_settings(NotificationSettingsScope scope, @@ -1294,7 +1297,7 @@ class MessagesManager : public Actor { void reset_all_notification_settings(); - tl_object_ptr get_chat_object(DialogId dialog_id); + tl_object_ptr get_chat_object(DialogId dialog_id) const; static tl_object_ptr get_chats_object(const vector &dialogs); @@ -1442,6 +1445,8 @@ class MessagesManager : public Actor { void get_payment_receipt(FullMessageId full_message_id, Promise> &&promise); + void get_current_state(vector> &updates) const; + ActorOwn sequence_dispatcher_; private: @@ -2388,7 +2393,7 @@ class MessagesManager : public Actor { tl_object_ptr get_chat_type_object(DialogId dialog_id) const; - tl_object_ptr get_chat_object(const Dialog *d); + tl_object_ptr get_chat_object(const Dialog *d) const; bool have_dialog_info(DialogId dialog_id) const; bool have_dialog_info_force(DialogId dialog_id) const; @@ -2455,6 +2460,8 @@ class MessagesManager : public Actor { ScopeNotificationSettings *get_scope_notification_settings(NotificationSettingsScope scope); + const ScopeNotificationSettings *get_scope_notification_settings(NotificationSettingsScope scope) const; + static unique_ptr get_draft_message(ContactsManager *contacts_manager, tl_object_ptr &&draft_message_ptr); diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 0ef9e65f..2f769907 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -4249,6 +4249,10 @@ string StickersManager::remove_emoji_modifiers(string emoji) { } void StickersManager::get_current_state(vector> &updates) const { + if (td_->auth_manager_->is_bot()) { + return; + } + for (int is_masks = 0; is_masks < 2; is_masks++) { if (are_installed_sticker_sets_loaded_[is_masks]) { updates.push_back(get_update_installed_sticker_sets_object(is_masks)); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index d41993f4..e77ca67b 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -4607,15 +4607,7 @@ void Td::on_request(uint64 id, const td_api::getCurrentState &request) { stickers_manager_->get_current_state(updates); - /* - // TODO - updateUnreadMessageCount { - updateUnreadChatCount { - updateScopeNotificationSettings { - updateScopeNotificationSettings { - updateNewChat { - updateChatLastMessage { - */ + messages_manager_->get_current_state(updates); } auto update_terms_of_service = get_update_terms_of_service_object();