From ce9bce599490ac20ec45b6bd2738b1cb9a987be3 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 28 Jun 2023 17:10:14 +0300 Subject: [PATCH] Reload chat active stories when receive a new story. --- td/telegram/StoryManager.cpp | 18 ++++++++++++++++-- td/telegram/StoryManager.h | 2 ++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/td/telegram/StoryManager.cpp b/td/telegram/StoryManager.cpp index cf33a1dff..55b7061df 100644 --- a/td/telegram/StoryManager.cpp +++ b/td/telegram/StoryManager.cpp @@ -939,6 +939,7 @@ void StoryManager::on_get_story_archive(telegram_api::object_ptr> &&promise) { + TRY_STATUS_PROMISE(promise, G()->close_status()); if (!td_->messages_manager_->have_dialog_force(owner_dialog_id, "get_dialog_expiring_stories")) { return promise.set_error(Status::Error(400, "Story sender not found")); } @@ -950,7 +951,10 @@ void StoryManager::get_dialog_expiring_stories(DialogId owner_dialog_id, } auto active_stories = get_active_stories(owner_dialog_id); - if (active_stories != nullptr && promise) { + if (active_stories != nullptr) { + if (!promise) { + return promise.set_value(nullptr); + } promise.set_value(get_active_stories_object(owner_dialog_id)); promise = {}; } @@ -967,6 +971,12 @@ void StoryManager::get_dialog_expiring_stories(DialogId owner_dialog_id, td_->create_handler(std::move(query_promise))->send(owner_dialog_id.get_user_id()); } +void StoryManager::load_dialog_expiring_stories(DialogId owner_dialog_id) { + // send later to ensure that active stories are inited before sending the request + send_closure_later(actor_id(this), &StoryManager::get_dialog_expiring_stories, owner_dialog_id, + Promise>()); +} + void StoryManager::on_get_dialog_expiring_stories(DialogId owner_dialog_id, telegram_api::object_ptr &&stories, Promise> &&promise) { @@ -1626,7 +1636,11 @@ StoryId StoryManager::on_get_new_story(DialogId owner_dialog_id, if (is_active_story(story)) { auto active_stories = get_active_stories(owner_dialog_id); - if (active_stories != nullptr && !contains(active_stories->story_ids_, story_id)) { + if (active_stories == nullptr) { + if (is_subscribed_to_dialog_stories(owner_dialog_id)) { + load_dialog_expiring_stories(owner_dialog_id); + } + } else if (!contains(active_stories->story_ids_, story_id)) { auto story_ids = active_stories->story_ids_; story_ids.push_back(story_id); size_t i = story_ids.size() - 1; diff --git a/td/telegram/StoryManager.h b/td/telegram/StoryManager.h index 9095c8801..349e37de8 100644 --- a/td/telegram/StoryManager.h +++ b/td/telegram/StoryManager.h @@ -268,6 +268,8 @@ class StoryManager final : public Actor { telegram_api::object_ptr &&stories, Promise> &&promise); + void load_dialog_expiring_stories(DialogId owner_dialog_id); + vector get_story_file_ids(const Story *story) const; static uint64 save_delete_story_on_server_log_event(StoryFullId story_full_id);