diff --git a/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp index 9c7aeb168..aa41ff240 100644 --- a/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/add_participants_box.cpp @@ -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); } diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index e4764ea0e..dcdb409b1 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -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 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); diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.h b/Telegram/SourceFiles/boxes/peers/edit_participants_box.h index c713a2ea9..9bafc2b53 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.h +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.h @@ -108,6 +108,14 @@ public: void migrate(not_null chat, not_null channel); + void applyAdminLocally( + UserData *user, + ChatAdminRightsInfo rights, + const QString &rank); + void applyBannedLocally( + not_null participant, + ChatRestrictionsInfo rights); + private: UserData *applyCreator(const MTPDchannelParticipantCreator &data); UserData *applyAdmin(const MTPDchannelParticipantAdmin &data);