204 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
	
		
			4.8 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 "data/data_notify_settings.h"
 | |
| 
 | |
| namespace Data {
 | |
| namespace {
 | |
| 
 | |
| MTPinputPeerNotifySettings DefaultSettings() {
 | |
| 	const auto flags = MTPDpeerNotifySettings::Flag::f_show_previews;
 | |
| 	const auto muteValue = TimeId(0);
 | |
| 	return MTP_inputPeerNotifySettings(
 | |
| 		MTP_flags(mtpCastFlags(flags)),
 | |
| 		MTP_int(muteValue),
 | |
| 		MTP_string("default"));
 | |
| }
 | |
| 
 | |
| } // namespace
 | |
| 
 | |
| class NotifySettingsValue {
 | |
| public:
 | |
| 	NotifySettingsValue(const MTPDpeerNotifySettings &data);
 | |
| 
 | |
| 	using MuteChange = NotifySettings::MuteChange;
 | |
| 	using SilentPostsChange = NotifySettings::SilentPostsChange;
 | |
| 
 | |
| 	bool change(const MTPDpeerNotifySettings &data);
 | |
| 	bool change(
 | |
| 		MuteChange mute,
 | |
| 		SilentPostsChange silent,
 | |
| 		int muteForSeconds);
 | |
| 	TimeMs muteFinishesIn() const;
 | |
| 	bool silentPosts() const;
 | |
| 	MTPinputPeerNotifySettings serialize() const;
 | |
| 
 | |
| private:
 | |
| 	bool change(
 | |
| 		MTPDpeerNotifySettings::Flags flags,
 | |
| 		TimeId mute,
 | |
| 		QString sound);
 | |
| 
 | |
| 	MTPDpeerNotifySettings::Flags _flags;
 | |
| 	TimeId _mute;
 | |
| 	QString _sound;
 | |
| 
 | |
| };
 | |
| 
 | |
| NotifySettingsValue::NotifySettingsValue(const MTPDpeerNotifySettings &data)
 | |
| : _flags(data.vflags.v)
 | |
| , _mute(data.vmute_until.v)
 | |
| , _sound(qs(data.vsound)) {
 | |
| }
 | |
| 
 | |
| bool NotifySettingsValue::silentPosts() const {
 | |
| 	return _flags & MTPDpeerNotifySettings::Flag::f_silent;
 | |
| }
 | |
| 
 | |
| bool NotifySettingsValue::change(const MTPDpeerNotifySettings &data) {
 | |
| 	return change(data.vflags.v, data.vmute_until.v, qs(data.vsound));
 | |
| }
 | |
| 
 | |
| bool NotifySettingsValue::change(
 | |
| 		MuteChange mute,
 | |
| 		SilentPostsChange silent,
 | |
| 		int muteForSeconds) {
 | |
| 	const auto newFlags = [&] {
 | |
| 		auto result = _flags;
 | |
| 		if (silent == SilentPostsChange::Silent) {
 | |
| 			result |= MTPDpeerNotifySettings::Flag::f_silent;
 | |
| 		} else if (silent == SilentPostsChange::Notify) {
 | |
| 			result &= ~MTPDpeerNotifySettings::Flag::f_silent;
 | |
| 		}
 | |
| 		return result;
 | |
| 	}();
 | |
| 	const auto newMute = (mute == MuteChange::Mute)
 | |
| 		? (unixtime() + muteForSeconds)
 | |
| 		: (mute == MuteChange::Ignore) ? _mute : 0;
 | |
| 	const auto newSound = (newMute == 0 && _sound.isEmpty())
 | |
| 		? qsl("default")
 | |
| 		: _sound;
 | |
| 	return change(newFlags, newMute, newSound);
 | |
| }
 | |
| 
 | |
| bool NotifySettingsValue::change(
 | |
| 		MTPDpeerNotifySettings::Flags flags,
 | |
| 		TimeId mute,
 | |
| 		QString sound) {
 | |
| 	if (_flags == flags && _mute == mute && _sound == sound) {
 | |
| 		return false;
 | |
| 	}
 | |
| 	_flags = flags;
 | |
| 	_mute = mute;
 | |
| 	_sound = sound;
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| TimeMs NotifySettingsValue::muteFinishesIn() const {
 | |
| 	auto now = unixtime();
 | |
| 	if (_mute > now) {
 | |
| 		return (_mute - now + 1) * 1000LL;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| MTPinputPeerNotifySettings NotifySettingsValue::serialize() const {
 | |
| 	return MTP_inputPeerNotifySettings(
 | |
| 		MTP_flags(mtpCastFlags(_flags)),
 | |
| 		MTP_int(_mute),
 | |
| 		MTP_string(_sound));
 | |
| }
 | |
| 
 | |
| bool NotifySettings::change(const MTPPeerNotifySettings &settings) {
 | |
| 	switch (settings.type()) {
 | |
| 	case mtpc_peerNotifySettingsEmpty: {
 | |
| 		if (!_known || _value) {
 | |
| 			_known = true;
 | |
| 			_value = nullptr;
 | |
| 			return true;
 | |
| 		}
 | |
| 		return false;
 | |
| 	} break;
 | |
| 
 | |
| 	case mtpc_peerNotifySettings: {
 | |
| 		auto &data = settings.c_peerNotifySettings();
 | |
| 		if (_value) {
 | |
| 			return _value->change(data);
 | |
| 		}
 | |
| 		_known = true;
 | |
| 		_value = std::make_unique<NotifySettingsValue>(data);
 | |
| 		return true;
 | |
| 	} break;
 | |
| 	}
 | |
| 
 | |
| 	Unexpected("Type in NotifySettings::change()");
 | |
| }
 | |
| 
 | |
| NotifySettings::NotifySettings() = default;
 | |
| 
 | |
| bool NotifySettings::change(
 | |
| 		MuteChange mute,
 | |
| 		SilentPostsChange silent,
 | |
| 		int muteForSeconds) {
 | |
| 	Expects(mute != MuteChange::Mute || muteForSeconds > 0);
 | |
| 
 | |
| 	if (mute == MuteChange::Ignore && silent == SilentPostsChange::Ignore) {
 | |
| 		return false;
 | |
| 	}
 | |
| 	if (_value) {
 | |
| 		return _value->change(mute, silent, muteForSeconds);
 | |
| 	}
 | |
| 	const auto asEmpty = [&] {
 | |
| 		if (mute == MuteChange::Mute) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		if (silent == SilentPostsChange::Silent) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		return true;
 | |
| 	}();
 | |
| 	if (asEmpty) {
 | |
| 		return change(MTP_peerNotifySettingsEmpty());
 | |
| 	}
 | |
| 	const auto flags = MTPDpeerNotifySettings::Flag::f_show_previews
 | |
| 		| ((silent == SilentPostsChange::Silent)
 | |
| 			? MTPDpeerNotifySettings::Flag::f_silent
 | |
| 			: MTPDpeerNotifySettings::Flag(0));
 | |
| 	const auto muteUntil = (mute == MuteChange::Mute)
 | |
| 		? (unixtime() + muteForSeconds)
 | |
| 		: 0;
 | |
| 	return change(MTP_peerNotifySettings(
 | |
| 		MTP_flags(flags),
 | |
| 		MTP_int(muteUntil),
 | |
| 		MTP_string("default")));
 | |
| }
 | |
| 
 | |
| TimeMs NotifySettings::muteFinishesIn() const {
 | |
| 	return _value
 | |
| 		? _value->muteFinishesIn()
 | |
| 		: 0LL;
 | |
| }
 | |
| 
 | |
| bool NotifySettings::settingsUnknown() const {
 | |
| 	return !_known;
 | |
| }
 | |
| 
 | |
| bool NotifySettings::silentPosts() const {
 | |
| 	return _value
 | |
| 		? _value->silentPosts()
 | |
| 		: false;
 | |
| }
 | |
| 
 | |
| MTPinputPeerNotifySettings NotifySettings::serialize() const {
 | |
| 	return _value
 | |
| 		? _value->serialize()
 | |
| 		: DefaultSettings();
 | |
| }
 | |
| 
 | |
| NotifySettings::~NotifySettings() = default;
 | |
| 
 | |
| } // namespace Data
 | 
