mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Fix default chat rights for creator.
This commit is contained in:
parent
c3c1759f3c
commit
223681d2da
8 changed files with 71 additions and 54 deletions
|
@ -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(
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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 &) {
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue