Don't count non-member creator in administrator count.

This commit is contained in:
levlam 2024-01-10 17:49:17 +03:00
parent 44eba3d214
commit 1fa64892e1
3 changed files with 9 additions and 5 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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) {