diff --git a/Telegram/SourceFiles/data/data_notify_settings.cpp b/Telegram/SourceFiles/data/data_notify_settings.cpp index cbdc97ea4..1b7c6ee6a 100644 --- a/Telegram/SourceFiles/data/data_notify_settings.cpp +++ b/Telegram/SourceFiles/data/data_notify_settings.cpp @@ -60,10 +60,12 @@ public: bool change(const MTPDpeerNotifySettings &data); bool change( std::optional muteForSeconds, - std::optional silentPosts); + std::optional silentPosts, + std::optional sound); std::optional muteUntil() const; std::optional silentPosts() const; + std::optional sound() const; MTPinputPeerNotifySettings serialize() const; private: @@ -101,7 +103,8 @@ bool NotifySettingsValue::change(const MTPDpeerNotifySettings &data) { bool NotifySettingsValue::change( std::optional muteForSeconds, - std::optional silentPosts) { + std::optional silentPosts, + std::optional sound) { const auto now = base::unixtime::now(); const auto notMuted = muteForSeconds ? !(*muteForSeconds) @@ -114,9 +117,12 @@ bool NotifySettingsValue::change( const auto newSilentPosts = silentPosts ? base::make_optional(*silentPosts) : _silent; + const auto newSound = sound + ? base::make_optional(*sound) + : _sound; return change( newMute, - _sound, + newSound, _showPreviews, newSilentPosts); } @@ -147,6 +153,10 @@ std::optional NotifySettingsValue::silentPosts() const { return _silent; } +std::optional NotifySettingsValue::sound() const { + return _sound; +} + MTPinputPeerNotifySettings NotifySettingsValue::serialize() const { using Flag = MTPDinputPeerNotifySettings::Flag; const auto flag = [](auto &&optional, Flag flag) { @@ -188,15 +198,20 @@ bool NotifySettings::change(const MTPPeerNotifySettings &settings) { bool NotifySettings::change( std::optional muteForSeconds, - std::optional silentPosts) { - if (!muteForSeconds && !silentPosts) { + std::optional silentPosts, + std::optional soundIsNone) { + const auto notificationSound = soundIsNone + ? std::make_optional(NotifySound{ .none = (*soundIsNone) }) + : std::nullopt; + if (!muteForSeconds && !silentPosts && !soundIsNone) { return false; } else if (_value) { - return _value->change(muteForSeconds, silentPosts); + return _value->change(muteForSeconds, silentPosts, notificationSound); } using Flag = MTPDpeerNotifySettings::Flag; const auto flags = (muteForSeconds ? Flag::f_mute_until : Flag(0)) - | (silentPosts ? Flag::f_silent : Flag(0)); + | (silentPosts ? Flag::f_silent : Flag(0)) + | (notificationSound ? Flag::f_other_sound : Flag(0)); const auto muteUntil = muteForSeconds ? (base::unixtime::now() + *muteForSeconds) : 0; @@ -207,7 +222,7 @@ bool NotifySettings::change( MTP_int(muteUntil), MTPNotificationSound(), MTPNotificationSound(), - MTPNotificationSound())); + SerializeSound(notificationSound))); } std::optional NotifySettings::muteUntil() const { @@ -226,6 +241,12 @@ std::optional NotifySettings::silentPosts() const { : std::nullopt; } +std::optional NotifySettings::soundIsNone() const { + return (!_value || !_value->sound()) + ? std::nullopt + : std::make_optional(_value->sound()->none); +} + MTPinputPeerNotifySettings NotifySettings::serialize() const { return _value ? _value->serialize() diff --git a/Telegram/SourceFiles/data/data_notify_settings.h b/Telegram/SourceFiles/data/data_notify_settings.h index 4793942e6..f868ce4fe 100644 --- a/Telegram/SourceFiles/data/data_notify_settings.h +++ b/Telegram/SourceFiles/data/data_notify_settings.h @@ -34,11 +34,13 @@ public: bool change(const MTPPeerNotifySettings &settings); bool change( std::optional muteForSeconds, - std::optional silentPosts); + std::optional silentPosts, + std::optional soundIsNone); bool settingsUnknown() const; std::optional muteUntil() const; std::optional silentPosts() const; + std::optional soundIsNone() const; MTPinputPeerNotifySettings serialize() const; ~NotifySettings(); diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 13cc7d2aa..062b2f6df 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -194,8 +194,9 @@ public: } bool notifyChange( std::optional muteForSeconds, - std::optional silentPosts) { - return _notify.change(muteForSeconds, silentPosts); + std::optional silentPosts, + std::optional soundIsNone) { + return _notify.change(muteForSeconds, silentPosts, soundIsNone); } [[nodiscard]] bool notifySettingsUnknown() const { return _notify.settingsUnknown(); @@ -203,6 +204,9 @@ public: [[nodiscard]] std::optional notifySilentPosts() const { return _notify.silentPosts(); } + [[nodiscard]] std::optional notifySoundIsNone() const { + return _notify.soundIsNone(); + } [[nodiscard]] MTPinputPeerNotifySettings notifySerialize() const { return _notify.serialize(); } diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index e95ac7c7c..dd031c099 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -3896,7 +3896,8 @@ void Session::applyNotifySetting( const NotifySettings &settings) { return !peer->notifySettingsUnknown() && ((!peer->notifyMuteUntil() && settings.muteUntil()) - || (!peer->notifySilentPosts() && settings.silentPosts())); + || (!peer->notifySilentPosts() && settings.silentPosts()) + || (!peer->notifySoundIsNone() && settings.soundIsNone())); }; switch (notifyPeer.type()) { @@ -3947,8 +3948,9 @@ void Session::applyNotifySetting( void Session::updateNotifySettings( not_null peer, std::optional muteForSeconds, - std::optional silentPosts) { - if (peer->notifyChange(muteForSeconds, silentPosts)) { + std::optional silentPosts, + std::optional soundIsNone) { + if (peer->notifyChange(muteForSeconds, silentPosts, soundIsNone)) { updateNotifySettingsLocal(peer); _session->api().updateNotifySettingsDelayed(peer); } @@ -3969,6 +3971,10 @@ void Session::resetNotifySettingsToDefault(not_null peer) { } } +bool Session::notifyIsMuted(not_null peer) const { + return notifyIsMuted(peer, nullptr); +} + bool Session::notifyIsMuted( not_null peer, crl::time *changesIn) const { @@ -4003,6 +4009,17 @@ bool Session::notifySilentPosts(not_null peer) const { return false; } +bool Session::notifySoundIsNone(not_null peer) const { + if (const auto soundIsNone = peer->notifySoundIsNone()) { + return *soundIsNone; + } + const auto &settings = defaultNotifySettings(peer); + if (const auto soundIsNone = settings.soundIsNone()) { + return *soundIsNone; + } + return false; +} + bool Session::notifyMuteUnknown(not_null peer) const { if (peer->notifySettingsUnknown()) { return true; @@ -4022,8 +4039,19 @@ bool Session::notifySilentPostsUnknown( return defaultNotifySettings(peer).settingsUnknown(); } +bool Session::notifySoundIsNoneUnknown(not_null peer) const { + if (peer->notifySettingsUnknown()) { + return true; + } else if (const auto nonDefault = peer->notifySoundIsNone()) { + return false; + } + return defaultNotifySettings(peer).settingsUnknown(); +} + bool Session::notifySettingsUnknown(not_null peer) const { - return notifyMuteUnknown(peer) || notifySilentPostsUnknown(peer); + return notifyMuteUnknown(peer) + || notifySilentPostsUnknown(peer) + || notifySoundIsNoneUnknown(peer); } rpl::producer<> Session::defaultUserNotifyUpdates() const { diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 89223bd6f..f6cd7a830 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -666,14 +666,15 @@ public: void updateNotifySettings( not_null peer, std::optional muteForSeconds, - std::optional silentPosts = std::nullopt); + std::optional silentPosts = std::nullopt, + std::optional soundIsNone = std::nullopt); void resetNotifySettingsToDefault(not_null peer); - bool notifyIsMuted( - not_null peer, - crl::time *changesIn = nullptr) const; + bool notifyIsMuted(not_null peer) const; bool notifySilentPosts(not_null peer) const; + bool notifySoundIsNone(not_null peer) const; bool notifyMuteUnknown(not_null peer) const; bool notifySilentPostsUnknown(not_null peer) const; + bool notifySoundIsNoneUnknown(not_null peer) const; bool notifySettingsUnknown(not_null peer) const; rpl::producer<> defaultUserNotifyUpdates() const; rpl::producer<> defaultChatNotifyUpdates() const; @@ -711,6 +712,10 @@ public: private: using Messages = std::unordered_map>; + bool notifyIsMuted( + not_null peer, + crl::time *changesIn) const; + void suggestStartExport(); void setupMigrationViewer(); diff --git a/Telegram/SourceFiles/window/notifications_manager.cpp b/Telegram/SourceFiles/window/notifications_manager.cpp index eff5df423..9f64e0ca7 100644 --- a/Telegram/SourceFiles/window/notifications_manager.cpp +++ b/Telegram/SourceFiles/window/notifications_manager.cpp @@ -178,7 +178,8 @@ System::SkipState System::computeSkipState( .value = value, .silent = (forceSilent || !messageNotification - || item->isSilent()), + || item->isSilent() + || history->owner().notifySoundIsNone(history->peer)), }; }; const auto showForMuted = messageNotification