api_peer_photo.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 "mtproto/sender.h"
  9. class ApiWrap;
  10. class PeerData;
  11. class UserData;
  12. namespace Data {
  13. struct FileOrigin;
  14. } // namespace Data
  15. namespace Main {
  16. class Session;
  17. } // namespace Main
  18. namespace Api {
  19. class PeerPhoto final {
  20. public:
  21. using UserPhotoId = PhotoId;
  22. explicit PeerPhoto(not_null<ApiWrap*> api);
  23. enum class EmojiListType {
  24. Profile,
  25. Group,
  26. Background,
  27. NoChannelStatus,
  28. };
  29. struct UserPhoto {
  30. QImage image;
  31. DocumentId markupDocumentId = 0;
  32. std::vector<QColor> markupColors;
  33. };
  34. void upload(
  35. not_null<PeerData*> peer,
  36. UserPhoto &&photo,
  37. Fn<void()> done = nullptr);
  38. void uploadFallback(not_null<PeerData*> peer, UserPhoto &&photo);
  39. void updateSelf(
  40. not_null<PhotoData*> photo,
  41. Data::FileOrigin origin,
  42. Fn<void()> done = nullptr);
  43. void suggest(not_null<PeerData*> peer, UserPhoto &&photo);
  44. void clear(not_null<PhotoData*> photo);
  45. void clearPersonal(not_null<UserData*> user);
  46. void set(not_null<PeerData*> peer, not_null<PhotoData*> photo);
  47. void requestUserPhotos(not_null<UserData*> user, UserPhotoId afterId);
  48. void requestEmojiList(EmojiListType type);
  49. using EmojiList = std::vector<DocumentId>;
  50. [[nodiscard]] rpl::producer<EmojiList> emojiListValue(EmojiListType type);
  51. // Non-personal photo in case a personal photo is set.
  52. void registerNonPersonalPhoto(
  53. not_null<UserData*> user,
  54. not_null<PhotoData*> photo);
  55. void unregisterNonPersonalPhoto(not_null<UserData*> user);
  56. [[nodiscard]] PhotoData *nonPersonalPhoto(
  57. not_null<UserData*> user) const;
  58. private:
  59. enum class UploadType {
  60. Default,
  61. Suggestion,
  62. Fallback,
  63. };
  64. struct EmojiListData {
  65. rpl::variable<EmojiList> list;
  66. mtpRequestId requestId = 0;
  67. };
  68. void ready(
  69. const FullMsgId &msgId,
  70. std::optional<MTPInputFile> file,
  71. std::optional<MTPVideoSize> videoSize);
  72. void upload(
  73. not_null<PeerData*> peer,
  74. UserPhoto &&photo,
  75. UploadType type,
  76. Fn<void()> done);
  77. [[nodiscard]] EmojiListData &emojiList(EmojiListType type);
  78. [[nodiscard]] const EmojiListData &emojiList(EmojiListType type) const;
  79. const not_null<Main::Session*> _session;
  80. MTP::Sender _api;
  81. struct UploadValue {
  82. not_null<PeerData*> peer;
  83. UploadType type = UploadType::Default;
  84. Fn<void()> done;
  85. };
  86. base::flat_map<FullMsgId, UploadValue> _uploads;
  87. base::flat_map<not_null<UserData*>, mtpRequestId> _userPhotosRequests;
  88. base::flat_map<
  89. not_null<UserData*>,
  90. not_null<PhotoData*>> _nonPersonalPhotos;
  91. EmojiListData _profileEmojiList;
  92. EmojiListData _groupEmojiList;
  93. EmojiListData _backgroundEmojiList;
  94. EmojiListData _noChannelStatusEmojiList;
  95. };
  96. } // namespace Api