mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-02-15 11:36:54 +00:00
205 lines
4.8 KiB
C++
205 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
|