main_session.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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 <rpl/filter.h>
  9. #include <rpl/variable.h>
  10. #include "base/timer.h"
  11. class ApiWrap;
  12. namespace Api {
  13. class Updates;
  14. class SendProgressManager;
  15. } // namespace Api
  16. namespace MTP {
  17. class Instance;
  18. struct ConfigFields;
  19. } // namespace MTP
  20. namespace Support {
  21. class Helper;
  22. class Templates;
  23. class FastButtonsBots;
  24. } // namespace Support
  25. namespace Data {
  26. class Session;
  27. class Changes;
  28. class RecentPeers;
  29. class ScheduledMessages;
  30. class SponsoredMessages;
  31. class TopPeers;
  32. class Factchecks;
  33. class LocationPickers;
  34. class Credits;
  35. } // namespace Data
  36. namespace HistoryView::Reactions {
  37. class CachedIconFactory;
  38. } // namespace HistoryView::Reactions
  39. namespace Storage {
  40. class DownloadManagerMtproto;
  41. class Uploader;
  42. class Facade;
  43. class Account;
  44. class Domain;
  45. } // namespace Storage
  46. namespace Window {
  47. class SessionController;
  48. struct TermsLock;
  49. } // namespace Window
  50. namespace Stickers {
  51. class EmojiPack;
  52. class DicePacks;
  53. class GiftBoxPack;
  54. } // namespace Stickers;
  55. namespace InlineBots {
  56. class AttachWebView;
  57. } // namespace InlineBots
  58. namespace Ui {
  59. struct ColorIndicesCompressed;
  60. } // namespace Ui
  61. namespace Main {
  62. class Account;
  63. class AppConfig;
  64. class Domain;
  65. class SessionSettings;
  66. class SendAsPeers;
  67. class Session final : public base::has_weak_ptr {
  68. public:
  69. Session(
  70. not_null<Account*> account,
  71. const MTPUser &user,
  72. std::unique_ptr<SessionSettings> settings);
  73. ~Session();
  74. Session(const Session &other) = delete;
  75. Session &operator=(const Session &other) = delete;
  76. [[nodiscard]] Account &account() const;
  77. [[nodiscard]] Storage::Account &local() const;
  78. [[nodiscard]] Domain &domain() const;
  79. [[nodiscard]] Storage::Domain &domainLocal() const;
  80. [[nodiscard]] AppConfig &appConfig() const;
  81. [[nodiscard]] bool premium() const;
  82. [[nodiscard]] bool premiumPossible() const;
  83. [[nodiscard]] rpl::producer<bool> premiumPossibleValue() const;
  84. [[nodiscard]] bool premiumBadgesShown() const;
  85. [[nodiscard]] bool premiumCanBuy() const;
  86. [[nodiscard]] bool isTestMode() const;
  87. [[nodiscard]] uint64 uniqueId() const; // userId() with TestDC shift.
  88. [[nodiscard]] UserId userId() const;
  89. [[nodiscard]] PeerId userPeerId() const;
  90. [[nodiscard]] not_null<UserData*> user() const {
  91. return _user;
  92. }
  93. bool validateSelf(UserId id);
  94. [[nodiscard]] Data::Changes &changes() const {
  95. return *_changes;
  96. }
  97. [[nodiscard]] Data::RecentPeers &recentPeers() const {
  98. return *_recentPeers;
  99. }
  100. [[nodiscard]] Data::SponsoredMessages &sponsoredMessages() const {
  101. return *_sponsoredMessages;
  102. }
  103. [[nodiscard]] Data::ScheduledMessages &scheduledMessages() const {
  104. return *_scheduledMessages;
  105. }
  106. [[nodiscard]] Data::TopPeers &topPeers() const {
  107. return *_topPeers;
  108. }
  109. [[nodiscard]] Data::TopPeers &topBotApps() const {
  110. return *_topBotApps;
  111. }
  112. [[nodiscard]] Data::Factchecks &factchecks() const {
  113. return *_factchecks;
  114. }
  115. [[nodiscard]] Data::LocationPickers &locationPickers() const {
  116. return *_locationPickers;
  117. }
  118. [[nodiscard]] Data::Credits &credits() const {
  119. return *_credits;
  120. }
  121. [[nodiscard]] Api::Updates &updates() const {
  122. return *_updates;
  123. }
  124. [[nodiscard]] Api::SendProgressManager &sendProgressManager() const {
  125. return *_sendProgressManager;
  126. }
  127. [[nodiscard]] Storage::DownloadManagerMtproto &downloader() const {
  128. return *_downloader;
  129. }
  130. [[nodiscard]] Storage::Uploader &uploader() const {
  131. return *_uploader;
  132. }
  133. [[nodiscard]] Storage::Facade &storage() const {
  134. return *_storage;
  135. }
  136. [[nodiscard]] Stickers::EmojiPack &emojiStickersPack() const {
  137. return *_emojiStickersPack;
  138. }
  139. [[nodiscard]] Stickers::DicePacks &diceStickersPacks() const {
  140. return *_diceStickersPacks;
  141. }
  142. [[nodiscard]] Stickers::GiftBoxPack &giftBoxStickersPacks() const {
  143. return *_giftBoxStickersPacks;
  144. }
  145. [[nodiscard]] Data::Session &data() const {
  146. return *_data;
  147. }
  148. [[nodiscard]] SessionSettings &settings() const {
  149. return *_settings;
  150. }
  151. [[nodiscard]] SendAsPeers &sendAsPeers() const {
  152. return *_sendAsPeers;
  153. }
  154. [[nodiscard]] InlineBots::AttachWebView &attachWebView() const {
  155. return *_attachWebView;
  156. }
  157. [[nodiscard]] auto cachedReactionIconFactory() const
  158. -> HistoryView::Reactions::CachedIconFactory & {
  159. return *_cachedReactionIconFactory;
  160. }
  161. void saveSettings();
  162. void saveSettingsDelayed(crl::time delay = kDefaultSaveDelay);
  163. void saveSettingsNowIfNeeded();
  164. void addWindow(not_null<Window::SessionController*> controller);
  165. [[nodiscard]] auto windows() const
  166. -> const base::flat_set<not_null<Window::SessionController*>> &;
  167. [[nodiscard]] Window::SessionController *tryResolveWindow(
  168. PeerData *forPeer = nullptr) const;
  169. // Shortcuts.
  170. void notifyDownloaderTaskFinished();
  171. [[nodiscard]] rpl::producer<> downloaderTaskFinished() const;
  172. [[nodiscard]] MTP::DcId mainDcId() const;
  173. [[nodiscard]] MTP::Instance &mtp() const;
  174. [[nodiscard]] const MTP::ConfigFields &serverConfig() const;
  175. [[nodiscard]] ApiWrap &api() {
  176. return *_api;
  177. }
  178. // Terms lock.
  179. void lockByTerms(const Window::TermsLock &data);
  180. void unlockTerms();
  181. void termsDeleteNow();
  182. [[nodiscard]] std::optional<Window::TermsLock> termsLocked() const;
  183. rpl::producer<bool> termsLockChanges() const;
  184. rpl::producer<bool> termsLockValue() const;
  185. [[nodiscard]] QString createInternalLink(const QString &query) const;
  186. [[nodiscard]] QString createInternalLinkFull(const QString &query) const;
  187. [[nodiscard]] TextWithEntities createInternalLink(
  188. const TextWithEntities &query) const;
  189. [[nodiscard]] TextWithEntities createInternalLinkFull(
  190. TextWithEntities query) const;
  191. void setTmpPassword(const QByteArray &password, TimeId validUntil);
  192. [[nodiscard]] QByteArray validTmpPassword() const;
  193. // Can be called only right before ~Session.
  194. void finishLogout();
  195. // Uploads cancel with confirmation.
  196. [[nodiscard]] bool uploadsInProgress() const;
  197. void uploadsStopWithConfirmation(Fn<void()> done);
  198. void uploadsStop();
  199. [[nodiscard]] rpl::lifetime &lifetime() {
  200. return _lifetime;
  201. }
  202. [[nodiscard]] bool supportMode() const;
  203. [[nodiscard]] Support::Helper &supportHelper() const;
  204. [[nodiscard]] Support::Templates &supportTemplates() const;
  205. [[nodiscard]] Support::FastButtonsBots &fastButtonsBots() const;
  206. [[nodiscard]] auto colorIndicesValue()
  207. -> rpl::producer<Ui::ColorIndicesCompressed>;
  208. private:
  209. static constexpr auto kDefaultSaveDelay = crl::time(1000);
  210. const UserId _userId;
  211. const not_null<Account*> _account;
  212. const std::unique_ptr<SessionSettings> _settings;
  213. const std::unique_ptr<Data::Changes> _changes;
  214. const std::unique_ptr<ApiWrap> _api;
  215. const std::unique_ptr<Api::Updates> _updates;
  216. const std::unique_ptr<Api::SendProgressManager> _sendProgressManager;
  217. const std::unique_ptr<Storage::DownloadManagerMtproto> _downloader;
  218. const std::unique_ptr<Storage::Uploader> _uploader;
  219. const std::unique_ptr<Storage::Facade> _storage;
  220. // _data depends on _downloader / _uploader.
  221. const std::unique_ptr<Data::Session> _data;
  222. const not_null<UserData*> _user;
  223. // _emojiStickersPack depends on _data.
  224. const std::unique_ptr<Stickers::EmojiPack> _emojiStickersPack;
  225. const std::unique_ptr<Stickers::DicePacks> _diceStickersPacks;
  226. const std::unique_ptr<Stickers::GiftBoxPack> _giftBoxStickersPacks;
  227. const std::unique_ptr<SendAsPeers> _sendAsPeers;
  228. const std::unique_ptr<InlineBots::AttachWebView> _attachWebView;
  229. const std::unique_ptr<Data::RecentPeers> _recentPeers;
  230. const std::unique_ptr<Data::ScheduledMessages> _scheduledMessages;
  231. const std::unique_ptr<Data::SponsoredMessages> _sponsoredMessages;
  232. const std::unique_ptr<Data::TopPeers> _topPeers;
  233. const std::unique_ptr<Data::TopPeers> _topBotApps;
  234. const std::unique_ptr<Data::Factchecks> _factchecks;
  235. const std::unique_ptr<Data::LocationPickers> _locationPickers;
  236. const std::unique_ptr<Data::Credits> _credits;
  237. using ReactionIconFactory = HistoryView::Reactions::CachedIconFactory;
  238. const std::unique_ptr<ReactionIconFactory> _cachedReactionIconFactory;
  239. const std::unique_ptr<Support::Helper> _supportHelper;
  240. const std::unique_ptr<Support::FastButtonsBots> _fastButtonsBots;
  241. std::shared_ptr<QImage> _selfUserpicView;
  242. rpl::variable<bool> _premiumPossible = false;
  243. rpl::event_stream<bool> _termsLockChanges;
  244. std::unique_ptr<Window::TermsLock> _termsLock;
  245. base::flat_set<not_null<Window::SessionController*>> _windows;
  246. base::Timer _saveSettingsTimer;
  247. QByteArray _tmpPassword;
  248. TimeId _tmpPasswordValidUntil = 0;
  249. rpl::lifetime _lifetime;
  250. };
  251. } // namespace Main