Simplify pin_messages/manage_topics logic.

This commit is contained in:
John Preston 2022-10-24 15:52:43 +04:00
parent 72354f52d4
commit b4a9705564
14 changed files with 16 additions and 59 deletions

View file

@ -2890,8 +2890,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_rights_group_invite_link" = "Invite users via link"; "lng_rights_group_invite_link" = "Invite users via link";
"lng_rights_group_invite" = "Add users"; "lng_rights_group_invite" = "Add users";
"lng_rights_group_pin" = "Pin messages"; "lng_rights_group_pin" = "Pin messages";
"lng_rights_group_pin_with_topics" = "Pin messages and topics";
"lng_rights_group_pin_topics" = "Pin topics";
"lng_rights_group_topics" = "Manage topics"; "lng_rights_group_topics" = "Manage topics";
"lng_rights_group_add_topics" = "Create topics"; "lng_rights_group_add_topics" = "Create topics";
"lng_rights_group_manage_calls" = "Manage voice chats"; "lng_rights_group_manage_calls" = "Manage voice chats";
@ -3110,8 +3108,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_admin_log_admin_invite_users" = "Add members"; "lng_admin_log_admin_invite_users" = "Add members";
"lng_admin_log_admin_invite_link" = "Invite users via link"; "lng_admin_log_admin_invite_link" = "Invite users via link";
"lng_admin_log_admin_pin_messages" = "Pin messages"; "lng_admin_log_admin_pin_messages" = "Pin messages";
"lng_admin_log_admin_pin_messages_topics" = "Pin messages and topics";
"lng_admin_log_admin_pin_topics" = "Pin topics";
"lng_admin_log_admin_manage_topics" = "Manage topics"; "lng_admin_log_admin_manage_topics" = "Manage topics";
"lng_admin_log_admin_create_topics" = "Create topics"; "lng_admin_log_admin_create_topics" = "Create topics";
"lng_admin_log_admin_manage_calls" = "Manage voice chats"; "lng_admin_log_admin_manage_calls" = "Manage voice chats";

View file

