api_messages_search_merged.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "api/api_messages_search_merged.h"
  8. #include "history/history.h"
  9. namespace Api {
  10. MessagesSearchMerged::MessagesSearchMerged(not_null<History*> history)
  11. : _apiSearch(history) {
  12. if (const auto migrated = history->migrateFrom()) {
  13. _migratedSearch.emplace(migrated);
  14. }
  15. const auto checkWaitingForTotal = [=] {
  16. if (_waitingForTotal) {
  17. if (_concatedFound.total >= 0 && _migratedFirstFound.total >= 0) {
  18. _waitingForTotal = false;
  19. _concatedFound.total += _migratedFirstFound.total;
  20. _newFounds.fire({});
  21. }
  22. } else {
  23. _newFounds.fire({});
  24. }
  25. };
  26. const auto checkFull = [=](const FoundMessages &data) {
  27. if (data.total == int(_concatedFound.messages.size())) {
  28. _isFull = true;
  29. addFound(_migratedFirstFound);
  30. }
  31. };
  32. _apiSearch.messagesFounds(
  33. ) | rpl::start_with_next([=](const FoundMessages &data) {
  34. if (data.nextToken == _concatedFound.nextToken) {
  35. addFound(data);
  36. checkFull(data);
  37. _nextFounds.fire({});
  38. } else {
  39. _concatedFound = data;
  40. checkFull(data);
  41. checkWaitingForTotal();
  42. }
  43. }, _lifetime);
  44. if (_migratedSearch) {
  45. _migratedSearch->messagesFounds(
  46. ) | rpl::start_with_next([=](const FoundMessages &data) {
  47. if (_isFull) {
  48. addFound(data);
  49. }
  50. if (data.nextToken == _migratedFirstFound.nextToken) {
  51. _nextFounds.fire({});
  52. } else {
  53. _migratedFirstFound = data;
  54. checkWaitingForTotal();
  55. }
  56. }, _lifetime);
  57. }
  58. }
  59. void MessagesSearchMerged::disableMigrated() {
  60. _migratedSearch = std::nullopt;
  61. }
  62. void MessagesSearchMerged::addFound(const FoundMessages &data) {
  63. for (const auto &message : data.messages) {
  64. _concatedFound.messages.push_back(message);
  65. }
  66. }
  67. const FoundMessages &MessagesSearchMerged::messages() const {
  68. return _concatedFound;
  69. }
  70. const MessagesSearch::Request &MessagesSearchMerged::request() const {
  71. return _request;
  72. }
  73. void MessagesSearchMerged::clear() {
  74. _concatedFound = {};
  75. _migratedFirstFound = {};
  76. }
  77. void MessagesSearchMerged::search(const Request &search) {
  78. _request = search;
  79. if (_migratedSearch) {
  80. _waitingForTotal = true;
  81. _migratedSearch->searchMessages(search);
  82. }
  83. _apiSearch.searchMessages(search);
  84. }
  85. void MessagesSearchMerged::searchMore() {
  86. if (_migratedSearch && _isFull) {
  87. _migratedSearch->searchMore();
  88. } else {
  89. _apiSearch.searchMore();
  90. }
  91. }
  92. rpl::producer<> MessagesSearchMerged::newFounds() const {
  93. return _newFounds.events();
  94. }
  95. rpl::producer<> MessagesSearchMerged::nextFounds() const {
  96. return _nextFounds.events();
  97. }
  98. } // namespace Api