Process updates about pinned forum topics.

This commit is contained in:
levlam 2022-12-30 01:06:05 +03:00
parent 9fb35e8c95
commit 3422ab1082
5 changed files with 96 additions and 12 deletions

View File

@ -46,6 +46,14 @@ class ForumTopic {
bool update_last_read_inbox_message_id(MessageId last_read_inbox_message_id, int32 unread_count);
bool set_is_pinned(bool is_pinned) {
if (is_pinned_ == is_pinned) {
return false;
}
is_pinned_ = is_pinned;
return true;
}
DialogNotificationSettings *get_notification_settings() {
return &notification_settings_;
}

View File

@ -29,6 +29,7 @@
#include "td/telegram/telegram_api.h"
#include "td/telegram/UpdatesManager.h"
#include "td/utils/algorithm.h"
#include "td/utils/buffer.h"
#include "td/utils/logging.h"
#include "td/utils/Random.h"
@ -600,6 +601,53 @@ void ForumTopicManager::on_update_forum_topic_notify_settings(
std::move(notification_settings));
}
void ForumTopicManager::on_update_forum_topic_is_pinned(DialogId dialog_id, MessageId top_thread_message_id,
bool is_pinned) {
if (!can_be_forum(dialog_id)) {
LOG(ERROR) << "Receive pinned topics in " << dialog_id;
return;
}
if (td_->auth_manager_->is_bot()) {
return;
}
auto topic = get_topic(dialog_id, top_thread_message_id);
if (topic == nullptr || topic->topic_ == nullptr) {
return;
}
if (topic->topic_->set_is_pinned(is_pinned)) {
topic->need_save_to_database_ = true;
save_topic_to_database(dialog_id, topic);
}
}
void ForumTopicManager::on_update_pinned_forum_topics(DialogId dialog_id, vector<MessageId> top_thread_message_ids) {
if (!can_be_forum(dialog_id)) {
LOG(ERROR) << "Receive pinned topics in " << dialog_id;
return;
}
if (td_->auth_manager_->is_bot()) {
return;
}
auto dialog_topics = get_dialog_topics(dialog_id);
if (dialog_topics == nullptr) {
return;
}
dialog_topics->topics_.foreach([&](const MessageId &top_thread_message_id, unique_ptr<Topic> &topic) {
if (topic->topic_ == nullptr) {
return;
}
if (topic->topic_->set_is_pinned(contains(top_thread_message_ids, top_thread_message_id))) {
topic->need_save_to_database_ = true;
save_topic_to_database(dialog_id, topic.get());
}
});
}
Status ForumTopicManager::set_forum_topic_notification_settings(
DialogId dialog_id, MessageId top_thread_message_id,
tl_object_ptr<td_api::chatNotificationSettings> &&notification_settings) {
@ -995,6 +1043,10 @@ ForumTopicManager::DialogTopics *ForumTopicManager::add_dialog_topics(DialogId d
return dialog_topics;
}
ForumTopicManager::DialogTopics *ForumTopicManager::get_dialog_topics(DialogId dialog_id) {
return dialog_topics_.get_pointer(dialog_id);
}
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) {
@ -1008,6 +1060,10 @@ ForumTopicManager::Topic *ForumTopicManager::add_topic(DialogTopics *dialog_topi
return topic;
}
ForumTopicManager::Topic *ForumTopicManager::get_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id) {
return dialog_topics->topics_.get_pointer(top_thread_message_id);
}
ForumTopicManager::Topic *ForumTopicManager::add_topic(DialogId dialog_id, MessageId top_thread_message_id) {
return add_topic(add_dialog_topics(dialog_id), top_thread_message_id);
}

View File

@ -95,6 +95,10 @@ class ForumTopicManager final : public Actor {
tl_object_ptr<telegram_api::peerNotifySettings> &&peer_notify_settings,
const char *source);
void on_update_forum_topic_is_pinned(DialogId dialog_id, MessageId top_thread_message_id, bool is_pinned);
void on_update_pinned_forum_topics(DialogId dialog_id, vector<MessageId> top_thread_message_ids);
void on_forum_topic_edited(DialogId dialog_id, MessageId top_thread_message_id,
const ForumTopicEditedData &edited_data);
@ -141,8 +145,12 @@ class ForumTopicManager final : public Actor {
DialogTopics *add_dialog_topics(DialogId dialog_id);
DialogTopics *get_dialog_topics(DialogId dialog_id);
static Topic *add_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id);
static Topic *get_topic(DialogTopics *dialog_topics, MessageId top_thread_message_id);
Topic *add_topic(DialogId dialog_id, MessageId top_thread_message_id);
Topic *get_topic(DialogId dialog_id, MessageId top_thread_message_id);

View File

@ -3043,6 +3043,27 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateReadChannelDisc
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopic> update, Promise<Unit> &&promise) {
td_->forum_topic_manager_->on_update_forum_topic_is_pinned(
DialogId(ChannelId(update->channel_id_)), MessageId(ServerMessageId(update->topic_id_)), update->pinned_);
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopics> update, Promise<Unit> &&promise) {
vector<MessageId> top_thread_message_ids;
for (auto &server_message_id : update->order_) {
auto message_id = MessageId(ServerMessageId(server_message_id));
if (!message_id.is_valid()) {
LOG(ERROR) << "Receive " << to_string(update);
break;
}
top_thread_message_ids.push_back(message_id);
}
td_->forum_topic_manager_->on_update_pinned_forum_topics(DialogId(ChannelId(update->channel_id_)),
std::move(top_thread_message_ids));
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updatePinnedMessages> update, Promise<Unit> &&promise) {
int new_pts = update->pts_;
int pts_count = update->pts_count_;
@ -3799,12 +3820,4 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateTranscribedAudi
// unsupported updates
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopic> update, Promise<Unit> &&promise) {
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopics> update, Promise<Unit> &&promise) {
promise.set_value(Unit());
}
} // namespace td

View File

@ -480,6 +480,9 @@ class UpdatesManager final : public Actor {
void on_update(tl_object_ptr<telegram_api::updateReadChannelDiscussionInbox> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateReadChannelDiscussionOutbox> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopic> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopics> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updatePinnedMessages> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updatePinnedChannelMessages> update, Promise<Unit> &&promise);
@ -564,10 +567,6 @@ class UpdatesManager final : public Actor {
void on_update(tl_object_ptr<telegram_api::updateTranscribedAudio> update, Promise<Unit> &&promise);
// unsupported updates
void on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopic> update, Promise<Unit> &&promise);
void on_update(tl_object_ptr<telegram_api::updateChannelPinnedTopics> update, Promise<Unit> &&promise);
};
} // namespace td