Fix default chat rights for creator.

This commit is contained in:
John Preston 2021-02-12 14:40:55 +04:00
parent c3c1759f3c
commit 223681d2da
8 changed files with 71 additions and 54 deletions

View file

@ -329,15 +329,21 @@ Main::Session &AddSpecialBoxController::session() const {
} }
void AddSpecialBoxController::subscribeToMigration() { void AddSpecialBoxController::subscribeToMigration() {
const auto chat = _peer->asChat();
if (!chat) {
return;
}
SubscribeToMigration( SubscribeToMigration(
_peer, chat,
lifetime(), lifetime(),
[=](not_null<ChannelData*> channel) { migrate(channel); }); [=](not_null<ChannelData*> channel) { migrate(chat, channel); });
} }
void AddSpecialBoxController::migrate(not_null<ChannelData*> channel) { void AddSpecialBoxController::migrate(
not_null<ChatData*> chat,
not_null<ChannelData*> channel) {
_peer = channel; _peer = channel;
_additional.migrate(channel); _additional.migrate(chat, channel);
} }
std::unique_ptr<PeerListRow> AddSpecialBoxController::createSearchRow( std::unique_ptr<PeerListRow> AddSpecialBoxController::createSearchRow(

View file

@ -121,7 +121,7 @@ private:
std::unique_ptr<PeerListRow> createRow(not_null<UserData*> user) const; std::unique_ptr<PeerListRow> createRow(not_null<UserData*> user) const;
void subscribeToMigration(); void subscribeToMigration();
void migrate(not_null<ChannelData*> channel); void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel);
not_null<PeerData*> _peer; not_null<PeerData*> _peer;
MTP::Sender _api; MTP::Sender _api;

View file

@ -208,10 +208,10 @@ EditAdminBox::EditAdminBox(
, _oldRank(rank) { , _oldRank(rank) {
} }
MTPChatAdminRights EditAdminBox::Defaults(not_null<PeerData*> peer) { MTPChatAdminRights EditAdminBox::defaultRights() const {
const auto defaultRights = peer->isChat() const auto flags = peer()->isChat()
? ChatData::DefaultAdminRights() ? peer()->asChat()->defaultAdminRights(user())
: peer->isMegagroup() : peer()->isMegagroup()
? (Flag::f_change_info ? (Flag::f_change_info
| Flag::f_delete_messages | Flag::f_delete_messages
| Flag::f_ban_users | Flag::f_ban_users
@ -223,7 +223,7 @@ MTPChatAdminRights EditAdminBox::Defaults(not_null<PeerData*> peer) {
| Flag::f_edit_messages | Flag::f_edit_messages
| Flag::f_delete_messages | Flag::f_delete_messages
| Flag::f_invite_users); | Flag::f_invite_users);
return MTP_chatAdminRights(MTP_flags(defaultRights)); return MTP_chatAdminRights(MTP_flags(flags));
} }
void EditAdminBox::prepare() { void EditAdminBox::prepare() {
@ -242,7 +242,7 @@ void EditAdminBox::prepare() {
const auto chat = peer()->asChat(); const auto chat = peer()->asChat();
const auto channel = peer()->asChannel(); const auto channel = peer()->asChannel();
const auto prepareRights = hadRights ? _oldRights : Defaults(peer()); const auto prepareRights = hadRights ? _oldRights : defaultRights();
const auto disabledByDefaults = (channel && !channel->isMegagroup()) const auto disabledByDefaults = (channel && !channel->isMegagroup())
? MTPDchatAdminRights::Flags(0) ? MTPDchatAdminRights::Flags(0)
: DisabledByDefaultRestrictions(peer()); : DisabledByDefaultRestrictions(peer());
@ -264,12 +264,12 @@ void EditAdminBox::prepare() {
result.emplace( result.emplace(
disabledByDefaults, disabledByDefaults,
tr::lng_rights_permission_for_all(tr::now)); tr::lng_rights_permission_for_all(tr::now));
if (const auto channel = peer()->asChannel()) { if (amCreator() && user()->isSelf()) {
if (amCreator() && user()->isSelf()) { result.emplace(
result.emplace( ~Flag::f_anonymous,
~Flag::f_anonymous, tr::lng_rights_permission_cant_edit(tr::now));
tr::lng_rights_permission_cant_edit(tr::now)); } else if (const auto channel = peer()->asChannel()) {
} else if (!channel->amCreator()) { if (!channel->amCreator()) {
result.emplace( result.emplace(
~channel->adminRights(), ~channel->adminRights(),
tr::lng_rights_permission_cant_edit(tr::now)); tr::lng_rights_permission_cant_edit(tr::now));
@ -611,9 +611,9 @@ void EditRestrictedBox::prepare() {
const auto defaultRestrictions = chat const auto defaultRestrictions = chat
? chat->defaultRestrictions() ? chat->defaultRestrictions()
: channel->defaultRestrictions(); : channel->defaultRestrictions();
const auto prepareRights = (_oldRights.c_chatBannedRights().vflags().v const auto prepareRights = _oldRights.c_chatBannedRights().vflags().v
? _oldRights ? _oldRights
: Defaults(peer())); : defaultRights();
const auto prepareFlags = FixDependentRestrictions( const auto prepareFlags = FixDependentRestrictions(
prepareRights.c_chatBannedRights().vflags().v prepareRights.c_chatBannedRights().vflags().v
| defaultRestrictions | defaultRestrictions
@ -680,7 +680,7 @@ void EditRestrictedBox::prepare() {
} }
} }
MTPChatBannedRights EditRestrictedBox::Defaults(not_null<PeerData*> peer) { MTPChatBannedRights EditRestrictedBox::defaultRights() const {
return MTP_chatBannedRights(MTP_flags(0), MTP_int(0)); return MTP_chatBannedRights(MTP_flags(0), MTP_int(0));
} }

View file

@ -89,7 +89,7 @@ private:
using Flag = MTPDchatAdminRights::Flag; using Flag = MTPDchatAdminRights::Flag;
using Flags = MTPDchatAdminRights::Flags; using Flags = MTPDchatAdminRights::Flags;
static MTPChatAdminRights Defaults(not_null<PeerData*> peer); [[nodiscard]] MTPChatAdminRights defaultRights() const;
not_null<Ui::InputField*> addRankInput(); not_null<Ui::InputField*> addRankInput();
void transferOwnership(); void transferOwnership();
@ -144,7 +144,7 @@ private:
using Flag = MTPDchatBannedRights::Flag; using Flag = MTPDchatBannedRights::Flag;
using Flags = MTPDchatBannedRights::Flags; using Flags = MTPDchatBannedRights::Flags;
static MTPChatBannedRights Defaults(not_null<PeerData*> peer); [[nodiscard]] MTPChatBannedRights defaultRights() const;
bool canSave() const { bool canSave() const {
return !!_saveCallback; return !!_saveCallback;

View file

@ -224,7 +224,7 @@ Fn<void(
const MTPDchatAdminRights &data) { const MTPDchatAdminRights &data) {
return data.vflags().v; return data.vflags().v;
}); });
if (flags == ChatData::DefaultAdminRights() && rank.isEmpty()) { if (flags == chat->defaultAdminRights(user) && rank.isEmpty()) {
saveChatAdmin(true); saveChatAdmin(true);
} else if (!flags) { } else if (!flags) {
saveChatAdmin(false); saveChatAdmin(false);
@ -370,7 +370,7 @@ auto ParticipantsAdditionalData::adminRights(
if (const auto chat = _peer->asChat()) { if (const auto chat = _peer->asChat()) {
return _admins.contains(user) return _admins.contains(user)
? std::make_optional(MTPChatAdminRights(MTP_chatAdminRights( ? std::make_optional(MTPChatAdminRights(MTP_chatAdminRights(
MTP_flags(ChatData::DefaultAdminRights())))) MTP_flags(chat->defaultAdminRights(user)))))
: std::nullopt; : std::nullopt;
} }
const auto i = _adminRights.find(user); const auto i = _adminRights.find(user);
@ -671,14 +671,16 @@ UserData *ParticipantsAdditionalData::applyBanned(
return user; return user;
} }
void ParticipantsAdditionalData::migrate(not_null<ChannelData*> channel) { void ParticipantsAdditionalData::migrate(
not_null<ChatData*> chat,
not_null<ChannelData*> channel) {
_peer = channel; _peer = channel;
fillFromChannel(channel); fillFromChannel(channel);
for (const auto user : _admins) { for (const auto user : _admins) {
_adminRights.emplace( _adminRights.emplace(
user, user,
MTP_chatAdminRights(MTP_flags(ChatData::DefaultAdminRights()))); MTP_chatAdminRights(MTP_flags(chat->defaultAdminRights(user))));
if (channel->amCreator()) { if (channel->amCreator()) {
_adminCanEdit.emplace(user); _adminCanEdit.emplace(user);
} }
@ -1889,15 +1891,21 @@ void ParticipantsBoxController::refreshCustomStatus(
} }
void ParticipantsBoxController::subscribeToMigration() { void ParticipantsBoxController::subscribeToMigration() {
const auto chat = _peer->asChat();
if (!chat) {
return;
}
SubscribeToMigration( SubscribeToMigration(
_peer, chat,
lifetime(), lifetime(),
[=](not_null<ChannelData*> channel) { migrate(channel); }); [=](not_null<ChannelData*> channel) { migrate(chat, channel); });
} }
void ParticipantsBoxController::migrate(not_null<ChannelData*> channel) { void ParticipantsBoxController::migrate(
not_null<ChatData*> chat,
not_null<ChannelData*> channel) {
_peer = channel; _peer = channel;
_additional.migrate(channel); _additional.migrate(chat, channel);
subscribeToCreatorChange(channel); subscribeToCreatorChange(channel);
} }

View file

@ -101,7 +101,7 @@ public:
[[nodiscard]] UserData *adminPromotedBy(not_null<UserData*> user) const; [[nodiscard]] UserData *adminPromotedBy(not_null<UserData*> user) const;
[[nodiscard]] UserData *restrictedBy(not_null<UserData*> user) const; [[nodiscard]] UserData *restrictedBy(not_null<UserData*> user) const;
void migrate(not_null<ChannelData*> channel); void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel);
private: private:
UserData *applyCreator(const MTPDchannelParticipantCreator &data); UserData *applyCreator(const MTPDchannelParticipantCreator &data);
@ -242,7 +242,7 @@ private:
void recomputeTypeFor(not_null<UserData*> user); void recomputeTypeFor(not_null<UserData*> user);
void subscribeToMigration(); void subscribeToMigration();
void migrate(not_null<ChannelData*> channel); void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel);
void subscribeToCreatorChange(not_null<ChannelData*> channel); void subscribeToCreatorChange(not_null<ChannelData*> channel);
void fullListRefresh(); void fullListRefresh();

View file

@ -48,14 +48,17 @@ void ChatData::setPhoto(PhotoId photoId, const MTPChatPhoto &photo) {
}); });
} }
auto ChatData::DefaultAdminRights() -> AdminRights { auto ChatData::defaultAdminRights(not_null<UserData*> user) -> AdminRights {
const auto isCreator = (creator == user->bareId())
|| (user->isSelf() && amCreator());
using Flag = AdminRight; using Flag = AdminRight;
return Flag::f_change_info return Flag::f_change_info
| Flag::f_delete_messages | Flag::f_delete_messages
| Flag::f_ban_users | Flag::f_ban_users
| Flag::f_invite_users | Flag::f_invite_users
| Flag::f_pin_messages | Flag::f_pin_messages
| Flag::f_manage_call; | Flag::f_manage_call
| (isCreator ? Flag::f_add_admins : Flag(0));
} }
bool ChatData::canWrite() const { bool ChatData::canWrite() const {
@ -335,7 +338,7 @@ void ApplyChatUpdate(
} }
if (user->isSelf()) { if (user->isSelf()) {
chat->setAdminRights(MTP_chatAdminRights(mtpIsTrue(update.vis_admin()) chat->setAdminRights(MTP_chatAdminRights(mtpIsTrue(update.vis_admin())
? MTP_flags(ChatData::DefaultAdminRights()) ? MTP_flags(chat->defaultAdminRights(user))
: MTP_flags(0))); : MTP_flags(0)));
} }
if (mtpIsTrue(update.vis_admin())) { if (mtpIsTrue(update.vis_admin())) {
@ -457,7 +460,7 @@ void ApplyChatUpdate(
chat->admins.emplace(user); chat->admins.emplace(user);
if (user->isSelf()) { if (user->isSelf()) {
chat->setAdminRights(MTP_chatAdminRights( chat->setAdminRights(MTP_chatAdminRights(
MTP_flags(ChatData::DefaultAdminRights()))); MTP_flags(chat->defaultAdminRights(user))));
} }
}, [](const MTPDchatParticipant &) { }, [](const MTPDchatParticipant &) {
}); });

View file

@ -45,7 +45,7 @@ public:
void setName(const QString &newName); void setName(const QString &newName);
void invalidateParticipants(); void invalidateParticipants();
bool noParticipantInfo() const { [[nodiscard]] bool noParticipantInfo() const {
return (count > 0 || amIn()) && participants.empty(); return (count > 0 || amIn()) && participants.empty();
} }
@ -58,10 +58,10 @@ public:
void removeFlags(MTPDchat::Flags which) { void removeFlags(MTPDchat::Flags which) {
_flags.remove(which); _flags.remove(which);
} }
auto flags() const { [[nodiscard]] auto flags() const {
return _flags.current(); return _flags.current();
} }
auto flagsValue() const { [[nodiscard]] auto flagsValue() const {
return _flags.value(); return _flags.value();
} }
@ -74,58 +74,58 @@ public:
void removeFullFlags(MTPDchatFull::Flags which) { void removeFullFlags(MTPDchatFull::Flags which) {
_fullFlags.remove(which); _fullFlags.remove(which);
} }
auto fullFlags() const { [[nodiscard]] auto fullFlags() const {
return _fullFlags.current(); return _fullFlags.current();
} }
auto fullFlagsValue() const { [[nodiscard]] auto fullFlagsValue() const {
return _fullFlags.value(); return _fullFlags.value();
} }
auto adminRights() const { [[nodiscard]] auto adminRights() const {
return _adminRights.current(); return _adminRights.current();
} }
auto adminRightsValue() const { [[nodiscard]] auto adminRightsValue() const {
return _adminRights.value(); return _adminRights.value();
} }
void setAdminRights(const MTPChatAdminRights &rights); void setAdminRights(const MTPChatAdminRights &rights);
bool hasAdminRights() const { [[nodiscard]] bool hasAdminRights() const {
return (adminRights() != 0); return (adminRights() != 0);
} }
auto defaultRestrictions() const { [[nodiscard]] auto defaultRestrictions() const {
return _defaultRestrictions.current(); return _defaultRestrictions.current();
} }
auto defaultRestrictionsValue() const { [[nodiscard]] auto defaultRestrictionsValue() const {
return _defaultRestrictions.value(); return _defaultRestrictions.value();
} }
void setDefaultRestrictions(const MTPChatBannedRights &rights); void setDefaultRestrictions(const MTPChatBannedRights &rights);
bool isForbidden() const { [[nodiscard]] bool isForbidden() const {
return flags() & MTPDchat_ClientFlag::f_forbidden; return flags() & MTPDchat_ClientFlag::f_forbidden;
} }
bool amIn() const { [[nodiscard]] bool amIn() const {
return !isForbidden() return !isForbidden()
&& !isDeactivated() && !isDeactivated()
&& !haveLeft() && !haveLeft()
&& !wasKicked(); && !wasKicked();
} }
bool haveLeft() const { [[nodiscard]] bool haveLeft() const {
return flags() & MTPDchat::Flag::f_left; return flags() & MTPDchat::Flag::f_left;
} }
bool wasKicked() const { [[nodiscard]] bool wasKicked() const {
return flags() & MTPDchat::Flag::f_kicked; return flags() & MTPDchat::Flag::f_kicked;
} }
bool amCreator() const { [[nodiscard]] bool amCreator() const {
return flags() & MTPDchat::Flag::f_creator; return flags() & MTPDchat::Flag::f_creator;
} }
bool isDeactivated() const { [[nodiscard]] bool isDeactivated() const {
return flags() & MTPDchat::Flag::f_deactivated; return flags() & MTPDchat::Flag::f_deactivated;
} }
bool isMigrated() const { [[nodiscard]] bool isMigrated() const {
return flags() & MTPDchat::Flag::f_migrated_to; return flags() & MTPDchat::Flag::f_migrated_to;
} }
static AdminRights DefaultAdminRights(); [[nodiscard]] AdminRights defaultAdminRights(not_null<UserData*> user);
// Like in ChannelData. // Like in ChannelData.
bool canWrite() const; bool canWrite() const;