Correctly handle complex pin_messages/manage_topics.

This commit is contained in:
John Preston
2022-10-24 13:13:21 +04:00
parent 53beb6f562
commit 70e5f752ba
16 changed files with 135 additions and 53 deletions
+13 -7
View File
@@ -524,21 +524,25 @@ bool PeerData::canPinMessages() const {
} else if (const auto channel = asChannel()) {
return channel->isMegagroup()
? !channel->amRestricted(ChatRestriction::PinMessages)
: ((channel->adminRights() & ChatAdminRight::EditMessages)
|| channel->amCreator());
: ((channel->amCreator()
|| channel->adminRights() & ChatAdminRight::EditMessages));
}
Unexpected("Peer type in PeerData::canPinMessages.");
}
bool PeerData::canCreateTopics() const {
return isForum() && canPinMessages();
if (const auto channel = asChannel()) {
return channel->isForum()
&& !channel->amRestricted(ChatRestriction::CreateTopics);
}
return false;
}
bool PeerData::canEditTopics() const {
if (const auto channel = asChannel()) {
return channel->isForum()
&& (channel->amCreator()
|| (channel->adminRights() & ChatAdminRight::PinMessages));
|| (channel->adminRights() & ChatAdminRight::ManageTopics));
}
return false;
}
@@ -959,12 +963,14 @@ Data::RestrictionCheckResult PeerData::amRestricted(
ChatRestriction right) const {
using Result = Data::RestrictionCheckResult;
const auto allowByAdminRights = [](auto right, auto chat) -> bool {
if (right == ChatRestriction::InviteUsers) {
return chat->adminRights() & ChatAdminRight::InviteUsers;
if (right == ChatRestriction::AddParticipants) {
return chat->adminRights() & ChatAdminRight::InviteByLinkOrAdd;
} else if (right == ChatRestriction::ChangeInfo) {
return chat->adminRights() & ChatAdminRight::ChangeInfo;
} else if (right == ChatRestriction::CreateTopics) {
return chat->adminRights() & ChatAdminRight::ManageTopics;
} else if (right == ChatRestriction::PinMessages) {
return chat->adminRights() & ChatAdminRight::PinMessages;
return chat->adminRights() & ChatAdminRight::PinMessagesOrTopics;
} else {
return chat->hasAdminRights();
}