Add updateSavedMessagesTopic and more fields about the topic.
This commit is contained in:
parent
b45cd6e298
commit
0baa1424f9
@ -1902,8 +1902,12 @@ savedMessagesTopicAuthorHidden = SavedMessagesTopic;
|
|||||||
savedMessagesTopicSavedFromChat chat_id:int53 = SavedMessagesTopic;
|
savedMessagesTopicSavedFromChat chat_id:int53 = SavedMessagesTopic;
|
||||||
|
|
||||||
|
|
||||||
//@description Contains information about a found Saved Messages topic @topic The topic @last_message Last message in the topic; may be null if none or unknown
|
//@description Contains information about a found Saved Messages topic
|
||||||
foundSavedMessagesTopic topic:SavedMessagesTopic last_message:message = FoundSavedMessagesTopic;
|
//@topic The topic
|
||||||
|
//@is_pinned True, if the topic is pinned
|
||||||
|
//@order A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order
|
||||||
|
//@last_message Last message in the topic; may be null if none or unknown
|
||||||
|
foundSavedMessagesTopic topic:SavedMessagesTopic is_pinned:Bool order:int64 last_message:message = FoundSavedMessagesTopic;
|
||||||
|
|
||||||
//@description Contains a list of Saved Messages topics
|
//@description Contains a list of Saved Messages topics
|
||||||
//@total_count Total number of Saved Messages topics found
|
//@total_count Total number of Saved Messages topics found
|
||||||
@ -6506,6 +6510,9 @@ updateChatFolders chat_folders:vector<chatFolderInfo> main_chat_list_position:in
|
|||||||
//@online_member_count New number of online members in the chat, or 0 if unknown
|
//@online_member_count New number of online members in the chat, or 0 if unknown
|
||||||
updateChatOnlineMemberCount chat_id:int53 online_member_count:int32 = Update;
|
updateChatOnlineMemberCount chat_id:int53 online_member_count:int32 = Update;
|
||||||
|
|
||||||
|
//@description Basic information about a Saved Messages topic has changed @topic New information about the topic
|
||||||
|
updateSavedMessagesTopic topic:foundSavedMessagesTopic = Update;
|
||||||
|
|
||||||
//@description The list of pinned Saved Messages topics has changed. The app can call getPinnedSavedMessagesTopics to get the new list
|
//@description The list of pinned Saved Messages topics has changed. The app can call getPinnedSavedMessagesTopics to get the new list
|
||||||
updatePinnedSavedMessagesTopics = Update;
|
updatePinnedSavedMessagesTopics = Update;
|
||||||
|
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#include "td/utils/format.h"
|
#include "td/utils/format.h"
|
||||||
#include "td/utils/logging.h"
|
#include "td/utils/logging.h"
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
class GetPinnedSavedDialogsQuery final : public Td::ResultHandler {
|
class GetPinnedSavedDialogsQuery final : public Td::ResultHandler {
|
||||||
@ -366,11 +368,29 @@ void SavedMessagesManager::on_topic_message_deleted(SavedMessagesTopicId saved_m
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SavedMessagesManager::on_topic_changed(SavedMessagesTopicId saved_messages_topic_id, SavedMessagesTopic *topic) {
|
void SavedMessagesManager::on_topic_changed(SavedMessagesTopicId saved_messages_topic_id, SavedMessagesTopic *topic) {
|
||||||
|
CHECK(topic != nullptr);
|
||||||
if (!topic->is_changed_) {
|
if (!topic->is_changed_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO send updateSavedMessagesTopic
|
if (topic->private_order_ != 0) {
|
||||||
|
bool is_deleted = topic_list_.ordered_topics_.erase({topic->private_order_, saved_messages_topic_id}) > 0;
|
||||||
|
CHECK(is_deleted);
|
||||||
|
}
|
||||||
|
if (topic->pinned_order_ != 0) {
|
||||||
|
topic->private_order_ = topic->pinned_order_;
|
||||||
|
} else if (topic->last_message_id_ != MessageId()) {
|
||||||
|
topic->private_order_ = (static_cast<int64>(topic->last_message_date_) << 31) +
|
||||||
|
topic->last_message_id_.get_prev_server_message_id().get_server_message_id().get();
|
||||||
|
}
|
||||||
|
if (topic->private_order_ != 0) {
|
||||||
|
bool is_inserted = topic_list_.ordered_topics_.insert({topic->private_order_, saved_messages_topic_id}).second;
|
||||||
|
CHECK(is_inserted);
|
||||||
|
}
|
||||||
|
|
||||||
|
send_closure(G()->td(), &Td::send_update,
|
||||||
|
td_api::make_object<td_api::updateSavedMessagesTopic>(
|
||||||
|
get_found_saved_messages_topic_object(saved_messages_topic_id, topic)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SavedMessagesManager::get_pinned_saved_messages_topics(
|
void SavedMessagesManager::get_pinned_saved_messages_topics(
|
||||||
@ -552,13 +572,18 @@ void SavedMessagesManager::on_get_saved_messages_topics(
|
|||||||
|
|
||||||
td_api::object_ptr<td_api::foundSavedMessagesTopic> SavedMessagesManager::get_found_saved_messages_topic_object(
|
td_api::object_ptr<td_api::foundSavedMessagesTopic> SavedMessagesManager::get_found_saved_messages_topic_object(
|
||||||
SavedMessagesTopicId saved_messages_topic_id, const SavedMessagesTopic *topic) const {
|
SavedMessagesTopicId saved_messages_topic_id, const SavedMessagesTopic *topic) const {
|
||||||
|
CHECK(topic != nullptr);
|
||||||
td_api::object_ptr<td_api::message> last_message_object;
|
td_api::object_ptr<td_api::message> last_message_object;
|
||||||
if (topic->last_message_id_ != MessageId()) {
|
if (topic->last_message_id_ != MessageId()) {
|
||||||
last_message_object = td_->messages_manager_->get_message_object(
|
last_message_object = td_->messages_manager_->get_message_object(
|
||||||
{td_->dialog_manager_->get_my_dialog_id(), topic->last_message_id_}, "get_found_saved_messages_topic_object");
|
{td_->dialog_manager_->get_my_dialog_id(), topic->last_message_id_}, "get_found_saved_messages_topic_object");
|
||||||
}
|
}
|
||||||
|
auto public_order = TopicDate(topic->private_order_, saved_messages_topic_id) <= topic_list_.last_topic_date_
|
||||||
|
? topic->private_order_
|
||||||
|
: static_cast<int64>(0);
|
||||||
return td_api::make_object<td_api::foundSavedMessagesTopic>(
|
return td_api::make_object<td_api::foundSavedMessagesTopic>(
|
||||||
saved_messages_topic_id.get_saved_messages_topic_object(td_), std::move(last_message_object));
|
saved_messages_topic_id.get_saved_messages_topic_object(td_), topic->pinned_order_ != 0, public_order,
|
||||||
|
std::move(last_message_object));
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 SavedMessagesManager::get_next_pinned_saved_messages_topic_order() {
|
int64 SavedMessagesManager::get_next_pinned_saved_messages_topic_order() {
|
||||||
@ -816,4 +841,20 @@ void SavedMessagesManager::on_update_pinned_saved_messages_topics() {
|
|||||||
send_closure(G()->td(), &Td::send_update, td_api::make_object<td_api::updatePinnedSavedMessagesTopics>());
|
send_closure(G()->td(), &Td::send_update, td_api::make_object<td_api::updatePinnedSavedMessagesTopics>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SavedMessagesManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const {
|
||||||
|
if (td_->auth_manager_->is_bot()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &it : saved_messages_topics_) {
|
||||||
|
const auto *topic = it.second.get();
|
||||||
|
updates.push_back(td_api::make_object<td_api::updateSavedMessagesTopic>(
|
||||||
|
get_found_saved_messages_topic_object(topic->saved_messages_topic_id_, topic)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const SavedMessagesManager::TopicDate SavedMessagesManager::MIN_TOPIC_DATE{std::numeric_limits<int64>::max(),
|
||||||
|
SavedMessagesTopicId()};
|
||||||
|
const SavedMessagesManager::TopicDate SavedMessagesManager::MAX_TOPIC_DATE{0, SavedMessagesTopicId()};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
#include "td/utils/Promise.h"
|
#include "td/utils/Promise.h"
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
class Td;
|
class Td;
|
||||||
@ -57,6 +59,8 @@ class SavedMessagesManager final : public Actor {
|
|||||||
|
|
||||||
void on_update_pinned_saved_messages_topics();
|
void on_update_pinned_saved_messages_topics();
|
||||||
|
|
||||||
|
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr int32 MAX_GET_HISTORY = 100; // server side limit
|
static constexpr int32 MAX_GET_HISTORY = 100; // server side limit
|
||||||
|
|
||||||
@ -65,9 +69,38 @@ class SavedMessagesManager final : public Actor {
|
|||||||
MessageId last_message_id_;
|
MessageId last_message_id_;
|
||||||
int32 last_message_date_ = 0;
|
int32 last_message_date_ = 0;
|
||||||
int64 pinned_order_ = 0;
|
int64 pinned_order_ = 0;
|
||||||
|
int64 private_order_ = 0;
|
||||||
bool is_changed_ = true;
|
bool is_changed_ = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TopicDate {
|
||||||
|
int64 order_;
|
||||||
|
SavedMessagesTopicId topic_id_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TopicDate(int64 order, SavedMessagesTopicId topic_id) : order_(order), topic_id_(topic_id) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(const TopicDate &other) const {
|
||||||
|
return order_ > other.order_ ||
|
||||||
|
(order_ == other.order_ && topic_id_.get_unique_id() > other.topic_id_.get_unique_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<=(const TopicDate &other) const {
|
||||||
|
return order_ > other.order_ ||
|
||||||
|
(order_ == other.order_ && topic_id_.get_unique_id() >= other.topic_id_.get_unique_id());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const TopicDate MIN_TOPIC_DATE;
|
||||||
|
static const TopicDate MAX_TOPIC_DATE;
|
||||||
|
|
||||||
|
struct TopicList {
|
||||||
|
std::set<TopicDate> ordered_topics_;
|
||||||
|
|
||||||
|
TopicDate last_topic_date_ = MIN_TOPIC_DATE; // in memory
|
||||||
|
};
|
||||||
|
|
||||||
void tear_down() final;
|
void tear_down() final;
|
||||||
|
|
||||||
SavedMessagesTopic *get_topic(SavedMessagesTopicId saved_messages_topic_id);
|
SavedMessagesTopic *get_topic(SavedMessagesTopicId saved_messages_topic_id);
|
||||||
@ -104,6 +137,8 @@ class SavedMessagesManager final : public Actor {
|
|||||||
bool are_pinned_saved_messages_topics_inited_ = false;
|
bool are_pinned_saved_messages_topics_inited_ = false;
|
||||||
|
|
||||||
int64 current_pinned_saved_messages_topic_order_ = static_cast<int64>(2147000000) << 32;
|
int64 current_pinned_saved_messages_topic_order_ = static_cast<int64>(2147000000) << 32;
|
||||||
|
|
||||||
|
TopicList topic_list_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -4305,6 +4305,8 @@ void Td::on_request(uint64 id, const td_api::getCurrentState &request) {
|
|||||||
|
|
||||||
notification_manager_->get_current_state(updates);
|
notification_manager_->get_current_state(updates);
|
||||||
|
|
||||||
|
saved_messages_manager_->get_current_state(updates);
|
||||||
|
|
||||||
story_manager_->get_current_state(updates);
|
story_manager_->get_current_state(updates);
|
||||||
|
|
||||||
config_manager_.get_actor_unsafe()->get_current_state(updates);
|
config_manager_.get_actor_unsafe()->get_current_state(updates);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user