Support storing additional data about forum topics.
This commit is contained in:
parent
24be58d083
commit
2ee0eb67f3
@ -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) {
|
Promise<td_api::object_ptr<td_api::forumTopicInfo>> &&promise) {
|
||||||
TRY_STATUS_PROMISE(promise, G()->close_status());
|
TRY_STATUS_PROMISE(promise, G()->close_status());
|
||||||
|
|
||||||
auto topic_info = add_topic_info(dialog_id, std::move(forum_topic_info));
|
CHECK(forum_topic_info != nullptr);
|
||||||
CHECK(topic_info != nullptr);
|
auto *dialog_topics = add_dialog_topics(dialog_id);
|
||||||
promise.set_value(topic_info->get_forum_topic_info_object(td_));
|
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,
|
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()) {
|
if (!top_thread_message_id.is_valid()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto topic_info = dialog_topics->topic_infos_.get_pointer(top_thread_message_id);
|
auto topic = add_topic(dialog_topics, top_thread_message_id);
|
||||||
if (topic_info == nullptr || *topic_info != *forum_topic_info) {
|
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_ = std::move(forum_topic_info);
|
||||||
topic_info = dialog_topics->topic_infos_.get_pointer(top_thread_message_id);
|
send_update_forum_topic_info(dialog_id, topic->info_.get());
|
||||||
CHECK(topic_info != nullptr);
|
|
||||||
send_update_forum_topic_info(dialog_id, topic_info);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -338,42 +342,46 @@ Status ForumTopicManager::is_forum(DialogId dialog_id) {
|
|||||||
|
|
||||||
ForumTopicManager::DialogTopics *ForumTopicManager::add_dialog_topics(DialogId dialog_id) {
|
ForumTopicManager::DialogTopics *ForumTopicManager::add_dialog_topics(DialogId dialog_id) {
|
||||||
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
|
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
|
||||||
if (dialog_topics != nullptr) {
|
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));
|
||||||
|
}
|
||||||
return dialog_topics;
|
return dialog_topics;
|
||||||
}
|
}
|
||||||
dialog_topics_.set(dialog_id, make_unique<DialogTopics>());
|
|
||||||
return dialog_topics_.get_pointer(dialog_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
ForumTopicInfo *ForumTopicManager::add_topic_info(DialogId dialog_id, unique_ptr<ForumTopicInfo> &&forum_topic_info) {
|
ForumTopicManager::Topic *ForumTopicManager::add_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id) {
|
||||||
auto *dialog_info = add_dialog_topics(dialog_id);
|
auto topic = dialog_topics->topics_.get_pointer(top_thread_message_id);
|
||||||
|
if (topic == nullptr) {
|
||||||
CHECK(forum_topic_info != nullptr);
|
auto new_topic = make_unique<Topic>();
|
||||||
MessageId top_thread_message_id = forum_topic_info->get_top_thread_message_id();
|
topic = new_topic.get();
|
||||||
auto topic_info = dialog_info->topic_infos_.get_pointer(top_thread_message_id);
|
dialog_topics->topics_.set(top_thread_message_id, std::move(new_topic));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
return topic_info;
|
return topic;
|
||||||
}
|
}
|
||||||
|
|
||||||
ForumTopicInfo *ForumTopicManager::get_topic_info(DialogId dialog_id, MessageId top_thread_message_id) {
|
ForumTopicInfo *ForumTopicManager::get_topic_info(DialogId dialog_id, MessageId top_thread_message_id) {
|
||||||
auto *dialog_info = dialog_topics_.get_pointer(dialog_id);
|
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
|
||||||
if (dialog_info == nullptr) {
|
if (dialog_topics == nullptr) {
|
||||||
return 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 {
|
const ForumTopicInfo *ForumTopicManager::get_topic_info(DialogId dialog_id, MessageId top_thread_message_id) const {
|
||||||
auto *dialog_info = dialog_topics_.get_pointer(dialog_id);
|
auto *dialog_topics = dialog_topics_.get_pointer(dialog_id);
|
||||||
if (dialog_info == nullptr) {
|
if (dialog_topics == nullptr) {
|
||||||
return 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(
|
td_api::object_ptr<td_api::updateForumTopicInfo> ForumTopicManager::get_update_forum_topic_info(
|
||||||
|
@ -57,17 +57,21 @@ class ForumTopicManager final : public Actor {
|
|||||||
private:
|
private:
|
||||||
static constexpr size_t MAX_FORUM_TOPIC_TITLE_LENGTH = 128; // server side limit for forum topic title
|
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 {
|
struct DialogTopics {
|
||||||
WaitFreeHashMap<MessageId, unique_ptr<ForumTopicInfo>, MessageIdHash> topic_infos_;
|
WaitFreeHashMap<MessageId, unique_ptr<Topic>, MessageIdHash> topics_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void tear_down() final;
|
void tear_down() final;
|
||||||
|
|
||||||
Status is_forum(DialogId dialog_id);
|
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);
|
ForumTopicInfo *get_topic_info(DialogId dialog_id, MessageId top_thread_message_id);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user