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:
commit
ab56d522b0
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue