Removed duplicated MTP* rights generation.

This commit is contained in:
23rd 2021-11-22 00:16:44 +03:00 committed by John Preston
parent 0eee937e6d
commit 3271cdf251
3 changed files with 93 additions and 119 deletions

View File

@ -658,37 +658,7 @@ void AddSpecialBoxController::editAdminDone(
_editParticipantBox->closeBox();
}
const auto date = base::unixtime::now(); // Incorrect, but ignored.
if (_additional.isCreator(user) && user->isSelf()) {
using Flag = MTPDchannelParticipantCreator::Flag;
_additional.applyParticipant(MTP_channelParticipantCreator(
MTP_flags(rank.isEmpty() ? Flag(0) : Flag::f_rank),
peerToBareMTPInt(user->id),
MTP_chatAdminRights(
MTP_flags(MTPDchatAdminRights::Flags::from_raw(
uint32(rights.flags)))),
MTP_string(rank)));
} else if (!rights.flags) {
_additional.applyParticipant(MTP_channelParticipant(
peerToBareMTPInt(user->id),
MTP_int(date)));
} else {
using Flag = MTPDchannelParticipantAdmin::Flag;
const auto alreadyPromotedBy = _additional.adminPromotedBy(user);
_additional.applyParticipant(MTP_channelParticipantAdmin(
MTP_flags(Flag::f_can_edit
| (rank.isEmpty() ? Flag(0) : Flag::f_rank)),
peerToBareMTPInt(user->id),
MTPlong(), // inviter_id
peerToBareMTPInt(alreadyPromotedBy
? alreadyPromotedBy->id
: user->session().userPeerId()),
MTP_int(date),
MTP_chatAdminRights(
MTP_flags(MTPDchatAdminRights::Flags::from_raw(
uint32(rights.flags)))),
MTP_string(rank)));
}
_additional.applyAdminLocally(user, rights, rank);
if (const auto callback = _adminDoneCallback) {
callback(user, rights, rank);
}
@ -765,33 +735,7 @@ void AddSpecialBoxController::editRestrictedDone(
_editParticipantBox->closeBox();
}
const auto date = base::unixtime::now(); // Incorrect, but ignored.
if (!rights.flags) {
if (const auto user = participant->asUser()) {
_additional.applyParticipant(MTP_channelParticipant(
peerToBareMTPInt(user->id),
MTP_int(date)));
} else {
_additional.setExternal(participant);
}
} else {
const auto kicked = rights.flags & ChatRestriction::ViewMessages;
const auto alreadyRestrictedBy = _additional.restrictedBy(
participant);
_additional.applyParticipant(MTP_channelParticipantBanned(
MTP_flags(kicked
? MTPDchannelParticipantBanned::Flag::f_left
: MTPDchannelParticipantBanned::Flag(0)),
peerToMTP(participant->id),
peerToBareMTPInt(alreadyRestrictedBy
? alreadyRestrictedBy->id
: participant->session().userPeerId()),
MTP_int(date),
MTP_chatBannedRights(
MTP_flags(MTPDchatBannedRights::Flags::from_raw(
uint32(rights.flags))),
MTP_int(rights.until))));
}
_additional.applyBannedLocally(participant, rights);
if (const auto callback = _bannedDoneCallback) {
callback(participant, rights);
}

View File

