Support storing additional data about forum topics.

This commit is contained in:
levlam 2022-11-15 16:59:32 +03:00
parent 24be58d083
commit 2ee0eb67f3
2 changed files with 46 additions and 34 deletions

View File

@ -216,9 +216,15 @@ void ForumTopicManager::on_forum_topic_created(DialogId dialog_id, unique_ptr<Fo
Promise<td_api::object_ptr<td_api::forumTopicInfo>> &&promise) {
TRY_STATUS_PROMISE(promise, G()->close_status());
auto topic_info = add_topic_info(dialog_id, std::move(forum_topic_info));
CHECK(topic_info != nullptr);
promise.set_value(topic_info->get_forum_topic_info_object(td_));
CHECK(forum_topic_info != nullptr);
auto *dialog_topics = add_dialog_topics(dialog_id);
MessageId top_thread_message_id = forum_topic_info->get_top_thread_message_id();
auto topic = add_topic(dialog_topics, top_thread_message_id);
if (topic->info_ == nullptr) {
topic->info_ = std::move(forum_topic_info);
send_update_forum_topic_info(dialog_id, topic->info_.get());
}
promise.set_value(topic->info_->get_forum_topic_info_object(td_));
}
void ForumTopicManager::edit_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, string &&title,
@ -315,12 +321,10 @@ void ForumTopicManager::on_get_forum_topics(DialogId dialog_id,
if (!top_thread_message_id.is_valid()) {
continue;
}
auto topic_info = dialog_topics->topic_infos_.get_pointer(top_thread_message_id);
if (topic_info == nullptr || *topic_info != *forum_topic_info) {
dialog_topics->topic_infos_.set(top_thread_message_id, std::move(forum_topic_info));
topic_info = dialog_topics->topic_infos_.get_pointer(top_thread_message_id);
CHECK(topic_info != nullptr);
send_update_forum_topic_info(dialog_id, topic_info);
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());
}
}
}
@ -338,42 +342,46 @@ Status ForumTopicManager::is_forum(DialogId dialog_id) {
ForumTopicManager::DialogTopics *ForumTopicManager::add_dialog_topics(DialogId dialog_id) {
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
if (dialog_topics != nullptr) {
return dialog_topics;
if (dialog_topics == nullptr) {
auto new_dialog_topics = make_unique<DialogTopics>();
dialog_topics = new_dialog_topics.get();
dialog_topics_.set(dialog_id, std::move(new_dialog_topics));
}
dialog_topics_.set(dialog_id, make_unique<DialogTopics>());
return dialog_topics_.get_pointer(dialog_id);
return dialog_topics;
}
ForumTopicInfo *ForumTopicManager::add_topic_info(DialogId dialog_id, unique_ptr<ForumTopicInfo> &&forum_topic_info) {
auto *dialog_info = add_dialog_topics(dialog_id);
CHECK(forum_topic_info != nullptr);
MessageId top_thread_message_id = forum_topic_info->get_top_thread_message_id();
auto topic_info = dialog_info->topic_infos_.get_pointer(top_thread_message_id);
if (topic_info == nullptr) {
dialog_info->topic_infos_.set(top_thread_message_id, std::move(forum_topic_info));
topic_info = dialog_info->topic_infos_.get_pointer(top_thread_message_id);
CHECK(topic_info != nullptr);
send_update_forum_topic_info(dialog_id, topic_info);
ForumTopicManager::Topic *ForumTopicManager::add_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id) {
auto topic = dialog_topics->topics_.get_pointer(top_thread_message_id);
if (topic == nullptr) {
auto new_topic = make_unique<Topic>();
topic = new_topic.get();
dialog_topics->topics_.set(top_thread_message_id, std::move(new_topic));
}
return topic_info;
return topic;
}
ForumTopicInfo *ForumTopicManager::get_topic_info(DialogId dialog_id, MessageId top_thread_message_id) {
auto *dialog_info = dialog_topics_.get_pointer(dialog_id);
if (dialog_info == nullptr) {
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
if (dialog_topics == nullptr) {
return nullptr;
}
return dialog_info->topic_infos_.get_pointer(top_thread_message_id);
auto *topic = dialog_topics->topics_.get_pointer(top_thread_message_id);
if (topic == nullptr) {
return nullptr;
}
return topic->info_.get();
}
const ForumTopicInfo *ForumTopicManager::get_topic_info(DialogId dialog_id, MessageId top_thread_message_id) const {
auto *dialog_info = dialog_topics_.get_pointer(dialog_id);
if (dialog_info == nullptr) {
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
if (dialog_topics == nullptr) {
return nullptr;
}
return dialog_info->topic_infos_.get_pointer(top_thread_message_id);
auto *topic = dialog_topics->topics_.get_pointer(top_thread_message_id);
if (topic == nullptr) {
return nullptr;
}
return topic->info_.get();
}
td_api::object_ptr<td_api::updateForumTopicInfo> ForumTopicManager::get_update_forum_topic_info(

View File

@ -57,17 +57,21 @@ class ForumTopicManager final : public Actor {
private:
static constexpr size_t MAX_FORUM_TOPIC_TITLE_LENGTH = 128; // server side limit for forum topic title
struct Topic {
unique_ptr<ForumTopicInfo> info_;
};
struct DialogTopics {
WaitFreeHashMap<MessageId, unique_ptr<ForumTopicInfo>, MessageIdHash> topic_infos_;
WaitFreeHashMap<MessageId, unique_ptr<Topic>, MessageIdHash> topics_;
};
void tear_down() final;
Status is_forum(DialogId dialog_id);
DialogTopics *ForumTopicManager::add_dialog_topics(DialogId dialog_id);
DialogTopics *add_dialog_topics(DialogId dialog_id);
ForumTopicInfo *add_topic_info(DialogId dialog_id, unique_ptr<ForumTopicInfo> &&forum_topic_info);
static Topic *add_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id);
ForumTopicInfo *get_topic_info(DialogId dialog_id, MessageId top_thread_message_id);