/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include #include #include #include "base/timer.h" #include "data/data_auto_download.h" class ApiWrap; enum class SendFilesWay; namespace Ui { enum class InputSubmitSettings; } // namespace Ui namespace Support { enum class SwitchSettings; class Helper; class Templates; } // namespace Support namespace Data { class Session; } // namespace Data namespace Storage { class Downloader; class Uploader; class Facade; } // namespace Storage namespace Window { namespace Notifications { class System; } // namespace Notifications enum class Column; } // namespace Window namespace Calls { class Instance; } // namespace Calls namespace ChatHelpers { enum class SelectorTab; } // namespace ChatHelpers namespace Core { class Changelogs; } // namespace Core class AuthSessionSettings final { public: void moveFrom(AuthSessionSettings &&other) { _variables = std::move(other._variables); } QByteArray serialize() const; void constructFromSerialized(const QByteArray &serialized); void setLastSeenWarningSeen(bool lastSeenWarningSeen) { _variables.lastSeenWarningSeen = lastSeenWarningSeen; } bool lastSeenWarningSeen() const { return _variables.lastSeenWarningSeen; } void setSendFilesWay(SendFilesWay way) { _variables.sendFilesWay = way; } SendFilesWay sendFilesWay() const { return _variables.sendFilesWay; } void setSendSubmitWay(Ui::InputSubmitSettings value) { _variables.sendSubmitWay = value; } Ui::InputSubmitSettings sendSubmitWay() const { return _variables.sendSubmitWay; } void setSupportSwitch(Support::SwitchSettings value) { _variables.supportSwitch = value; } Support::SwitchSettings supportSwitch() const { return _variables.supportSwitch; } void setSupportFixChatsOrder(bool fix) { _variables.supportFixChatsOrder = fix; } bool supportFixChatsOrder() const { return _variables.supportFixChatsOrder; } void setSupportTemplatesAutocomplete(bool enabled) { _variables.supportTemplatesAutocomplete = enabled; } bool supportTemplatesAutocomplete() const { return _variables.supportTemplatesAutocomplete; } void setSupportChatsTimeSlice(int slice); int supportChatsTimeSlice() const; rpl::producer supportChatsTimeSliceValue() const; void setSupportAllSearchResults(bool all); bool supportAllSearchResults() const; rpl::producer supportAllSearchResultsValue() const; ChatHelpers::SelectorTab selectorTab() const { return _variables.selectorTab; } void setSelectorTab(ChatHelpers::SelectorTab tab) { _variables.selectorTab = tab; } bool tabbedSelectorSectionEnabled() const { return _variables.tabbedSelectorSectionEnabled; } void setTabbedSelectorSectionEnabled(bool enabled); bool thirdSectionInfoEnabled() const { return _variables.thirdSectionInfoEnabled; } void setThirdSectionInfoEnabled(bool enabled); rpl::producer thirdSectionInfoEnabledValue() const; int thirdSectionExtendedBy() const { return _variables.thirdSectionExtendedBy; } void setThirdSectionExtendedBy(int savedValue) { _variables.thirdSectionExtendedBy = savedValue; } bool tabbedReplacedWithInfo() const { return _tabbedReplacedWithInfo; } void setTabbedReplacedWithInfo(bool enabled); rpl::producer tabbedReplacedWithInfoValue() const; void setSmallDialogsList(bool enabled) { _variables.smallDialogsList = enabled; } bool smallDialogsList() const { return _variables.smallDialogsList; } void setLastTimeVideoPlayedAt(TimeMs time) { _lastTimeVideoPlayedAt = time; } TimeMs lastTimeVideoPlayedAt() const { return _lastTimeVideoPlayedAt; } void setSoundOverride(const QString &key, const QString &path) { _variables.soundOverrides.insert(key, path); } void clearSoundOverrides() { _variables.soundOverrides.clear(); } QString getSoundPath(const QString &key) const; void setTabbedSelectorSectionTooltipShown(int shown) { _variables.tabbedSelectorSectionTooltipShown = shown; } int tabbedSelectorSectionTooltipShown() const { return _variables.tabbedSelectorSectionTooltipShown; } void setFloatPlayerColumn(Window::Column column) { _variables.floatPlayerColumn = column; } Window::Column floatPlayerColumn() const { return _variables.floatPlayerColumn; } void setFloatPlayerCorner(RectPart corner) { _variables.floatPlayerCorner = corner; } RectPart floatPlayerCorner() const { return _variables.floatPlayerCorner; } void setDialogsWidthRatio(float64 ratio); float64 dialogsWidthRatio() const; rpl::producer dialogsWidthRatioChanges() const; void setThirdColumnWidth(int width); int thirdColumnWidth() const; rpl::producer thirdColumnWidthChanges() const; void setGroupStickersSectionHidden(PeerId peerId) { _variables.groupStickersSectionHidden.insert(peerId); } bool isGroupStickersSectionHidden(PeerId peerId) const { return _variables.groupStickersSectionHidden.contains(peerId); } void removeGroupStickersSectionHidden(PeerId peerId) { _variables.groupStickersSectionHidden.remove(peerId); } Data::AutoDownload::Full &autoDownload() { return _variables.autoDownload; } const Data::AutoDownload::Full &autoDownload() const { return _variables.autoDownload; } bool hadLegacyCallsPeerToPeerNobody() const { return _variables.hadLegacyCallsPeerToPeerNobody; } bool includeMutedCounter() const { return _variables.includeMutedCounter; } void setIncludeMutedCounter(bool value) { _variables.includeMutedCounter = value; } bool countUnreadMessages() const { return _variables.countUnreadMessages; } void setCountUnreadMessages(bool value) { _variables.countUnreadMessages = value; } bool exeLaunchWarning() const { return _variables.exeLaunchWarning; } void setExeLaunchWarning(bool warning) { _variables.exeLaunchWarning = warning; } private: struct Variables { Variables(); static constexpr auto kDefaultDialogsWidthRatio = 5. / 14; static constexpr auto kDefaultThirdColumnWidth = 0; bool lastSeenWarningSeen = false; SendFilesWay sendFilesWay; ChatHelpers::SelectorTab selectorTab; // per-window bool tabbedSelectorSectionEnabled = false; // per-window int tabbedSelectorSectionTooltipShown = 0; QMap soundOverrides; Window::Column floatPlayerColumn; // per-window RectPart floatPlayerCorner; // per-window base::flat_set groupStickersSectionHidden; bool thirdSectionInfoEnabled = true; // per-window bool smallDialogsList = false; // per-window int thirdSectionExtendedBy = -1; // per-window rpl::variable dialogsWidthRatio = kDefaultDialogsWidthRatio; // per-window rpl::variable thirdColumnWidth = kDefaultThirdColumnWidth; // per-window Ui::InputSubmitSettings sendSubmitWay; bool hadLegacyCallsPeerToPeerNobody = false; bool includeMutedCounter = true; bool countUnreadMessages = true; bool exeLaunchWarning = true; Data::AutoDownload::Full autoDownload; static constexpr auto kDefaultSupportChatsLimitSlice = 7 * 24 * 60 * 60; Support::SwitchSettings supportSwitch; bool supportFixChatsOrder = true; bool supportTemplatesAutocomplete = true; rpl::variable supportChatsTimeSlice = kDefaultSupportChatsLimitSlice; rpl::variable supportAllSearchResults = false; }; rpl::event_stream _thirdSectionInfoEnabledValue; bool _tabbedReplacedWithInfo = false; rpl::event_stream _tabbedReplacedWithInfoValue; Variables _variables; TimeMs _lastTimeVideoPlayedAt = 0; }; class AuthSession; AuthSession &Auth(); class AuthSession final : public base::has_weak_ptr , private base::Subscriber { public: AuthSession(const MTPUser &user); AuthSession(const AuthSession &other) = delete; AuthSession &operator=(const AuthSession &other) = delete; static bool Exists(); UserId userId() const; PeerId userPeerId() const; not_null user() const { return _user; } bool validateSelf(const MTPUser &user); Storage::Downloader &downloader() { return *_downloader; } Storage::Uploader &uploader() { return *_uploader; } Storage::Facade &storage() { return *_storage; } base::Observable &downloaderTaskFinished(); Window::Notifications::System ¬ifications() { return *_notifications; } Data::Session &data() { return *_data; } AuthSessionSettings &settings() { return _settings; } void moveSettingsFrom(AuthSessionSettings &&other); void saveSettingsDelayed(TimeMs delay = kDefaultSaveDelay); ApiWrap &api() { return *_api; } Calls::Instance &calls() { return *_calls; } void checkAutoLock(); void checkAutoLockIn(TimeMs time); rpl::lifetime &lifetime() { return _lifetime; } base::Observable documentUpdated; base::Observable, MsgId>> messageIdChanging; bool supportMode() const; Support::Helper &supportHelper() const; Support::Templates &supportTemplates() const; ~AuthSession(); private: static constexpr auto kDefaultSaveDelay = TimeMs(1000); AuthSessionSettings _settings; base::Timer _saveDataTimer; TimeMs _shouldLockAt = 0; base::Timer _autoLockTimer; const std::unique_ptr _api; const std::unique_ptr _calls; const std::unique_ptr _downloader; const std::unique_ptr _uploader; const std::unique_ptr _storage; const std::unique_ptr _notifications; // _data depends on _downloader / _uploader / _notifications. const std::unique_ptr _data; const not_null _user; // _changelogs depends on _data, subscribes on chats loading event. const std::unique_ptr _changelogs; const std::unique_ptr _supportHelper; rpl::lifetime _lifetime; };