data_forum.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. #pragma once
  8. #include "dialogs/dialogs_main_list.h"
  9. class History;
  10. class ChannelData;
  11. namespace Main {
  12. class Session;
  13. } // namespace Main
  14. namespace Window {
  15. class SessionController;
  16. } // namespace Window;
  17. namespace Data {
  18. class Session;
  19. struct ForumOffsets {
  20. TimeId date = 0;
  21. MsgId id = 0;
  22. MsgId topicId = 0;
  23. friend inline constexpr auto operator<=>(
  24. ForumOffsets,
  25. ForumOffsets) = default;
  26. };
  27. class Forum final {
  28. public:
  29. explicit Forum(not_null<History*> history);
  30. ~Forum();
  31. [[nodiscard]] Session &owner() const;
  32. [[nodiscard]] Main::Session &session() const;
  33. [[nodiscard]] not_null<History*> history() const;
  34. [[nodiscard]] not_null<ChannelData*> channel() const;
  35. [[nodiscard]] not_null<Dialogs::MainList*> topicsList();
  36. [[nodiscard]] rpl::producer<> destroyed() const;
  37. [[nodiscard]] auto topicDestroyed() const
  38. -> rpl::producer<not_null<ForumTopic*>>;
  39. void preloadTopics();
  40. void reloadTopics();
  41. void requestTopics();
  42. [[nodiscard]] rpl::producer<> chatsListChanges() const;
  43. [[nodiscard]] rpl::producer<> chatsListLoadedEvents() const;
  44. void requestTopic(MsgId rootId, Fn<void()> done = nullptr);
  45. ForumTopic *applyTopicAdded(
  46. MsgId rootId,
  47. const QString &title,
  48. int32 colorId,
  49. DocumentId iconId,
  50. PeerId creatorId,
  51. TimeId date,
  52. bool my);
  53. void applyTopicDeleted(MsgId rootId);
  54. [[nodiscard]] ForumTopic *topicFor(MsgId rootId);
  55. [[nodiscard]] ForumTopic *enforceTopicFor(MsgId rootId);
  56. [[nodiscard]] bool topicDeleted(MsgId rootId) const;
  57. void applyReceivedTopics(
  58. const MTPmessages_ForumTopics &topics,
  59. ForumOffsets &updateOffsets);
  60. void applyReceivedTopics(
  61. const MTPmessages_ForumTopics &topics,
  62. Fn<void(not_null<ForumTopic*>)> callback = nullptr);
  63. void applyReceivedTopics(
  64. const MTPVector<MTPForumTopic> &topics,
  65. Fn<void(not_null<ForumTopic*>)> callback = nullptr);
  66. [[nodiscard]] MsgId reserveCreatingId(
  67. const QString &title,
  68. int32 colorId,
  69. DocumentId iconId);
  70. void discardCreatingId(MsgId rootId);
  71. [[nodiscard]] bool creating(MsgId rootId) const;
  72. void created(MsgId rootId, MsgId realId);
  73. void clearAllUnreadMentions();
  74. void clearAllUnreadReactions();
  75. void enumerateTopics(Fn<void(not_null<ForumTopic*>)> action) const;
  76. void listMessageChanged(HistoryItem *from, HistoryItem *to);
  77. [[nodiscard]] int recentTopicsListVersion() const;
  78. void recentTopicsInvalidate(not_null<ForumTopic*> topic);
  79. [[nodiscard]] auto recentTopics() const
  80. -> const std::vector<not_null<ForumTopic*>> &;
  81. [[nodiscard]] rpl::lifetime &lifetime() {
  82. return _lifetime;
  83. }
  84. private:
  85. struct TopicRequest {
  86. mtpRequestId id = 0;
  87. std::vector<Fn<void()>> callbacks;
  88. };
  89. void reorderLastTopics();
  90. void requestSomeStale();
  91. void finishTopicRequest(MsgId rootId);
  92. const not_null<History*> _history;
  93. base::flat_map<MsgId, std::unique_ptr<ForumTopic>> _topics;
  94. base::flat_set<MsgId> _topicsDeleted;
  95. rpl::event_stream<not_null<ForumTopic*>> _topicDestroyed;
  96. Dialogs::MainList _topicsList;
  97. base::flat_map<MsgId, TopicRequest> _topicRequests;
  98. base::flat_set<MsgId> _staleRootIds;
  99. mtpRequestId _staleRequestId = 0;
  100. mtpRequestId _requestId = 0;
  101. ForumOffsets _offset;
  102. base::flat_set<MsgId> _creatingRootIds;
  103. std::vector<not_null<ForumTopic*>> _lastTopics;
  104. int _lastTopicsVersion = 0;
  105. rpl::event_stream<> _chatsListChanges;
  106. rpl::event_stream<> _chatsListLoadedEvents;
  107. rpl::lifetime _lifetime;
  108. };
  109. } // namespace Data