From e4382ee206aaed0517a2ecc709ec37bcab42ad83 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Jun 2023 16:17:01 +0300 Subject: [PATCH] Update message content when story from web page is changed. --- td/telegram/StoryManager.cpp | 2 ++ td/telegram/WebPagesManager.cpp | 30 ++++++++++++++++++++++++++++++ td/telegram/WebPagesManager.h | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/td/telegram/StoryManager.cpp b/td/telegram/StoryManager.cpp index 9966c20df..3b4a3b14f 100644 --- a/td/telegram/StoryManager.cpp +++ b/td/telegram/StoryManager.cpp @@ -20,6 +20,7 @@ #include "td/telegram/StoryContentType.h" #include "td/telegram/Td.h" #include "td/telegram/UpdatesManager.h" +#include "td/telegram/WebPagesManager.h" #include "tddb/td/db/binlog/BinlogEvent.h" #include "tddb/td/db/binlog/BinlogHelper.h" @@ -879,6 +880,7 @@ void StoryManager::on_story_changed(StoryFullId story_full_id, const Story *stor send_closure_later(G()->messages_manager(), &MessagesManager::update_story_max_reply_media_timestamp_in_replied_messages, story_full_id); + send_closure_later(G()->web_pages_manager(), &WebPagesManager::on_story_changed, story_full_id); } } diff --git a/td/telegram/WebPagesManager.cpp b/td/telegram/WebPagesManager.cpp index afddb0b0e..900a4e048 100644 --- a/td/telegram/WebPagesManager.cpp +++ b/td/telegram/WebPagesManager.cpp @@ -395,6 +395,7 @@ class WebPagesManager::WebPage { } if (has_story_full_ids) { parse(story_full_ids, parser); + td::remove_if(story_full_ids, [](StoryFullId story_full_id) { return !story_full_id.is_valid(); }); } if (has_instant_view) { @@ -609,6 +610,21 @@ void WebPagesManager::update_web_page(unique_ptr web_page, WebPageId we is_changed = false; } + if (page->story_full_ids != web_page->story_full_ids) { + for (auto story_full_id : page->story_full_ids) { + auto it = story_web_pages_.find(story_full_id); + if (it != story_web_pages_.end()) { + it->second.erase(web_page_id); + if (it->second.empty()) { + story_web_pages_.erase(it); + } + } + } + for (auto story_full_id : web_page->story_full_ids) { + story_web_pages_[story_full_id].insert(web_page_id); + } + } + old_instant_view = std::move(page->instant_view); web_page->log_event_id = page->log_event_id; } else { @@ -1380,6 +1396,20 @@ void WebPagesManager::on_web_page_changed(WebPageId web_page_id, bool have_web_p pending_web_pages_timeout_.cancel_timeout(web_page_id.get()); } +void WebPagesManager::on_story_changed(StoryFullId story_full_id) { + auto story_it = story_web_pages_.find(story_full_id); + if (story_it == story_web_pages_.end()) { + return; + } + vector web_page_ids; + for (auto web_page_id : story_it->second) { + web_page_ids.push_back(web_page_id); + } + for (auto web_page_id : web_page_ids) { + on_web_page_changed(web_page_id, true); + } +} + const WebPagesManager::WebPage *WebPagesManager::get_web_page(WebPageId web_page_id) const { return web_pages_.get_pointer(web_page_id); } diff --git a/td/telegram/WebPagesManager.h b/td/telegram/WebPagesManager.h index af5e7ae8a..9550840d5 100644 --- a/td/telegram/WebPagesManager.h +++ b/td/telegram/WebPagesManager.h @@ -11,6 +11,7 @@ #include "td/telegram/files/FileSourceId.h" #include "td/telegram/FullMessageId.h" #include "td/telegram/SecretInputMedia.h" +#include "td/telegram/StoryFullId.h" #include "td/telegram/td_api.h" #include "td/telegram/telegram_api.h" #include "td/telegram/WebPageId.h" @@ -86,6 +87,8 @@ class WebPagesManager final : public Actor { int32 get_web_page_media_duration(WebPageId web_page_id) const; + void on_story_changed(StoryFullId story_full_id); + private: class WebPage; @@ -180,6 +183,8 @@ class WebPagesManager final : public Actor { FlatHashMap>>>, WebPageIdHash> pending_get_web_pages_; + FlatHashMap, StoryFullIdHash> story_web_pages_; + FlatHashMap url_to_web_page_id_; FlatHashMap url_to_file_source_id_;