@ -224,7 +224,7 @@ ChatAdminRightsInfo EditAdminBox::defaultRights() const {
| Flag::BanUsers | Flag::BanUsers
| Flag::InviteByLinkOrAdd | Flag::InviteByLinkOrAdd
| Flag::ManageTopics | Flag::ManageTopics
| Flag::PinMessagesOrTopics | Flag::PinMessages
| Flag::ManageCall) } | Flag::ManageCall) }
: ChatAdminRightsInfo{ (Flag::ChangeInfo : ChatAdminRightsInfo{ (Flag::ChangeInfo
| Flag::PostMessages | Flag::PostMessages
@ -329,14 +329,10 @@ void EditAdminBox::prepare() {
const auto anyoneCanAddMembers = chat const auto anyoneCanAddMembers = chat
? chat->anyoneCanAddMembers() ? chat->anyoneCanAddMembers()
: channel->anyoneCanAddMembers(); : channel->anyoneCanAddMembers();
const auto anyoneCanPinMessages = chat
? chat->anyoneCanPinMessages()
: channel->anyoneCanPinMessages();
const auto options = Data::AdminRightsSetOptions{ const auto options = Data::AdminRightsSetOptions{
.isGroup = isGroup, .isGroup = isGroup,
.isForum = peer()->isForum(), .isForum = peer()->isForum(),
.anyoneCanAddMembers = anyoneCanAddMembers, .anyoneCanAddMembers = anyoneCanAddMembers,
.anyoneCanPinMessages = anyoneCanPinMessages,
}; };
auto [checkboxes, getChecked, changes] = CreateEditAdminRights( auto [checkboxes, getChecked, changes] = CreateEditAdminRights(
inner, inner,

View file

@ -189,7 +189,7 @@ ChatRestrictions DisabledByAdminRights(not_null<PeerData*> peer) {
| ((adminRights & Admin::ManageTopics) | ((adminRights & Admin::ManageTopics)
? Flag(0) ? Flag(0)
: Flag::CreateTopics) : Flag::CreateTopics)
| ((adminRights & Admin::PinMessagesOrTopics) | ((adminRights & Admin::PinMessages)
? Flag(0) ? Flag(0)
: Flag::PinMessages) : Flag::PinMessages)
| ((adminRights & Admin::InviteByLinkOrAdd) | ((adminRights & Admin::InviteByLinkOrAdd)
@ -311,15 +311,10 @@ ChatAdminRights DisabledByDefaultRestrictions(not_null<PeerData*> peer) {
} }
Unexpected("User in DisabledByDefaultRestrictions."); Unexpected("User in DisabledByDefaultRestrictions.");
}()); }());
const auto forum = peer->isForum();
return Flag(0) return Flag(0)
// | ((restrictions & Restriction::PinMessages)
// We allow to edit 'pin_messages' admin right in forums
// even if it is allowed in default permissions, because
// if everyone can 'pin_messages' admin can also pin topics.
| ((forum || (restrictions & Restriction::PinMessages))
? Flag(0) ? Flag(0)
: Flag::PinMessagesOrTopics) : Flag::PinMessages)
// //
// We allow to edit 'invite_users' admin right no matter what // We allow to edit 'invite_users' admin right no matter what
// is chosen in default permissions for 'invite_users', because // is chosen in default permissions for 'invite_users', because
@ -765,11 +760,7 @@ std::vector<AdminRightLabel> AdminRightLabels(
? tr::lng_rights_group_invite_link(tr::now) ? tr::lng_rights_group_invite_link(tr::now)
: tr::lng_rights_group_invite(tr::now) }, : tr::lng_rights_group_invite(tr::now) },
{ Flag::ManageTopics, tr::lng_rights_group_topics(tr::now) }, { Flag::ManageTopics, tr::lng_rights_group_topics(tr::now) },
{ Flag::PinMessagesOrTopics, !options.isForum { Flag::PinMessages, tr::lng_rights_group_pin(tr::now) },
? tr::lng_rights_group_pin(tr::now)
: options.anyoneCanPinMessages
? tr::lng_rights_group_pin_topics(tr::now)
: tr::lng_rights_group_pin_with_topics(tr::now) },
{ Flag::ManageCall, tr::lng_rights_group_manage_calls(tr::now) }, { Flag::ManageCall, tr::lng_rights_group_manage_calls(tr::now) },
{ Flag::Anonymous, tr::lng_rights_group_anonymous(tr::now) }, { Flag::Anonymous, tr::lng_rights_group_anonymous(tr::now) },
{ Flag::AddAdmins, tr::lng_rights_add_admins(tr::now) }, { Flag::AddAdmins, tr::lng_rights_add_admins(tr::now) },

View file

@ -299,7 +299,7 @@ bool ShowWallPaper(
} else if (element == u"manage_topics"_q) { } else if (element == u"manage_topics"_q) {
result |= ChatAdminRight::ManageTopics; result |= ChatAdminRight::ManageTopics;
} else if (element == u"pin_messages"_q) { } else if (element == u"pin_messages"_q) {
result |= ChatAdminRight::PinMessagesOrTopics; result |= ChatAdminRight::PinMessages;
} else if (element == u"promote_members"_q) { } else if (element == u"promote_members"_q) {
result |= ChatAdminRight::AddAdmins; result |= ChatAdminRight::AddAdmins;
} else if (element == u"manage_video_chats"_q) { } else if (element == u"manage_video_chats"_q) {

View file

@ -528,10 +528,6 @@ bool ChannelData::anyoneCanAddMembers() const {
return !(defaultRestrictions() & Restriction::AddParticipants); return !(defaultRestrictions() & Restriction::AddParticipants);
} }
bool ChannelData::anyoneCanPinMessages() const {
return !(defaultRestrictions() & Restriction::PinMessages);
}
bool ChannelData::hiddenPreHistory() const { bool ChannelData::hiddenPreHistory() const {
return (flags() & Flag::PreHistoryHidden); return (flags() & Flag::PreHistoryHidden);
} }

View file

@ -324,7 +324,6 @@ public:
[[nodiscard]] bool canBanMembers() const; [[nodiscard]] bool canBanMembers() const;
[[nodiscard]] bool canSendPolls() const; [[nodiscard]] bool canSendPolls() const;
[[nodiscard]] bool anyoneCanAddMembers() const; [[nodiscard]] bool anyoneCanAddMembers() const;
[[nodiscard]] bool anyoneCanPinMessages() const;
[[nodiscard]] bool canEditMessages() const; [[nodiscard]] bool canEditMessages() const;
[[nodiscard]] bool canDeleteMessages() const; [[nodiscard]] bool canDeleteMessages() const;

View file

@ -58,7 +58,7 @@ ChatAdminRightsInfo ChatData::defaultAdminRights(not_null<UserData*> user) {
| Flag::DeleteMessages | Flag::DeleteMessages
| Flag::BanUsers | Flag::BanUsers
| Flag::InviteByLinkOrAdd | Flag::InviteByLinkOrAdd
| Flag::PinMessagesOrTopics | Flag::PinMessages
| Flag::ManageCall | Flag::ManageCall
| (isCreator ? Flag::AddAdmins : Flag(0))); | (isCreator ? Flag::AddAdmins : Flag(0)));
} }
@ -116,10 +116,6 @@ bool ChatData::anyoneCanAddMembers() const {
return !(defaultRestrictions() & ChatRestriction::AddParticipants); return !(defaultRestrictions() & ChatRestriction::AddParticipants);
} }
bool ChatData::anyoneCanPinMessages() const {
return !(defaultRestrictions() & ChatRestriction::PinMessages);
}
void ChatData::setName(const QString &newName) { void ChatData::setName(const QString &newName) {
updateNameDelayed(newName.isEmpty() ? name() : newName, {}, {}); updateNameDelayed(newName.isEmpty() ? name() : newName, {}, {});
} }

