From 1fa64892e1699a8be2b82936d642f1863fb0bdf9 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 10 Jan 2024 17:49:17 +0300 Subject: [PATCH] Don't count non-member creator in administrator count. --- td/telegram/ContactsManager.cpp | 4 ++-- td/telegram/DialogParticipant.h | 4 ++++ td/telegram/DialogParticipantManager.cpp | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 63f72447a..868b08db2 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -13862,8 +13862,8 @@ void ContactsManager::speculative_add_channel_user(ChannelId channel_id, UserId LOG(INFO) << "Speculatively change status of " << user_id << " in " << channel_id << " from " << old_status << " to " << new_status; if (channel_full != nullptr) { - channel_full->is_changed |= speculative_add_count(channel_full->administrator_count, - new_status.is_administrator() - old_status.is_administrator()); + channel_full->is_changed |= speculative_add_count( + channel_full->administrator_count, new_status.is_administrator_member() - old_status.is_administrator_member()); min_count = channel_full->administrator_count; } diff --git a/td/telegram/DialogParticipant.h b/td/telegram/DialogParticipant.h index b464930f3..3202b58a9 100644 --- a/td/telegram/DialogParticipant.h +++ b/td/telegram/DialogParticipant.h @@ -541,6 +541,10 @@ class DialogParticipantStatus { return type_ == Type::Administrator || type_ == Type::Creator; } + bool is_administrator_member() const { + return type_ == Type::Administrator || (type_ == Type::Creator && is_member()); + } + bool is_restricted() const { return type_ == Type::Restricted; } diff --git a/td/telegram/DialogParticipantManager.cpp b/td/telegram/DialogParticipantManager.cpp index 58ce74620..429726047 100644 --- a/td/telegram/DialogParticipantManager.cpp +++ b/td/telegram/DialogParticipantManager.cpp @@ -281,7 +281,7 @@ class GetChannelAdministratorsQuery final : public Td::ResultHandler { administrators.reserve(participants->participants_.size()); for (auto &participant : participants->participants_) { DialogParticipant dialog_participant(std::move(participant), channel_type); - if (!dialog_participant.is_valid() || !dialog_participant.status_.is_administrator() || + if (!dialog_participant.is_valid() || !dialog_participant.status_.is_administrator_member() || dialog_participant.dialog_id_.get_type() != DialogType::User) { LOG(ERROR) << "Receive " << dialog_participant << " as an administrator of " << channel_id_; continue; @@ -831,7 +831,7 @@ void DialogParticipantManager::process_dialog_join_requests(DialogId dialog_id, void DialogParticipantManager::speculative_update_dialog_administrators(DialogId dialog_id, UserId user_id, const DialogParticipantStatus &new_status, const DialogParticipantStatus &old_status) { - if (new_status.is_administrator() == old_status.is_administrator() && + if (new_status.is_administrator_member() == old_status.is_administrator_member() && new_status.get_rank() == old_status.get_rank()) { return; } @@ -840,7 +840,7 @@ void DialogParticipantManager::speculative_update_dialog_administrators(DialogId return; } auto administrators = it->second; - if (new_status.is_administrator()) { + if (new_status.is_administrator_member()) { bool is_found = false; for (auto &administrator : administrators) { if (administrator.get_user_id() == user_id) {