Track my tags usages.

This commit is contained in:
John Preston 2024-01-04 12:08:49 +04:00
parent 9aacff8b54
commit e667436a98
2 changed files with 61 additions and 0 deletions

View file

@ -378,6 +378,56 @@ void Reactions::setFavorite(const ReactionId &id) {
applyFavorite(id);
}
void Reactions::incrementMyTag(const ReactionId &id) {
auto i = ranges::find(_myTagsInfo, id, &MyTagInfo::id);
if (i == end(_myTagsInfo)) {
_myTagsInfo.push_back({ .id = id, .count = 0 });
i = end(_myTagsInfo) - 1;
}
++i->count;
while (i != begin(_myTagsInfo)) {
auto j = i - 1;
if (j->count >= i->count) {
break;
}
std::swap(*i, *j);
i = j;
}
scheduleMyTagsUpdate();
}
void Reactions::decrementMyTag(const ReactionId &id) {
auto i = ranges::find(_myTagsInfo, id, &MyTagInfo::id);
if (i->count <= 0) {
return;
}
--i->count;
while (i + 1 != end(_myTagsInfo)) {
auto j = i + 1;
if (j->count <= i->count) {
break;
}
std::swap(*i, *j);
i = j;
}
scheduleMyTagsUpdate();
}
void Reactions::scheduleMyTagsUpdate() {
_myTagsUpdateScheduled = true;
crl::on_main(&session(), [=] {
if (!_myTagsUpdateScheduled) {
return;
}
_myTagsUpdateScheduled = false;
_myTagsIds = _myTagsInfo | ranges::views::transform(
&MyTagInfo::id
) | ranges::to_vector;
_myTags = resolveByIds(_myTagsIds, _unresolvedMyTags);
_myTagsUpdated.fire({});
});
}
DocumentData *Reactions::chooseGenericAnimation(
not_null<DocumentData*> custom) const {
const auto sticker = custom->sticker();
@ -1155,6 +1205,10 @@ void MessageReactions::add(const ReactionId &id, bool addToRecent) {
return;
}
auto my = 0;
const auto tags = _item->reactionsAreTags();
if (tags) {
history->owner().reactions().incrementMyTag(id);
}
_list.erase(ranges::remove_if(_list, [&](MessageReaction &one) {
const auto removing = one.my && (my == myLimit || ++my == myLimit);
if (!removing) {
@ -1176,6 +1230,9 @@ void MessageReactions::add(const ReactionId &id, bool addToRecent) {
}
}
}
if (tags) {
history->owner().reactions().decrementMyTag(one.id);
}
return removed;
}), end(_list));
const auto peer = history->peer;

View file

@ -93,6 +93,8 @@ public:
[[nodiscard]] ReactionId favoriteId() const;
[[nodiscard]] const Reaction *favorite() const;
void setFavorite(const ReactionId &id);
void incrementMyTag(const ReactionId &id);
void decrementMyTag(const ReactionId &id);
[[nodiscard]] DocumentData *chooseGenericAnimation(
not_null<DocumentData*> custom) const;
@ -165,6 +167,7 @@ private:
base::flat_set<ReactionId> &unresolved);
void resolve(const ReactionId &id);
void applyFavorite(const ReactionId &id);
void scheduleMyTagsUpdate();
[[nodiscard]] std::optional<Reaction> parse(
const MTPAvailableReaction &entry);
@ -234,6 +237,7 @@ private:
mtpRequestId _myTagsRequestId = 0;
bool _myTagsRequestScheduled = false;
bool _myTagsUpdateScheduled = false;
uint64 _myTagsHash = 0;
mtpRequestId _tagsRequestId = 0;