diff --git a/CMakeLists.txt b/CMakeLists.txt index c66d93421..ae246c949 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -352,6 +352,7 @@ set(TDLIB_SOURCE td/telegram/files/FileUploader.cpp td/telegram/files/PartsManager.cpp td/telegram/files/ResourceManager.cpp + td/telegram/ForumTopic.cpp td/telegram/ForumTopicEditedData.cpp td/telegram/ForumTopicIcon.cpp td/telegram/ForumTopicInfo.cpp @@ -583,6 +584,7 @@ set(TDLIB_SOURCE td/telegram/files/ResourceManager.h td/telegram/files/ResourceState.h td/telegram/FolderId.h + td/telegram/ForumTopic.h td/telegram/ForumTopicEditedData.h td/telegram/ForumTopicIcon.h td/telegram/ForumTopicInfo.h diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 83e2ffb50..7df64052d 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -1316,7 +1316,7 @@ forumTopicEditedData title:string edit_icon_custom_emoji_id:Bool icon_custom_emo forumTopicIcon color:int32 custom_emoji_id:int64 = ForumTopicIcon; //@description Contains basic information about a forum topic -//@message_thread_id Thread identifier of the topic +//@message_thread_id Message thread identifier of the topic //@title Title of the topic //@icon Icon of the topic //@creation_date Date the topic was created @@ -1325,6 +1325,19 @@ forumTopicIcon color:int32 custom_emoji_id:int64 = ForumTopicIcon; //@is_closed True, if the topic is closed forumTopicInfo message_thread_id:int53 title:string icon:forumTopicIcon creation_date:int32 creator_id:MessageSender is_outgoing:Bool is_closed:Bool = ForumTopicInfo; +//@description Describes a forum topic +//@info Basic information about the topic +//@last_message Last message in the topic; may be null +//@is_pinned True, if the topic is pinned in the topic list +//@unread_count Number of unread messages in the topic +//@last_read_inbox_message_id Identifier of the last read incoming message +//@last_read_outbox_message_id Identifier of the last read outgoing message +//@unread_mention_count Number of unread messages with a mention/reply in the topic +//@unread_reaction_count Number of messages with unread reactions in the topic +//@notification_settings Notification settings for the topic +//@draft_message A draft of a message in the topic; may be null +forumTopic info:forumTopicInfo last_message:message is_pinned:Bool unread_count:int32 last_read_inbox_message_id:int53 last_read_outbox_message_id:int53 unread_mention_count:int32 unread_reaction_count:int32 notification_settings:chatNotificationSettings draft_message:draftMessage = ForumTopic; + //@class RichText @description Describes a text object inside an instant-view web page diff --git a/td/telegram/ForumTopic.cpp b/td/telegram/ForumTopic.cpp new file mode 100644 index 000000000..50b1caa10 --- /dev/null +++ b/td/telegram/ForumTopic.cpp @@ -0,0 +1,51 @@ +// +// 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) +// +#include "td/telegram/ForumTopic.h" + +#include "td/telegram/DraftMessage.h" +#include "td/telegram/Td.h" + +#include "td/utils/logging.h" + +namespace td { + +ForumTopic::ForumTopic(Td *td, tl_object_ptr &&forum_topic_ptr) { + CHECK(forum_topic_ptr != nullptr); + if (forum_topic_ptr->get_id() != telegram_api::forumTopic::ID) { + LOG(INFO) << "Receive " << to_string(forum_topic_ptr); + return; + } + info_ = ForumTopicInfo(forum_topic_ptr); + auto *forum_topic = static_cast(forum_topic_ptr.get()); + + last_message_id_ = MessageId(ServerMessageId(forum_topic->top_message_)); + is_pinned_ = forum_topic->pinned_; + unread_count_ = forum_topic->unread_count_; + last_read_inbox_message_id_ = MessageId(ServerMessageId(forum_topic->read_inbox_max_id_)); + last_read_outbox_message_id_ = MessageId(ServerMessageId(forum_topic->read_outbox_max_id_)); + unread_mention_count_ = forum_topic->unread_mentions_count_; + unread_reaction_count_ = forum_topic->unread_reactions_count_; + notification_settings_ = + get_dialog_notification_settings(std::move(forum_topic->notify_settings_), false, false, false, false); + draft_message_ = get_draft_message(td->contacts_manager_.get(), std::move(forum_topic->draft_)); +} + +td_api::object_ptr ForumTopic::get_forum_topic_object(Td *td) const { + if (is_empty()) { + return nullptr; + } + + // TODO draft_message = can_send_message(dialog_id, info_.get_thread_id()).is_ok() ? ... : nullptr; + // TODO last_message + auto draft_message = get_draft_message_object(draft_message_); + return td_api::make_object( + info_.get_forum_topic_info_object(td), nullptr, is_pinned_, unread_count_, last_read_inbox_message_id_.get(), + last_read_outbox_message_id_.get(), unread_mention_count_, unread_reaction_count_, + get_chat_notification_settings_object(¬ification_settings_), std::move(draft_message)); +} + +} // namespace td diff --git a/td/telegram/ForumTopic.h b/td/telegram/ForumTopic.h new file mode 100644 index 000000000..2196e2908 --- /dev/null +++ b/td/telegram/ForumTopic.h @@ -0,0 +1,50 @@ +// +// 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 + +#include "td/telegram/DialogNotificationSettings.h" +#include "td/telegram/ForumTopicInfo.h" +#include "td/telegram/MessageId.h" +#include "td/telegram/td_api.h" +#include "td/telegram/telegram_api.h" + +#include "td/utils/common.h" + +namespace td { + +class DraftMessage; +class Td; + +class ForumTopic { + ForumTopicInfo info_; + MessageId last_message_id_; + bool is_pinned_ = false; + int32 unread_count_ = 0; + MessageId last_read_inbox_message_id_; + MessageId last_read_outbox_message_id_; + int32 unread_mention_count_ = 0; + int32 unread_reaction_count_ = 0; + DialogNotificationSettings notification_settings_; + unique_ptr draft_message_; + + public: + ForumTopic() = default; + + ForumTopic(Td *td, tl_object_ptr &&forum_topic_ptr); + + bool is_empty() const { + return info_.is_empty(); + } + + MessageId get_thread_id() const { + return info_.get_thread_id(); + } + + td_api::object_ptr get_forum_topic_object(Td *td) const; +}; + +} // namespace td diff --git a/td/telegram/ForumTopicInfo.cpp b/td/telegram/ForumTopicInfo.cpp index 4bf949372..7e84c8004 100644 --- a/td/telegram/ForumTopicInfo.cpp +++ b/td/telegram/ForumTopicInfo.cpp @@ -19,7 +19,7 @@ ForumTopicInfo::ForumTopicInfo(const tl_object_ptr &fo LOG(ERROR) << "Receive " << to_string(forum_topic_ptr); return; } - const telegram_api::forumTopic *forum_topic = static_cast(forum_topic_ptr.get()); + const auto *forum_topic = static_cast(forum_topic_ptr.get()); top_thread_message_id_ = MessageId(ServerMessageId(forum_topic->id_)); title_ = forum_topic->title_; diff --git a/td/telegram/ForumTopicInfo.h b/td/telegram/ForumTopicInfo.h index 3ac1ed14f..01d50c48b 100644 --- a/td/telegram/ForumTopicInfo.h +++ b/td/telegram/ForumTopicInfo.h @@ -39,6 +39,10 @@ class ForumTopicInfo { return !top_thread_message_id_.is_valid(); } + MessageId get_thread_id() const { + return top_thread_message_id_; + } + td_api::object_ptr get_forum_topic_info_object(Td *td) const; };