/* 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 */ #include "api/api_global_privacy.h" #include "apiwrap.h" #include "main/main_session.h" #include "main/main_account.h" #include "main/main_app_config.h" namespace Api { GlobalPrivacy::GlobalPrivacy(not_null api) : _session(&api->session()) , _api(&api->instance()) { } void GlobalPrivacy::reload(Fn callback) { if (callback) { _callbacks.push_back(std::move(callback)); } if (_requestId) { return; } _requestId = _api.request(MTPaccount_GetGlobalPrivacySettings( )).done([=](const MTPGlobalPrivacySettings &result) { _requestId = 0; apply(result); for (const auto &callback : base::take(_callbacks)) { callback(); } }).fail([=] { _requestId = 0; for (const auto &callback : base::take(_callbacks)) { callback(); } }).send(); _session->account().appConfig().value( ) | rpl::start_with_next([=] { _showArchiveAndMute = _session->account().appConfig().get( u"autoarchive_setting_available"_q, false); }, _session->lifetime()); } bool GlobalPrivacy::archiveAndMuteCurrent() const { return _archiveAndMute.current(); } rpl::producer GlobalPrivacy::archiveAndMute() const { return _archiveAndMute.value(); } UnarchiveOnNewMessage GlobalPrivacy::unarchiveOnNewMessageCurrent() const { return _unarchiveOnNewMessage.current(); } auto GlobalPrivacy::unarchiveOnNewMessage() const -> rpl::producer { return _unarchiveOnNewMessage.value(); } rpl::producer GlobalPrivacy::showArchiveAndMute() const { using namespace rpl::mappers; return rpl::combine( archiveAndMute(), _showArchiveAndMute.value(), _1 || _2); } rpl::producer<> GlobalPrivacy::suggestArchiveAndMute() const { return _session->account().appConfig().suggestionRequested( u"AUTOARCHIVE_POPULAR"_q); } void GlobalPrivacy::dismissArchiveAndMuteSuggestion() { _session->account().appConfig().dismissSuggestion( u"AUTOARCHIVE_POPULAR"_q); } void GlobalPrivacy::updateArchiveAndMute(bool value) { update(value, unarchiveOnNewMessageCurrent()); } void GlobalPrivacy::updateUnarchiveOnNewMessage( UnarchiveOnNewMessage value) { update(archiveAndMuteCurrent(), value); } void GlobalPrivacy::update( bool archiveAndMute, UnarchiveOnNewMessage unarchiveOnNewMessage) { using Flag = MTPDglobalPrivacySettings::Flag; _api.request(_requestId).cancel(); const auto flags = Flag() | (archiveAndMute ? Flag::f_archive_and_mute_new_noncontact_peers : Flag()) | (unarchiveOnNewMessage == UnarchiveOnNewMessage::None ? Flag::f_keep_archived_unmuted : Flag()) | (unarchiveOnNewMessage != UnarchiveOnNewMessage::AnyUnmuted ? Flag::f_keep_archived_folders : Flag()); _requestId = _api.request(MTPaccount_SetGlobalPrivacySettings( MTP_globalPrivacySettings(MTP_flags(flags)) )).done([=](const MTPGlobalPrivacySettings &result) { _requestId = 0; apply(result); }).fail([=] { _requestId = 0; }).send(); _archiveAndMute = archiveAndMute; _unarchiveOnNewMessage = unarchiveOnNewMessage; } void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &data) { data.match([&](const MTPDglobalPrivacySettings &data) { _archiveAndMute = data.is_archive_and_mute_new_noncontact_peers(); _unarchiveOnNewMessage = data.is_keep_archived_unmuted() ? UnarchiveOnNewMessage::None : data.is_keep_archived_folders() ? UnarchiveOnNewMessage::NotInFoldersUnmuted : UnarchiveOnNewMessage::AnyUnmuted; }); } } // namespace Api