tdlight/td/telegram/ForumTopicManager.h

124 lines
4.5 KiB
C
Raw Normal View History

2022-10-25 14:03:35 +02:00
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
2022-10-27 15:53:23 +02:00
#include "td/telegram/CustomEmojiId.h"
2022-10-25 15:10:15 +02:00
#include "td/telegram/DialogId.h"
#include "td/telegram/ForumTopicEditedData.h"
2022-10-25 15:10:15 +02:00
#include "td/telegram/ForumTopicInfo.h"
2022-11-02 17:51:41 +01:00
#include "td/telegram/MessageId.h"
2022-10-25 15:10:15 +02:00
#include "td/telegram/td_api.h"
#include "td/telegram/telegram_api.h"
2022-10-25 15:10:15 +02:00
2022-10-25 14:03:35 +02:00
#include "td/actor/actor.h"
#include "td/utils/common.h"
#include "td/utils/Promise.h"
2022-11-02 17:51:41 +01:00
#include "td/utils/Status.h"
2022-10-27 13:58:21 +02:00
#include "td/utils/WaitFreeHashMap.h"
2022-10-25 14:03:35 +02:00
namespace td {
class Td;
class ForumTopicManager final : public Actor {
public:
ForumTopicManager(Td *td, ActorShared<> parent);
ForumTopicManager(const ForumTopicManager &) = delete;
ForumTopicManager &operator=(const ForumTopicManager &) = delete;
ForumTopicManager(ForumTopicManager &&) = delete;
ForumTopicManager &operator=(ForumTopicManager &&) = delete;
~ForumTopicManager() final;
2022-10-25 15:10:15 +02:00
void create_forum_topic(DialogId dialog_id, string &&title, td_api::object_ptr<td_api::forumTopicIcon> &&icon,
Promise<td_api::object_ptr<td_api::forumTopicInfo>> &&promise);
2022-10-27 13:58:21 +02:00
void on_forum_topic_created(DialogId dialog_id, unique_ptr<ForumTopicInfo> &&forum_topic_info,
2022-10-25 15:10:15 +02:00
Promise<td_api::object_ptr<td_api::forumTopicInfo>> &&promise);
2022-10-27 15:53:23 +02:00
void edit_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, string &&title,
bool edit_icon_custom_emoji, CustomEmojiId icon_custom_emoji_id, Promise<Unit> &&promise);
2022-10-27 15:53:23 +02:00
2022-12-02 15:04:24 +01:00
void get_forum_topic(DialogId dialog_id, MessageId top_thread_message_id,
Promise<td_api::object_ptr<td_api::forumTopic>> &&promise);
2022-10-27 16:31:05 +02:00
void toggle_forum_topic_is_closed(DialogId dialog_id, MessageId top_thread_message_id, bool is_closed,
Promise<Unit> &&promise);
void toggle_forum_topic_is_hidden(DialogId dialog_id, bool is_hidden, Promise<Unit> &&promise);
2022-10-29 23:35:37 +02:00
void delete_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
void delete_all_dialog_topics(DialogId dialog_id);
void on_forum_topic_edited(DialogId dialog_id, MessageId top_thread_message_id,
const ForumTopicEditedData &edited_data);
void on_get_forum_topics(DialogId dialog_id, vector<tl_object_ptr<telegram_api::ForumTopic>> &&forum_topics,
const char *source);
void on_topic_message_count_changed(DialogId dialog_id, MessageId top_thread_message_id, int diff);
2022-10-25 14:03:35 +02:00
private:
2022-10-25 15:10:15 +02:00
static constexpr size_t MAX_FORUM_TOPIC_TITLE_LENGTH = 128; // server side limit for forum topic title
struct Topic {
unique_ptr<ForumTopicInfo> info_;
int32 message_count_ = 0;
template <class StorerT>
void store(StorerT &storer) const;
template <class ParserT>
void parse(ParserT &parser);
int32 MAGIC = 0x1fac3901;
};
2022-10-27 13:58:21 +02:00
struct DialogTopics {
WaitFreeHashMap<MessageId, unique_ptr<Topic>, MessageIdHash> topics_;
2022-10-27 13:58:21 +02:00
};
2022-10-25 14:03:35 +02:00
void tear_down() final;
2022-10-25 15:10:15 +02:00
Status is_forum(DialogId dialog_id);
2022-11-15 15:07:05 +01:00
bool can_be_forum(DialogId dialog_id) const;
DialogTopics *add_dialog_topics(DialogId dialog_id);
static Topic *add_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id);
2022-10-27 22:30:24 +02:00
Topic *add_topic(DialogId dialog_id, MessageId top_thread_message_id);
2022-11-16 14:02:22 +01:00
Topic *get_topic(DialogId dialog_id, MessageId top_thread_message_id);
const Topic *get_topic(DialogId dialog_id, MessageId top_thread_message_id) const;
2022-10-27 13:58:21 +02:00
ForumTopicInfo *get_topic_info(DialogId dialog_id, MessageId top_thread_message_id);
const ForumTopicInfo *get_topic_info(DialogId dialog_id, MessageId top_thread_message_id) const;
void on_delete_forum_topic(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
2022-10-27 23:12:44 +02:00
td_api::object_ptr<td_api::updateForumTopicInfo> get_update_forum_topic_info(DialogId dialog_id,
const ForumTopicInfo *topic_info) const;
void send_update_forum_topic_info(DialogId dialog_id, const ForumTopicInfo *topic_info) const;
void save_topic_to_database(DialogId dialog_id, const Topic *topic);
void delete_topic_from_database(DialogId dialog_id, MessageId top_thread_message_id, Promise<Unit> &&promise);
2022-10-25 14:03:35 +02:00
Td *td_;
ActorShared<> parent_;
2022-10-27 13:58:21 +02:00
WaitFreeHashMap<DialogId, unique_ptr<DialogTopics>, DialogIdHash> dialog_topics_;
2022-10-25 14:03:35 +02:00
};
} // namespace td