data_emoji_statuses.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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 "base/timer.h"
  9. namespace Main {
  10. class Session;
  11. } // namespace Main
  12. namespace Ui {
  13. struct EmojiGroup;
  14. } // namespace Ui
  15. namespace Data {
  16. class DocumentMedia;
  17. class Session;
  18. struct UniqueGift;
  19. struct EmojiStatusCollectible {
  20. CollectibleId id = 0;
  21. DocumentId documentId = 0;
  22. QString title;
  23. QString slug;
  24. DocumentId patternDocumentId = 0;
  25. QColor centerColor;
  26. QColor edgeColor;
  27. QColor patternColor;
  28. QColor textColor;
  29. explicit operator bool() const {
  30. return id != 0;
  31. }
  32. };
  33. struct EmojiStatusData {
  34. EmojiStatusId id;
  35. TimeId until = 0;
  36. };
  37. class EmojiStatuses final {
  38. public:
  39. explicit EmojiStatuses(not_null<Session*> owner);
  40. ~EmojiStatuses();
  41. [[nodiscard]] Session &owner() const {
  42. return *_owner;
  43. }
  44. [[nodiscard]] Main::Session &session() const;
  45. void refreshRecent();
  46. void refreshRecentDelayed();
  47. void refreshDefault();
  48. void refreshColored();
  49. void refreshChannelDefault();
  50. void refreshChannelColored();
  51. void refreshCollectibles();
  52. enum class Type {
  53. Recent,
  54. Default,
  55. Colored,
  56. ChannelDefault,
  57. ChannelColored,
  58. Collectibles,
  59. };
  60. [[nodiscard]] const std::vector<EmojiStatusId> &list(Type type) const;
  61. [[nodiscard]] EmojiStatusData parse(const MTPEmojiStatus &status);
  62. [[nodiscard]] rpl::producer<> recentUpdates() const;
  63. [[nodiscard]] rpl::producer<> defaultUpdates() const;
  64. [[nodiscard]] rpl::producer<> channelDefaultUpdates() const;
  65. [[nodiscard]] rpl::producer<> collectiblesUpdates() const;
  66. void set(EmojiStatusId id, TimeId until = 0);
  67. void set(not_null<PeerData*> peer, EmojiStatusId id, TimeId until = 0);
  68. [[nodiscard]] EmojiStatusId fromUniqueGift(const Data::UniqueGift &gift);
  69. [[nodiscard]] EmojiStatusCollectible *collectibleInfo(CollectibleId id);
  70. void registerAutomaticClear(not_null<PeerData*> peer, TimeId until);
  71. using Groups = std::vector<Ui::EmojiGroup>;
  72. [[nodiscard]] rpl::producer<Groups> emojiGroupsValue() const;
  73. [[nodiscard]] rpl::producer<Groups> statusGroupsValue() const;
  74. [[nodiscard]] rpl::producer<Groups> stickerGroupsValue() const;
  75. [[nodiscard]] rpl::producer<Groups> profilePhotoGroupsValue() const;
  76. void requestEmojiGroups();
  77. void requestStatusGroups();
  78. void requestStickerGroups();
  79. void requestProfilePhotoGroups();
  80. private:
  81. struct GroupsType {
  82. rpl::variable<Groups> data;
  83. mtpRequestId requestId = 0;
  84. int32 hash = 0;
  85. };
  86. void requestRecent();
  87. void requestDefault();
  88. void requestColored();
  89. void requestChannelDefault();
  90. void requestChannelColored();
  91. void requestCollectibles();
  92. void updateRecent(const MTPDaccount_emojiStatuses &data);
  93. void updateDefault(const MTPDaccount_emojiStatuses &data);
  94. void updateColored(const MTPDmessages_stickerSet &data);
  95. void updateChannelDefault(const MTPDaccount_emojiStatuses &data);
  96. void updateChannelColored(const MTPDmessages_stickerSet &data);
  97. void updateCollectibles(const MTPDaccount_emojiStatuses &data);
  98. void processClearingIn(TimeId wait);
  99. void processClearing();
  100. [[nodiscard]] std::vector<EmojiStatusId> parse(
  101. const MTPDaccount_emojiStatuses &data);
  102. template <typename Request>
  103. void requestGroups(not_null<GroupsType*> type, Request &&request);
  104. const not_null<Session*> _owner;
  105. std::vector<EmojiStatusId> _recent;
  106. std::vector<EmojiStatusId> _default;
  107. std::vector<EmojiStatusId> _colored;
  108. std::vector<EmojiStatusId> _channelDefault;
  109. std::vector<EmojiStatusId> _channelColored;
  110. std::vector<EmojiStatusId> _collectibles;
  111. rpl::event_stream<> _recentUpdated;
  112. rpl::event_stream<> _defaultUpdated;
  113. rpl::event_stream<> _coloredUpdated;
  114. rpl::event_stream<> _channelDefaultUpdated;
  115. rpl::event_stream<> _channelColoredUpdated;
  116. rpl::event_stream<> _collectiblesUpdated;
  117. base::flat_map<
  118. CollectibleId,
  119. std::shared_ptr<EmojiStatusCollectible>> _collectibleData;
  120. mtpRequestId _recentRequestId = 0;
  121. bool _recentRequestScheduled = false;
  122. uint64 _recentHash = 0;
  123. mtpRequestId _defaultRequestId = 0;
  124. uint64 _defaultHash = 0;
  125. mtpRequestId _coloredRequestId = 0;
  126. mtpRequestId _channelDefaultRequestId = 0;
  127. uint64 _channelDefaultHash = 0;
  128. mtpRequestId _channelColoredRequestId = 0;
  129. mtpRequestId _collectiblesRequestId = 0;
  130. uint64 _collectiblesHash = 0;
  131. base::flat_map<not_null<PeerData*>, mtpRequestId> _sentRequests;
  132. base::flat_map<not_null<PeerData*>, TimeId> _clearing;
  133. base::Timer _clearingTimer;
  134. GroupsType _emojiGroups;
  135. GroupsType _statusGroups;
  136. GroupsType _stickerGroups;
  137. GroupsType _profilePhotoGroups;
  138. rpl::lifetime _lifetime;
  139. };
  140. } // namespace Data