@ -530,6 +530,76 @@ void ParticipantsAdditionalData::fillFromChannel(
}
}
void ParticipantsAdditionalData::applyAdminLocally(
UserData *user,
ChatAdminRightsInfo rights,
const QString &rank) {
const auto date = base::unixtime::now(); // Incorrect, but ignored.
if (isCreator(user) && user->isSelf()) {
using Flag = MTPDchannelParticipantCreator::Flag;
applyParticipant(MTP_channelParticipantCreator(
MTP_flags(rank.isEmpty() ? Flag(0) : Flag::f_rank),
peerToBareMTPInt(user->id),
MTP_chatAdminRights(
MTP_flags(MTPDchatAdminRights::Flags::from_raw(
uint32(rights.flags)))),
MTP_string(rank)));
} else if (!rights.flags) {
applyParticipant(MTP_channelParticipant(
peerToBareMTPInt(user->id),
MTP_int(date)));
} else {
using Flag = MTPDchannelParticipantAdmin::Flag;
const auto alreadyPromotedBy = adminPromotedBy(user);
applyParticipant(MTP_channelParticipantAdmin(
MTP_flags(Flag::f_can_edit
| (rank.isEmpty() ? Flag(0) : Flag::f_rank)),
peerToBareMTPInt(user->id),
MTPlong(), // inviter_id
peerToBareMTPInt(alreadyPromotedBy
? alreadyPromotedBy->id
: user->session().userPeerId()),
MTP_int(date),
MTP_chatAdminRights(
MTP_flags(MTPDchatAdminRights::Flags::from_raw(
uint32(rights.flags)))),
MTP_string(rank)));
}
}
void ParticipantsAdditionalData::applyBannedLocally(
not_null<PeerData*> participant,
ChatRestrictionsInfo rights) {
const auto user = participant->asUser();
const auto date = base::unixtime::now(); // Incorrect, but ignored.
if (!rights.flags) {
if (user) {
applyParticipant(MTP_channelParticipant(
peerToBareMTPInt(user->id),
MTP_int(date)));
} else {
setExternal(participant);
}
} else {
const auto kicked = rights.flags & ChatRestriction::ViewMessages;
const auto alreadyRestrictedBy = restrictedBy(
participant);
applyParticipant(MTP_channelParticipantBanned(
MTP_flags(kicked
? MTPDchannelParticipantBanned::Flag::f_left
: MTPDchannelParticipantBanned::Flag(0)),
peerToMTP(participant->id),
peerToBareMTPInt(alreadyRestrictedBy
? alreadyRestrictedBy->id
: participant->session().userPeerId()),
MTP_int(date),
MTP_chatBannedRights(
MTP_flags(MTPDchatBannedRights::Flags::from_raw(
uint32(rights.flags))),
MTP_int(rights.until))));
}
}
PeerData *ParticipantsAdditionalData::applyParticipant(
const MTPChannelParticipant &data) {
return applyParticipant(data, _role);
@ -1558,43 +1628,18 @@ void ParticipantsBoxController::editAdminDone(
_editParticipantBox->closeBox();
}
const auto date = base::unixtime::now(); // Incorrect, but ignored.
if (_additional.isCreator(user) && user->isSelf()) {
using Flag = MTPDchannelParticipantCreator::Flag;
_additional.applyParticipant(MTP_channelParticipantCreator(
MTP_flags(rank.isEmpty() ? Flag(0) : Flag::f_rank),
peerToBareMTPInt(user->id),
MTP_chatAdminRights(
MTP_flags(MTPDchatAdminRights::Flags::from_raw(
uint32(rights.flags)))),
MTP_string(rank)));
} else if (!rights.flags) {
_additional.applyParticipant(MTP_channelParticipant(
peerToBareMTPInt(user->id),
MTP_int(date)));
if (_role == Role::Admins) {
removeRow(user);
}
} else {
using Flag = MTPDchannelParticipantAdmin::Flag;
const auto alreadyPromotedBy = _additional.adminPromotedBy(user);
_additional.applyParticipant(MTP_channelParticipantAdmin(
MTP_flags(Flag::f_can_edit
| (rank.isEmpty() ? Flag(0) : Flag::f_rank)),
peerToBareMTPInt(user->id),
MTPlong(), // inviter_id
peerToBareMTPInt(alreadyPromotedBy
? alreadyPromotedBy->id
: user->session().userPeerId()),
MTP_int(date),
MTP_chatAdminRights(
MTP_flags(MTPDchatAdminRights::Flags::from_raw(
uint32(rights.flags)))),
MTP_string(rank)));
if (_role == Role::Admins) {
prependRow(user);
} else if (_role == Role::Kicked || _role == Role::Restricted) {
removeRow(user);
_additional.applyAdminLocally(user, rights, rank);
if (!_additional.isCreator(user) || !user->isSelf()) {
if (!rights.flags) {
if (_role == Role::Admins) {
removeRow(user);
}
} else {
if (_role == Role::Admins) {
prependRow(user);
} else if (_role == Role::Kicked || _role == Role::Restricted) {
removeRow(user);
}
}
}
recomputeTypeFor(user);
@ -1636,36 +1681,13 @@ void ParticipantsBoxController::editRestrictedDone(
_editParticipantBox->closeBox();
}
const auto user = participant->asUser();
const auto date = base::unixtime::now(); // Incorrect, but ignored.
_additional.applyBannedLocally(participant, rights);
if (!rights.flags) {
if (user) {
_additional.applyParticipant(MTP_channelParticipant(
peerToBareMTPInt(user->id),
MTP_int(date)));
} else {
_additional.setExternal(participant);
}
if (_role == Role::Kicked || _role == Role::Restricted) {
removeRow(participant);
}
} else {
const auto kicked = rights.flags & ChatRestriction::ViewMessages;
const auto alreadyRestrictedBy = _additional.restrictedBy(
participant);
_additional.applyParticipant(MTP_channelParticipantBanned(
MTP_flags(kicked
? MTPDchannelParticipantBanned::Flag::f_left
: MTPDchannelParticipantBanned::Flag(0)),
peerToMTP(participant->id),
peerToBareMTPInt(alreadyRestrictedBy
? alreadyRestrictedBy->id
: participant->session().userPeerId()),
MTP_int(date),
MTP_chatBannedRights(
MTP_flags(MTPDchatBannedRights::Flags::from_raw(
uint32(rights.flags))),
MTP_int(rights.until))));
if (kicked) {
if (_role == Role::Kicked) {
prependRow(participant);

View File

@ -108,6 +108,14 @@ public:
void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel);
void applyAdminLocally(
UserData *user,
ChatAdminRightsInfo rights,
const QString &rank);
void applyBannedLocally(
not_null<PeerData*> participant,
ChatRestrictionsInfo rights);
private:
UserData *applyCreator(const MTPDchannelParticipantCreator &data);
UserData *applyAdmin(const MTPDchannelParticipantAdmin &data);