103 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| 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<ApiWrap*> api)
 | |
| : _session(&api->session())
 | |
| , _api(&api->instance()) {
 | |
| }
 | |
| 
 | |
| void GlobalPrivacy::reload(Fn<void()> 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([=](const RPCError &error) {
 | |
| 		_requestId = 0;
 | |
| 		for (const auto &callback : base::take(_callbacks)) {
 | |
| 			callback();
 | |
| 		}
 | |
| 	}).send();
 | |
| 
 | |
| 	_session->account().appConfig().value(
 | |
| 	) | rpl::start_with_next([=] {
 | |
| 		_showArchiveAndMute = _session->account().appConfig().get<bool>(
 | |
| 			u"autoarchive_setting_available"_q,
 | |
| 			false);
 | |
| 	}, _session->lifetime());
 | |
| }
 | |
| 
 | |
| bool GlobalPrivacy::archiveAndMuteCurrent() const {
 | |
| 	return _archiveAndMute.current();
 | |
| }
 | |
| 
 | |
| rpl::producer<bool> GlobalPrivacy::archiveAndMute() const {
 | |
| 	return _archiveAndMute.value();
 | |
| }
 | |
| 
 | |
| rpl::producer<bool> 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::update(bool archiveAndMute) {
 | |
| 	using Flag = MTPDglobalPrivacySettings::Flag;
 | |
| 
 | |
| 	_api.request(_requestId).cancel();
 | |
| 	_requestId = _api.request(MTPaccount_SetGlobalPrivacySettings(
 | |
| 		MTP_globalPrivacySettings(
 | |
| 			MTP_flags(Flag::f_archive_and_mute_new_noncontact_peers),
 | |
| 			MTP_bool(archiveAndMute))
 | |
| 	)).done([=](const MTPGlobalPrivacySettings &result) {
 | |
| 		_requestId = 0;
 | |
| 		apply(result);
 | |
| 	}).fail([=](const RPCError &error) {
 | |
| 		_requestId = 0;
 | |
| 	}).send();
 | |
| 	_archiveAndMute = archiveAndMute;
 | |
| }
 | |
| 
 | |
| void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &data) {
 | |
| 	data.match([&](const MTPDglobalPrivacySettings &data) {
 | |
| 		_archiveAndMute = data.varchive_and_mute_new_noncontact_peers()
 | |
| 			? mtpIsTrue(*data.varchive_and_mute_new_noncontact_peers())
 | |
| 			: false;
 | |
| 	});
 | |
| }
 | |
| 
 | |
| } // namespace Api
 | 
