| 456 | } |
| 457 | |
| 458 | bool UpdateUserpics( |
| 459 | not_null<State*> state, |
| 460 | not_null<HistoryItem*> item, |
| 461 | const std::vector<PeerWithReaction> &ids) { |
| 462 | auto &owner = item->history()->owner(); |
| 463 | |
| 464 | struct ResolvedPeer { |
| 465 | PeerData *peer = nullptr; |
| 466 | TimeId date = 0; |
| 467 | bool dateReacted = false; |
| 468 | ReactionId reaction; |
| 469 | }; |
| 470 | const auto peers = ranges::views::all( |
| 471 | ids |
| 472 | ) | ranges::views::transform([&](PeerWithReaction id) { |
| 473 | return ResolvedPeer{ |
| 474 | .peer = owner.peerLoaded(id.peerWithDate.peer), |
| 475 | .date = id.peerWithDate.date, |
| 476 | .dateReacted = id.peerWithDate.dateReacted, |
| 477 | .reaction = id.reaction, |
| 478 | }; |
| 479 | }) | ranges::views::filter([](ResolvedPeer resolved) { |
| 480 | return resolved.peer != nullptr; |
| 481 | }) | ranges::to_vector; |
| 482 | |
| 483 | const auto same = [&] { |
| 484 | if (state->userpics.size() != peers.size()) { |
| 485 | return false; |
| 486 | } |
| 487 | const auto count = state->userpics.size(); |
| 488 | for (auto i = size_t(); i != count; ++i) { |
| 489 | const auto &userpic = state->userpics[i]; |
| 490 | const auto &resolved = peers[i]; |
| 491 | if ((userpic.peer.get() != resolved.peer) |
| 492 | || (userpic.date != resolved.date) |
| 493 | || (userpic.reaction != resolved.reaction)) { |
| 494 | return false; |
| 495 | } |
| 496 | } |
| 497 | return true; |
| 498 | }(); |
| 499 | if (same) { |
| 500 | return false; |
| 501 | } |
| 502 | auto &was = state->userpics; |
| 503 | auto now = std::vector<Userpic>(); |
| 504 | for (const auto &resolved : peers) { |
| 505 | const auto peer = not_null{ resolved.peer }; |
| 506 | const auto &data = ReactionEntityData(resolved.reaction); |
| 507 | const auto i = ranges::find(was, peer, &Userpic::peer); |
| 508 | if (i != end(was) && i->view.cloud) { |
| 509 | i->date = resolved.date; |
| 510 | i->dateReacted = resolved.dateReacted; |
| 511 | i->reaction = resolved.reaction; |
| 512 | now.push_back(std::move(*i)); |
| 513 | now.back().customEntityData = data; |
| 514 | continue; |
| 515 | } |
no test coverage detected