From 975460d2681da92eb99c025cbf3e79e0087eea13 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 9 Sep 2024 14:38:44 +0300 Subject: [PATCH] Added api support for dates of chat participant data. --- .../SourceFiles/api/api_chat_participants.cpp | 18 ++++++++++++ .../SourceFiles/api/api_chat_participants.h | 4 +++ .../boxes/peers/edit_participants_box.cpp | 28 +++++++++++++++++++ .../boxes/peers/edit_participants_box.h | 12 ++++++-- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/api/api_chat_participants.cpp b/Telegram/SourceFiles/api/api_chat_participants.cpp index 429bb4882..10663d1de 100644 --- a/Telegram/SourceFiles/api/api_chat_participants.cpp +++ b/Telegram/SourceFiles/api/api_chat_participants.cpp @@ -264,20 +264,24 @@ ChatParticipant::ChatParticipant( _rank = qs(data.vrank().value_or_empty()); _rights = ChatAdminRightsInfo(data.vadmin_rights()); _by = peerToUser(peerFromUser(data.vpromoted_by())); + _date = data.vdate().v; }, [&](const MTPDchannelParticipantSelf &data) { _type = Type::Member; + _date = data.vdate().v; _by = peerToUser(peerFromUser(data.vinviter_id())); if (data.vsubscription_until_date()) { _subscriptionDate = data.vsubscription_until_date()->v; } }, [&](const MTPDchannelParticipant &data) { _type = Type::Member; + _date = data.vdate().v; if (data.vsubscription_until_date()) { _subscriptionDate = data.vsubscription_until_date()->v; } }, [&](const MTPDchannelParticipantBanned &data) { _restrictions = ChatRestrictionsInfo(data.vbanned_rights()); _by = peerToUser(peerFromUser(data.vkicked_by())); + _date = data.vdate().v; _type = (_restrictions.flags & ChatRestriction::ViewMessages) ? Type::Banned @@ -358,6 +362,20 @@ TimeId ChatParticipant::subscriptionDate() const { return _subscriptionDate; } +TimeId ChatParticipant::promotedSince() const { + return (_type == Type::Admin) ? _date : TimeId(0); +} + +TimeId ChatParticipant::restrictedSince() const { + return (_type == Type::Restricted || _type == Type::Banned) + ? _date + : TimeId(0); +} + +TimeId ChatParticipant::memberSince() const { + return (_type == Type::Member) ? _date : TimeId(0); +} + ChatParticipant::Type ChatParticipant::type() const { return _type; } diff --git a/Telegram/SourceFiles/api/api_chat_participants.h b/Telegram/SourceFiles/api/api_chat_participants.h index c57911f4a..df332522d 100644 --- a/Telegram/SourceFiles/api/api_chat_participants.h +++ b/Telegram/SourceFiles/api/api_chat_participants.h @@ -61,6 +61,9 @@ public: ChatAdminRightsInfo rights() const; TimeId subscriptionDate() const; + TimeId promotedSince() const; + TimeId restrictedSince() const; + TimeId memberSince() const; Type type() const; QString rank() const; @@ -76,6 +79,7 @@ private: QString _rank; TimeId _subscriptionDate = 0; + TimeId _date = 0; ChatRestrictionsInfo _restrictions; ChatAdminRightsInfo _rights; diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index 88a349001..2b4f4a202 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -387,6 +387,24 @@ QString ParticipantsAdditionalData::adminRank( return (i != end(_adminRanks)) ? i->second : QString(); } +TimeId ParticipantsAdditionalData::adminPromotedSince( + not_null user) const { + const auto i = _adminPromotedSince.find(user); + return (i != end(_adminPromotedSince)) ? i->second : TimeId(0); +} + +TimeId ParticipantsAdditionalData::restrictedSince( + not_null peer) const { + const auto i = _restrictedSince.find(peer); + return (i != end(_restrictedSince)) ? i->second : TimeId(0); +} + +TimeId ParticipantsAdditionalData::memberSince( + not_null user) const { + const auto i = _memberSince.find(user); + return (i != end(_memberSince)) ? i->second : TimeId(0); +} + auto ParticipantsAdditionalData::restrictedRights( not_null participant) const -> std::optional { @@ -689,6 +707,11 @@ UserData *ParticipantsAdditionalData::applyAdmin( } else { _adminRanks.remove(user); } + if (data.promotedSince()) { + _adminPromotedSince[user] = data.promotedSince(); + } else { + _adminPromotedSince.remove(user); + } if (const auto by = _peer->owner().userLoaded(data.by())) { const auto i = _adminPromotedBy.find(user); if (i == _adminPromotedBy.end()) { @@ -741,6 +764,11 @@ PeerData *ParticipantsAdditionalData::applyBanned( } else { _kicked.erase(participant); } + if (data.restrictedSince()) { + _restrictedSince[participant] = data.restrictedSince(); + } else { + _restrictedSince.remove(participant); + } _restrictedRights[participant] = data.restrictions(); if (const auto by = _peer->owner().userLoaded(data.by())) { const auto i = _restrictedBy.find(participant); diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.h b/Telegram/SourceFiles/boxes/peers/edit_participants_box.h index c9550232d..b993c740c 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.h +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.h @@ -106,14 +106,19 @@ public: not_null participant) const; [[nodiscard]] std::optional adminRights( not_null user) const; - QString adminRank(not_null user) const; + [[nodiscard]] QString adminRank(not_null user) const; [[nodiscard]] std::optional restrictedRights( not_null participant) const; [[nodiscard]] bool isCreator(not_null user) const; [[nodiscard]] bool isExternal(not_null participant) const; [[nodiscard]] bool isKicked(not_null participant) const; [[nodiscard]] UserData *adminPromotedBy(not_null user) const; - [[nodiscard]] UserData *restrictedBy(not_null participant) const; + [[nodiscard]] UserData *restrictedBy( + not_null participant) const; + + [[nodiscard]] TimeId adminPromotedSince(not_null) const; + [[nodiscard]] TimeId restrictedSince(not_null) const; + [[nodiscard]] TimeId memberSince(not_null) const; void migrate(not_null chat, not_null channel); @@ -144,6 +149,9 @@ private: // Data for channels. base::flat_map, ChatAdminRightsInfo> _adminRights; base::flat_map, QString> _adminRanks; + base::flat_map, TimeId> _adminPromotedSince; + base::flat_map, TimeId> _restrictedSince; + base::flat_map, TimeId> _memberSince; base::flat_set> _adminCanEdit; base::flat_map, not_null> _adminPromotedBy; std::map, ChatRestrictionsInfo> _restrictedRights;