diff --git a/Telegram/SourceFiles/boxes/mute_settings_box.cpp b/Telegram/SourceFiles/boxes/mute_settings_box.cpp index e7b779ef3..ac9771884 100644 --- a/Telegram/SourceFiles/boxes/mute_settings_box.cpp +++ b/Telegram/SourceFiles/boxes/mute_settings_box.cpp @@ -76,7 +76,9 @@ void MuteSettingsBox::prepare() { _save = [=] { const auto muteForSeconds = group->value() * 3600; - _peer->owner().notifySettings().update(_peer, muteForSeconds); + _peer->owner().notifySettings().update( + _peer, + { .period = muteForSeconds }); closeBox(); }; addButton(tr::lng_box_ok(), _save); diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 483eeb8e7..c17ca33db 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -201,7 +201,7 @@ public: return _notify.change(settings); } bool notifyChange( - std::optional muteForSeconds, + Data::MuteValue muteForSeconds, std::optional silentPosts, std::optional sound) { return _notify.change(muteForSeconds, silentPosts, sound); diff --git a/Telegram/SourceFiles/data/notify/data_notify_settings.cpp b/Telegram/SourceFiles/data/notify/data_notify_settings.cpp index fe9005798..d32550340 100644 --- a/Telegram/SourceFiles/data/notify/data_notify_settings.cpp +++ b/Telegram/SourceFiles/data/notify/data_notify_settings.cpp @@ -76,7 +76,7 @@ void NotifySettings::apply( void NotifySettings::update( not_null peer, - std::optional muteForSeconds, + Data::MuteValue muteForSeconds, std::optional silentPosts, std::optional sound) { if (peer->notifyChange(muteForSeconds, silentPosts, sound)) { @@ -130,7 +130,7 @@ const PeerNotifySettings &NotifySettings::defaultSettings( void NotifySettings::defaultUpdate( DefaultNotify type, - std::optional muteForSeconds, + Data::MuteValue muteForSeconds, std::optional silentPosts, std::optional sound) { auto &settings = defaultValue(type).settings; diff --git a/Telegram/SourceFiles/data/notify/data_notify_settings.h b/Telegram/SourceFiles/data/notify/data_notify_settings.h index 557700b23..a1a3dfd17 100644 --- a/Telegram/SourceFiles/data/notify/data_notify_settings.h +++ b/Telegram/SourceFiles/data/notify/data_notify_settings.h @@ -34,7 +34,7 @@ public: const MTPPeerNotifySettings &settings); void update( not_null peer, - std::optional muteForSeconds, + Data::MuteValue muteForSeconds, std::optional silentPosts = std::nullopt, std::optional sound = std::nullopt); void resetToDefault(not_null peer); @@ -53,7 +53,7 @@ public: void defaultUpdate( DefaultNotify type, - std::optional muteForSeconds, + Data::MuteValue muteForSeconds, std::optional silentPosts = std::nullopt, std::optional sound = std::nullopt); diff --git a/Telegram/SourceFiles/data/notify/data_peer_notify_settings.cpp b/Telegram/SourceFiles/data/notify/data_peer_notify_settings.cpp index 66841e7d8..619f61074 100644 --- a/Telegram/SourceFiles/data/notify/data_peer_notify_settings.cpp +++ b/Telegram/SourceFiles/data/notify/data_peer_notify_settings.cpp @@ -53,13 +53,23 @@ namespace { } // namespace +int MuteValue::until() const { + return forever + ? std::numeric_limits::max() + : (period > 0) + ? (base::unixtime::now() + period) + : unmute + ? 0 + : -1; +} + class NotifyPeerSettingsValue { public: NotifyPeerSettingsValue(const MTPDpeerNotifySettings &data); bool change(const MTPDpeerNotifySettings &data); bool change( - std::optional muteForSeconds, + MuteValue muteForSeconds, std::optional silentPosts, std::optional sound); @@ -102,14 +112,11 @@ bool NotifyPeerSettingsValue::change(const MTPDpeerNotifySettings &data) { } bool NotifyPeerSettingsValue::change( - std::optional muteForSeconds, + MuteValue muteForSeconds, std::optional silentPosts, std::optional sound) { - const auto now = base::unixtime::now(); const auto newMute = muteForSeconds - ? base::make_optional((*muteForSeconds > 0) - ? (now + *muteForSeconds) - : 0) + ? base::make_optional(muteForSeconds.until()) : _mute; const auto newSilentPosts = silentPosts ? base::make_optional(*silentPosts) @@ -194,7 +201,7 @@ bool PeerNotifySettings::change(const MTPPeerNotifySettings &settings) { } bool PeerNotifySettings::change( - std::optional muteForSeconds, + MuteValue muteForSeconds, std::optional silentPosts, std::optional sound) { if (!muteForSeconds && !silentPosts && !sound) { @@ -206,14 +213,11 @@ bool PeerNotifySettings::change( const auto flags = (muteForSeconds ? Flag::f_mute_until : Flag(0)) | (silentPosts ? Flag::f_silent : Flag(0)) | (sound ? Flag::f_other_sound : Flag(0)); - const auto muteUntil = muteForSeconds - ? (base::unixtime::now() + *muteForSeconds) - : 0; return change(MTP_peerNotifySettings( MTP_flags(flags), MTPBool(), silentPosts ? MTP_bool(*silentPosts) : MTPBool(), - MTP_int(muteUntil), + MTP_int(muteForSeconds.until()), MTPNotificationSound(), MTPNotificationSound(), SerializeSound(sound))); diff --git a/Telegram/SourceFiles/data/notify/data_peer_notify_settings.h b/Telegram/SourceFiles/data/notify/data_peer_notify_settings.h index f20c59164..3973d7820 100644 --- a/Telegram/SourceFiles/data/notify/data_peer_notify_settings.h +++ b/Telegram/SourceFiles/data/notify/data_peer_notify_settings.h @@ -18,6 +18,17 @@ struct NotifySound { bool none = false; }; +struct MuteValue { + bool unmute = false; + bool forever = false; + int period = 0; + + [[nodiscard]] explicit operator bool() const { + return unmute || forever || period; + } + [[nodiscard]] int until() const; +}; + inline bool operator==(const NotifySound &a, const NotifySound &b) { return (a.id == b.id) && (a.none == b.none) @@ -29,11 +40,9 @@ class PeerNotifySettings { public: PeerNotifySettings(); - static constexpr auto kDefaultMutePeriod = 86400 * 365; - bool change(const MTPPeerNotifySettings &settings); bool change( - std::optional muteForSeconds, + MuteValue muteForSeconds, std::optional silentPosts, std::optional sound); diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index f55f041cc..515a44c3c 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -3893,9 +3893,11 @@ void HistoryWidget::joinChannel() { } void HistoryWidget::toggleMuteUnmute() { - const auto muteForSeconds = _history->mute() - ? 0 - : Data::PeerNotifySettings::kDefaultMutePeriod; + const auto wasMuted = !!_history->mute(); + const auto muteForSeconds = Data::MuteValue{ + .unmute = wasMuted, + .forever = !wasMuted, + }; session().data().notifySettings().update(_peer, muteForSeconds); } diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index 8643f5720..d32c7d402 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -419,7 +419,9 @@ object_ptr DetailsFiller::setupMuteToggle() { return true; } if (peer->owner().notifySettings().isMuted(peer)) { - peer->owner().notifySettings().update(peer, 0); + peer->owner().notifySettings().update( + peer, + { .unmute = true }); return false; } else { return true; diff --git a/Telegram/SourceFiles/menu/menu_mute.cpp b/Telegram/SourceFiles/menu/menu_mute.cpp index 85daa310c..018cbf77d 100644 --- a/Telegram/SourceFiles/menu/menu_mute.cpp +++ b/Telegram/SourceFiles/menu/menu_mute.cpp @@ -115,7 +115,7 @@ MuteItem::MuteItem( setClickedCallback([=] { peer->owner().notifySettings().update( peer, - _isMuted ? 0 : Data::PeerNotifySettings::kDefaultMutePeriod); + { .unmute = _isMuted, .forever = !_isMuted }); }); } @@ -159,7 +159,9 @@ void MuteBox(not_null box, not_null peer) { }) | rpl::flatten_latest(); Ui::ConfirmBox(box, { .confirmed = [=] { - peer->owner().notifySettings().update(peer, state->lastSeconds); + peer->owner().notifySettings().update( + peer, + { .period = state->lastSeconds }); box->getDelegate()->hideLayer(); }, .confirmText = std::move(confirmText), @@ -183,7 +185,9 @@ void PickMuteBox(not_null box, not_null peer) { Ui::ConfirmBox(box, { .confirmed = [=] { const auto muteFor = pickerCallback(); - peer->owner().notifySettings().update(peer, muteFor); + peer->owner().notifySettings().update( + peer, + { .period = muteFor }); peer->session().settings().addMutePeriod(muteFor); peer->session().saveSettings(); box->closeBox(); @@ -246,7 +250,9 @@ void FillMuteMenu( + st::menuIconMuteForAnyTextPosition; for (const auto &muteFor : peer->session().settings().mutePeriods()) { const auto callback = [=] { - peer->owner().notifySettings().update(peer, muteFor); + peer->owner().notifySettings().update( + peer, + { .period = muteFor }); }; auto item = base::make_unique_q( diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index d1fc681fa..127ec62e6 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -142,7 +142,7 @@ void PeerMenuAddMuteSubmenuAction( + Ui::FormatMuteForTiny(peer->notifyMuteUntil().value_or(0) - base::unixtime::now()); addAction(text, [=] { - peer->owner().notifySettings().update(peer, 0); + peer->owner().notifySettings().update(peer, { .unmute = true }); }, &st::menuIconUnmute); } else { const auto show = std::make_shared(controller); @@ -1479,7 +1479,7 @@ void PeerMenuAddMuteAction( Box(peer), Ui::LayerOption::CloseOther); } else { - peer->owner().notifySettings().update(peer, 0); + peer->owner().notifySettings().update(peer, { .unmute = true }); } }, (peer->owner().notifySettings().isMuted(peer) ? &st::menuIconUnmute