Added api support for dates of chat participant data.

This commit is contained in:
23rd 2024-09-09 14:38:44 +03:00
parent 6b0c606d25
commit 975460d268
4 changed files with 60 additions and 2 deletions

View file

@ -264,20 +264,24 @@ ChatParticipant::ChatParticipant(
_rank = qs(data.vrank().value_or_empty()); _rank = qs(data.vrank().value_or_empty());
_rights = ChatAdminRightsInfo(data.vadmin_rights()); _rights = ChatAdminRightsInfo(data.vadmin_rights());
_by = peerToUser(peerFromUser(data.vpromoted_by())); _by = peerToUser(peerFromUser(data.vpromoted_by()));
_date = data.vdate().v;
}, [&](const MTPDchannelParticipantSelf &data) { }, [&](const MTPDchannelParticipantSelf &data) {
_type = Type::Member; _type = Type::Member;
_date = data.vdate().v;
_by = peerToUser(peerFromUser(data.vinviter_id())); _by = peerToUser(peerFromUser(data.vinviter_id()));
if (data.vsubscription_until_date()) { if (data.vsubscription_until_date()) {
_subscriptionDate = data.vsubscription_until_date()->v; _subscriptionDate = data.vsubscription_until_date()->v;
} }
}, [&](const MTPDchannelParticipant &data) { }, [&](const MTPDchannelParticipant &data) {
_type = Type::Member; _type = Type::Member;
_date = data.vdate().v;
if (data.vsubscription_until_date()) { if (data.vsubscription_until_date()) {
_subscriptionDate = data.vsubscription_until_date()->v; _subscriptionDate = data.vsubscription_until_date()->v;
} }
}, [&](const MTPDchannelParticipantBanned &data) { }, [&](const MTPDchannelParticipantBanned &data) {
_restrictions = ChatRestrictionsInfo(data.vbanned_rights()); _restrictions = ChatRestrictionsInfo(data.vbanned_rights());
_by = peerToUser(peerFromUser(data.vkicked_by())); _by = peerToUser(peerFromUser(data.vkicked_by()));
_date = data.vdate().v;
_type = (_restrictions.flags & ChatRestriction::ViewMessages) _type = (_restrictions.flags & ChatRestriction::ViewMessages)
? Type::Banned ? Type::Banned
@ -358,6 +362,20 @@ TimeId ChatParticipant::subscriptionDate() const {
return _subscriptionDate; 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 { ChatParticipant::Type ChatParticipant::type() const {
return _type; return _type;
} }

View file

@ -61,6 +61,9 @@ public:
ChatAdminRightsInfo rights() const; ChatAdminRightsInfo rights() const;
TimeId subscriptionDate() const; TimeId subscriptionDate() const;
TimeId promotedSince() const;
TimeId restrictedSince() const;
TimeId memberSince() const;
Type type() const; Type type() const;
QString rank() const; QString rank() const;
@ -76,6 +79,7 @@ private:
QString _rank; QString _rank;
TimeId _subscriptionDate = 0; TimeId _subscriptionDate = 0;
TimeId _date = 0;
ChatRestrictionsInfo _restrictions; ChatRestrictionsInfo _restrictions;
ChatAdminRightsInfo _rights; ChatAdminRightsInfo _rights;

View file

@ -387,6 +387,24 @@ QString ParticipantsAdditionalData::adminRank(
return (i != end(_adminRanks)) ? i->second : QString(); return (i != end(_adminRanks)) ? i->second : QString();
} }
TimeId ParticipantsAdditionalData::adminPromotedSince(
not_null<UserData*> user) const {
const auto i = _adminPromotedSince.find(user);
return (i != end(_adminPromotedSince)) ? i->second : TimeId(0);
}
TimeId ParticipantsAdditionalData::restrictedSince(
not_null<PeerData*> peer) const {
const auto i = _restrictedSince.find(peer);
return (i != end(_restrictedSince)) ? i->second : TimeId(0);
}
TimeId ParticipantsAdditionalData::memberSince(
not_null<UserData*> user) const {
const auto i = _memberSince.find(user);
return (i != end(_memberSince)) ? i->second : TimeId(0);
}
auto ParticipantsAdditionalData::restrictedRights( auto ParticipantsAdditionalData::restrictedRights(
not_null<PeerData*> participant) const not_null<PeerData*> participant) const
-> std::optional<ChatRestrictionsInfo> { -> std::optional<ChatRestrictionsInfo> {
@ -689,6 +707,11 @@ UserData *ParticipantsAdditionalData::applyAdmin(
} else { } else {
_adminRanks.remove(user); _adminRanks.remove(user);
} }
if (data.promotedSince()) {
_adminPromotedSince[user] = data.promotedSince();
} else {
_adminPromotedSince.remove(user);
}
if (const auto by = _peer->owner().userLoaded(data.by())) { if (const auto by = _peer->owner().userLoaded(data.by())) {
const auto i = _adminPromotedBy.find(user); const auto i = _adminPromotedBy.find(user);
if (i == _adminPromotedBy.end()) { if (i == _adminPromotedBy.end()) {
@ -741,6 +764,11 @@ PeerData *ParticipantsAdditionalData::applyBanned(
} else { } else {
_kicked.erase(participant); _kicked.erase(participant);
} }
if (data.restrictedSince()) {
_restrictedSince[participant] = data.restrictedSince();
} else {
_restrictedSince.remove(participant);
}
_restrictedRights[participant] = data.restrictions(); _restrictedRights[participant] = data.restrictions();
if (const auto by = _peer->owner().userLoaded(data.by())) { if (const auto by = _peer->owner().userLoaded(data.by())) {
const auto i = _restrictedBy.find(participant); const auto i = _restrictedBy.find(participant);

View file

@ -106,14 +106,19 @@ public:
not_null<PeerData*> participant) const; not_null<PeerData*> participant) const;
[[nodiscard]] std::optional<ChatAdminRightsInfo> adminRights( [[nodiscard]] std::optional<ChatAdminRightsInfo> adminRights(
not_null<UserData*> user) const; not_null<UserData*> user) const;
QString adminRank(not_null<UserData*> user) const; [[nodiscard]] QString adminRank(not_null<UserData*> user) const;
[[nodiscard]] std::optional<ChatRestrictionsInfo> restrictedRights( [[nodiscard]] std::optional<ChatRestrictionsInfo> restrictedRights(
not_null<PeerData*> participant) const; not_null<PeerData*> participant) const;
[[nodiscard]] bool isCreator(not_null<UserData*> user) const; [[nodiscard]] bool isCreator(not_null<UserData*> user) const;
[[nodiscard]] bool isExternal(not_null<PeerData*> participant) const; [[nodiscard]] bool isExternal(not_null<PeerData*> participant) const;
[[nodiscard]] bool isKicked(not_null<PeerData*> participant) const; [[nodiscard]] bool isKicked(not_null<PeerData*> participant) const;
[[nodiscard]] UserData *adminPromotedBy(not_null<UserData*> user) const; [[nodiscard]] UserData *adminPromotedBy(not_null<UserData*> user) const;
[[nodiscard]] UserData *restrictedBy(not_null<PeerData*> participant) const; [[nodiscard]] UserData *restrictedBy(
not_null<PeerData*> participant) const;
[[nodiscard]] TimeId adminPromotedSince(not_null<UserData*>) const;
[[nodiscard]] TimeId restrictedSince(not_null<PeerData*>) const;
[[nodiscard]] TimeId memberSince(not_null<UserData*>) const;
void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel); void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel);
@ -144,6 +149,9 @@ private:
// Data for channels. // Data for channels.
base::flat_map<not_null<UserData*>, ChatAdminRightsInfo> _adminRights; base::flat_map<not_null<UserData*>, ChatAdminRightsInfo> _adminRights;
base::flat_map<not_null<UserData*>, QString> _adminRanks; base::flat_map<not_null<UserData*>, QString> _adminRanks;
base::flat_map<not_null<UserData*>, TimeId> _adminPromotedSince;
base::flat_map<not_null<PeerData*>, TimeId> _restrictedSince;
base::flat_map<not_null<UserData*>, TimeId> _memberSince;
base::flat_set<not_null<UserData*>> _adminCanEdit; base::flat_set<not_null<UserData*>> _adminCanEdit;
base::flat_map<not_null<UserData*>, not_null<UserData*>> _adminPromotedBy; base::flat_map<not_null<UserData*>, not_null<UserData*>> _adminPromotedBy;
std::map<not_null<PeerData*>, ChatRestrictionsInfo> _restrictedRights; std::map<not_null<PeerData*>, ChatRestrictionsInfo> _restrictedRights;