diff --git a/td/telegram/ForumTopicManager.cpp b/td/telegram/ForumTopicManager.cpp index e01a37576..125a5575d 100644 --- a/td/telegram/ForumTopicManager.cpp +++ b/td/telegram/ForumTopicManager.cpp @@ -247,6 +247,8 @@ class GetForumTopicQuery final : public Td::ResultHandler { if (forum_topic_info.get_top_thread_message_id() != top_thread_message_id_) { return promise_.set_error(Status::Error(500, "Wrong forum topic received")); } + td_->forum_topic_manager_->on_get_forum_topic_info(DialogId(channel_id_), forum_topic_info, + "GetForumTopicQuery"); return promise_.set_value(forum_topic.get_forum_topic_object(td_, forum_topic_info)); } default: @@ -476,6 +478,26 @@ void ForumTopicManager::on_forum_topic_edited(DialogId dialog_id, MessageId top_ } } +void ForumTopicManager::on_get_forum_topic_info(DialogId dialog_id, const ForumTopicInfo &topic_info, + const char *source) { + if (!can_be_forum(dialog_id)) { + LOG(ERROR) << "Receive forum topics in " << dialog_id << " from " << source; + return; + } + + auto dialog_topics = add_dialog_topics(dialog_id); + CHECK(dialog_topics != nullptr); + auto forum_topic_info = td::make_unique(topic_info); + MessageId top_thread_message_id = forum_topic_info->get_top_thread_message_id(); + CHECK(top_thread_message_id.is_valid()); + auto topic = add_topic(dialog_topics, top_thread_message_id); + if (topic->info_ == nullptr || *topic->info_ != *forum_topic_info) { + topic->info_ = std::move(forum_topic_info); + send_update_forum_topic_info(dialog_id, topic->info_.get()); + save_topic_to_database(dialog_id, topic); + } +} + void ForumTopicManager::on_get_forum_topics(DialogId dialog_id, vector> &&forum_topics, const char *source) { diff --git a/td/telegram/ForumTopicManager.h b/td/telegram/ForumTopicManager.h index d73823243..3a6e526f1 100644 --- a/td/telegram/ForumTopicManager.h +++ b/td/telegram/ForumTopicManager.h @@ -58,6 +58,8 @@ class ForumTopicManager final : public Actor { void on_forum_topic_edited(DialogId dialog_id, MessageId top_thread_message_id, const ForumTopicEditedData &edited_data); + void on_get_forum_topic_info(DialogId dialog_id, const ForumTopicInfo &topic_info, const char *source); + void on_get_forum_topics(DialogId dialog_id, vector> &&forum_topics, const char *source);