View file

@ -112,7 +112,6 @@ public:
[[nodiscard]] bool canBanMembers() const; [[nodiscard]] bool canBanMembers() const;
[[nodiscard]] bool canSendPolls() const; [[nodiscard]] bool canSendPolls() const;
[[nodiscard]] bool anyoneCanAddMembers() const; [[nodiscard]] bool anyoneCanAddMembers() const;
[[nodiscard]] bool anyoneCanPinMessages() const;
void applyEditAdmin(not_null<UserData*> user, bool isAdmin); void applyEditAdmin(not_null<UserData*> user, bool isAdmin);

View file

@ -19,7 +19,7 @@ enum class ChatAdminRight {
DeleteMessages = (1 << 3), DeleteMessages = (1 << 3),
BanUsers = (1 << 4), BanUsers = (1 << 4),
InviteByLinkOrAdd = (1 << 5), InviteByLinkOrAdd = (1 << 5),
PinMessagesOrTopics = (1 << 7), PinMessages = (1 << 7),
AddAdmins = (1 << 9), AddAdmins = (1 << 9),
Anonymous = (1 << 10), Anonymous = (1 << 10),
ManageCall = (1 << 11), ManageCall = (1 << 11),
@ -74,7 +74,6 @@ struct AdminRightsSetOptions {
bool isGroup : 1 = false; bool isGroup : 1 = false;
bool isForum : 1 = false; bool isForum : 1 = false;
bool anyoneCanAddMembers : 1 = false; bool anyoneCanAddMembers : 1 = false;
bool anyoneCanPinMessages : 1 = false;
}; };
struct RestrictionsSetOptions { struct RestrictionsSetOptions {

View file

@ -206,7 +206,7 @@ bool ForumTopic::my() const {
} }
bool ForumTopic::canEdit() const { bool ForumTopic::canEdit() const {
return my() || channel()->canEditTopics(); return my() || channel()->canManageTopics();
} }
bool ForumTopic::canDelete() const { bool ForumTopic::canDelete() const {
@ -223,12 +223,7 @@ bool ForumTopic::canToggleClosed() const {
} }
bool ForumTopic::canTogglePinned() const { bool ForumTopic::canTogglePinned() const {
if (creating()) { return !creating() && channel()->canManageTopics();
return false;
}
const auto channel = this->channel();
return channel->amCreator()
|| (channel->adminRights() & ChatAdminRight::PinMessagesOrTopics);
} }
bool ForumTopic::creating() const { bool ForumTopic::creating() const {

View file

@ -538,7 +538,7 @@ bool PeerData::canCreateTopics() const {
return false; return false;
} }
bool PeerData::canEditTopics() const { bool PeerData::canManageTopics() const {
if (const auto channel = asChannel()) { if (const auto channel = asChannel()) {
return channel->isForum() return channel->isForum()
&& (channel->amCreator() && (channel->amCreator()
@ -970,7 +970,7 @@ Data::RestrictionCheckResult PeerData::amRestricted(
} else if (right == ChatRestriction::CreateTopics) { } else if (right == ChatRestriction::CreateTopics) {
return chat->adminRights() & ChatAdminRight::ManageTopics; return chat->adminRights() & ChatAdminRight::ManageTopics;
} else if (right == ChatRestriction::PinMessages) { } else if (right == ChatRestriction::PinMessages) {
return chat->adminRights() & ChatAdminRight::PinMessagesOrTopics; return chat->adminRights() & ChatAdminRight::PinMessages;
} else { } else {
return chat->hasAdminRights(); return chat->hasAdminRights();
} }

View file

@ -340,7 +340,7 @@ public:
[[nodiscard]] bool canPinMessages() const; [[nodiscard]] bool canPinMessages() const;
[[nodiscard]] bool canEditMessagesIndefinitely() const; [[nodiscard]] bool canEditMessagesIndefinitely() const;
[[nodiscard]] bool canCreateTopics() const; [[nodiscard]] bool canCreateTopics() const;
[[nodiscard]] bool canEditTopics() const; [[nodiscard]] bool canManageTopics() const;
[[nodiscard]] bool canExportChatHistory() const; [[nodiscard]] bool canExportChatHistory() const;
// Returns true if about text was changed. // Returns true if about text was changed.

View file

@ -264,7 +264,7 @@ rpl::producer<bool> CanPinMessagesValue(not_null<PeerData*> peer) {
| ChatDataFlag::Creator; | ChatDataFlag::Creator;
return rpl::combine( return rpl::combine(
PeerFlagsValue(chat, mask), PeerFlagsValue(chat, mask),
AdminRightValue(chat, ChatAdminRight::PinMessagesOrTopics), AdminRightValue(chat, ChatAdminRight::PinMessages),
DefaultRestrictionValue(chat, ChatRestriction::PinMessages), DefaultRestrictionValue(chat, ChatRestriction::PinMessages),
[]( [](
ChatDataFlags flags, ChatDataFlags flags,
@ -284,7 +284,7 @@ rpl::producer<bool> CanPinMessagesValue(not_null<PeerData*> peer) {
return rpl::single(true); return rpl::single(true);
} }
return rpl::combine( return rpl::combine(
AdminRightValue(megagroup, ChatAdminRight::PinMessagesOrTopics), AdminRightValue(megagroup, ChatAdminRight::PinMessages),
DefaultRestrictionValue(megagroup, ChatRestriction::PinMessages), DefaultRestrictionValue(megagroup, ChatRestriction::PinMessages),
PeerFlagsValue( PeerFlagsValue(
megagroup, megagroup,

View file

@ -199,18 +199,9 @@ TextWithEntities GenerateAdminChangeText(
const auto useInviteLinkPhrase = channel->isMegagroup() const auto useInviteLinkPhrase = channel->isMegagroup()
&& channel->anyoneCanAddMembers(); && channel->anyoneCanAddMembers();
const auto pinMessagesAndTopics = channel->isForum()
&& !channel->anyoneCanPinMessages();
const auto pinOnlyTopics = channel->isForum()
&& channel->anyoneCanPinMessages();
const auto invitePhrase = useInviteLinkPhrase const auto invitePhrase = useInviteLinkPhrase
? tr::lng_admin_log_admin_invite_link ? tr::lng_admin_log_admin_invite_link
: tr::lng_admin_log_admin_invite_users; : tr::lng_admin_log_admin_invite_users;
const auto pinPhrase = pinOnlyTopics
? tr::lng_admin_log_admin_pin_topics
: pinMessagesAndTopics
? tr::lng_admin_log_admin_pin_messages_topics
: tr::lng_admin_log_admin_pin_messages;
const auto callPhrase = channel->isBroadcast() const auto callPhrase = channel->isBroadcast()
? tr::lng_admin_log_admin_manage_calls_channel ? tr::lng_admin_log_admin_manage_calls_channel
: tr::lng_admin_log_admin_manage_calls; : tr::lng_admin_log_admin_manage_calls;
@ -222,12 +213,11 @@ TextWithEntities GenerateAdminChangeText(
{ Flag::BanUsers, tr::lng_admin_log_admin_ban_users }, { Flag::BanUsers, tr::lng_admin_log_admin_ban_users },
{ Flag::InviteByLinkOrAdd, invitePhrase }, { Flag::InviteByLinkOrAdd, invitePhrase },
{ Flag::ManageTopics, tr::lng_admin_log_admin_manage_topics }, { Flag::ManageTopics, tr::lng_admin_log_admin_manage_topics },
{ Flag::PinMessagesOrTopics, pinPhrase }, { Flag::PinMessages, tr::lng_admin_log_admin_pin_messages },
{ Flag::ManageCall, tr::lng_admin_log_admin_manage_calls }, { Flag::ManageCall, tr::lng_admin_log_admin_manage_calls },
{ Flag::AddAdmins, tr::lng_admin_log_admin_add_admins }, { Flag::AddAdmins, tr::lng_admin_log_admin_add_admins },
}; };
phraseMap[Flag::InviteByLinkOrAdd] = invitePhrase; phraseMap[Flag::InviteByLinkOrAdd] = invitePhrase;
phraseMap[Flag::PinMessagesOrTopics] = pinPhrase;
phraseMap[Flag::ManageCall] = callPhrase; phraseMap[Flag::ManageCall] = callPhrase;
if (!channel->isMegagroup()) { if (!channel->isMegagroup()) {