Merge pull request #1 from overinvest/patch-2

This code improves readability and structure by using functional transformations and filtering, as well as explicitly updating userpics
This commit is contained in:
overinvest 2024-04-17 23:33:57 +03:00 committed by GitHub
commit ab56d522b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 48 additions and 56 deletions

View File

@ -416,64 +416,56 @@ struct State {
}
bool UpdateUserpics(
not_null<State*> state,
not_null<HistoryItem*> item,
const std::vector<PeerWithReaction> &ids) {
auto &owner = item->history()->owner();
not_null<State*> state,
not_null<HistoryItem*> item,
const std::vector<PeerWithReaction> &ids) {
auto &owner = item->history()->owner();
struct ResolvedPeer {
PeerData *peer = nullptr;
TimeId date = 0;
bool dateReacted = false;
ReactionId reaction;
};
const auto peers = ranges::views::all(
ids
) | ranges::views::transform([&](PeerWithReaction id) {
return ResolvedPeer{
.peer = owner.peerLoaded(id.peerWithDate.peer),
.date = id.peerWithDate.date,
.dateReacted = id.peerWithDate.dateReacted,
.reaction = id.reaction,
};
}) | ranges::views::filter([](ResolvedPeer resolved) {
return resolved.peer != nullptr;
}) | ranges::to_vector;
auto resolvePeer = [&](const PeerWithReaction& id) -> std::optional<ResolvedPeer> {
auto peerData = owner.peerLoaded(id.peerWithDate.peer);
if (peerData) {
return ResolvedPeer {
.peer = peerData,
.date = id.peerWithDate.date,
.dateReacted = id.peerWithDate.dateReacted,
.reaction = id.reaction
};
}
return std::nullopt;
};
const auto same = ranges::equal(
state->userpics,
peers,
ranges::equal_to(),
[](const Userpic &u) { return std::pair(u.peer.get(), u.date); },
[](const ResolvedPeer &r) { return std::pair(r.peer, r.date); });
if (same) {
return false;
}
auto &was = state->userpics;
auto now = std::vector<Userpic>();
for (const auto &resolved : peers) {
const auto peer = not_null{ resolved.peer };
const auto &data = ReactionEntityData(resolved.reaction);
const auto i = ranges::find(was, peer, &Userpic::peer);
if (i != end(was) && i->view.cloud) {
i->date = resolved.date;
i->dateReacted = resolved.dateReacted;
now.push_back(std::move(*i));
now.back().customEntityData = data;
continue;
}
now.push_back(Userpic{
.peer = peer,
.date = resolved.date,
.dateReacted = resolved.dateReacted,
.customEntityData = data,
});
auto &userpic = now.back();
userpic.uniqueKey = peer->userpicUniqueKey(userpic.view);
peer->loadUserpic();
}
was = std::move(now);
return true;
auto resolvedPeers = ids | ranges::views::transform(resolvePeer)
| ranges::views::filter([](const auto& resolved){ return resolved.has_value(); })
| ranges::views::transform([](const auto& resolved){ return resolved.value(); })
| ranges::to_vector;
if (ranges::equal(state->userpics, resolvedPeers, {},
[](const auto& userpic){ return std::tie(userpic.peer, userpic.date); },
[](const auto& resolved){ return std::tie(resolved.peer, resolved.date); })) {
return false;
}
state->userpics = resolvedPeers | ranges::views::transform([&](const auto& resolved) {
auto i = ranges::find(state->userpics, resolved.peer, &Userpic::peer);
if (i != end(state->userpics) && i->view.cloud) {
i->date = resolved.date;
i->dateReacted = resolved.dateReacted;
i->customEntityData = ReactionEntityData(resolved.reaction);
return *i;
} else {
auto userpic = Userpic {
.peer = resolved.peer,
.date = resolved.date,
.dateReacted = resolved.dateReacted,
.customEntityData = ReactionEntityData(resolved.reaction)
};
userpic.uniqueKey = resolved.peer->userpicUniqueKey(userpic.view);
resolved.peer->loadUserpic();
return userpic;
}
}) | ranges::to_vector;
return true;
}
void RegenerateUserpics(not_null<State*> state, int small, int large) {