diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index 18262c586..acb55dec0 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -220,9 +220,9 @@ inputNotifyUsers#193b4417 = InputNotifyPeer; inputNotifyChats#4a95e84e = InputNotifyPeer; inputNotifyBroadcasts#b1db7c7e = InputNotifyPeer; -inputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = InputPeerNotifySettings; +inputPeerNotifySettings#df1f002b flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?NotificationSound = InputPeerNotifySettings; -peerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings; +peerNotifySettings#a83b0426 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int ios_sound:flags.3?NotificationSound android_sound:flags.4?NotificationSound other_sound:flags.5?NotificationSound = PeerNotifySettings; peerSettings#a518110d flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true invite_members:flags.8?true request_chat_broadcast:flags.10?true geo_distance:flags.6?int request_chat_title:flags.9?string request_chat_date:flags.9?int = PeerSettings; @@ -388,6 +388,7 @@ updateBotChatInviteRequester#11dfa986 peer:Peer date:int user_id:long about:stri updateMessageReactions#154798c3 peer:Peer msg_id:int reactions:MessageReactions = Update; updateAttachMenuBots#17b7a20b = Update; updateWebViewResultSent#f8f63baa peer:Peer bot_id:long query_id:long = Update; +updateSavedRingtones#74d8be99 = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -1349,6 +1350,14 @@ simpleWebViewResultUrl#882f76bb url:string = SimpleWebViewResult; webViewMessageSent#c94511c flags:# msg_id:flags.0?InputBotInlineMessageID = WebViewMessageSent; +account.savedRingtonesNotModified#fbf6e8b1 = account.SavedRingtones; +account.savedRingtones#c1e92cc5 hash:long ringtones:Vector = account.SavedRingtones; + +notificationSoundDefault#97e8bebe = NotificationSound; +notificationSoundNone#6f0c34df = NotificationSound; +notificationSoundLocal#830b9ae4 title:string data:string = NotificationSound; +notificationSoundRingtone#ff6c8049 id:long = NotificationSound; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1452,6 +1461,9 @@ account.declinePasswordReset#4c9409f6 = Bool; account.getChatThemes#d638de89 hash:long = account.Themes; account.setAuthorizationTTL#bf899aa0 authorization_ttl_days:int = Bool; account.changeAuthorizationSettings#40f48462 flags:# hash:long encrypted_requests_disabled:flags.0?Bool call_requests_disabled:flags.1?Bool = Bool; +account.getSavedRingtones#e1902288 hash:long = account.SavedRingtones; +account.saveRingtone#e9f81323 id:InputDocument unsave:Bool = Bool; +account.uploadRingtone#831a83a2 file:InputFile file_name:string mime_type:string = Document; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 741c3c577..3615a8c72 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -1746,7 +1746,9 @@ void ApiWrap::requestNotifySettings(const MTPInputNotifyPeer &peer) { MTPBool(), MTPBool(), MTPint(), - MTPstring())); + MTPNotificationSound(), + MTPNotificationSound(), + MTPNotificationSound())); _notifySettingRequests.erase(key); }).send(); diff --git a/Telegram/SourceFiles/data/data_notify_settings.cpp b/Telegram/SourceFiles/data/data_notify_settings.cpp index d234af1df..cbdc97ea4 100644 --- a/Telegram/SourceFiles/data/data_notify_settings.cpp +++ b/Telegram/SourceFiles/data/data_notify_settings.cpp @@ -12,13 +12,43 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Data { namespace { -MTPinputPeerNotifySettings DefaultSettings() { +[[nodiscard]] MTPinputPeerNotifySettings DefaultSettings() { return MTP_inputPeerNotifySettings( MTP_flags(0), MTPBool(), MTPBool(), MTPint(), - MTPstring()); + MTPNotificationSound()); +} + +[[nodiscard]] NotifySound ParseSound(const MTPNotificationSound &sound) { + return sound.match([&](const MTPDnotificationSoundDefault &data) { + return NotifySound(); + }, [&](const MTPDnotificationSoundNone &data) { + return NotifySound{ .none = true }; + }, [&](const MTPDnotificationSoundLocal &data) { + return NotifySound{ + .title = qs(data.vtitle()), + .data = qs(data.vdata()), + }; + }, [&](const MTPDnotificationSoundRingtone &data) { + return NotifySound{ .id = data.vid().v }; + }); +} + +[[nodiscard]] MTPNotificationSound SerializeSound( + const std::optional &sound) { + return !sound + ? MTPNotificationSound() + : sound->none + ? MTP_notificationSoundNone() + : sound->id + ? MTP_notificationSoundRingtone(MTP_long(sound->id)) + : !sound->title.isEmpty() + ? MTP_notificationSoundLocal( + MTP_string(sound->title), + MTP_string(sound->data)) + : MTP_notificationSoundDefault(); } } // namespace @@ -39,12 +69,12 @@ public: private: bool change( std::optional mute, - std::optional sound, + std::optional sound, std::optional showPreviews, std::optional silentPosts); std::optional _mute; - std::optional _sound; + std::optional _sound; std::optional _silent; std::optional _showPreviews; @@ -57,12 +87,12 @@ NotifySettingsValue::NotifySettingsValue( bool NotifySettingsValue::change(const MTPDpeerNotifySettings &data) { const auto mute = data.vmute_until(); - const auto sound = data.vsound(); + const auto sound = data.vother_sound(); const auto showPreviews = data.vshow_previews(); const auto silent = data.vsilent(); return change( mute ? std::make_optional(mute->v) : std::nullopt, - sound ? std::make_optional(qs(*sound)) : std::nullopt, + sound ? std::make_optional(ParseSound(*sound)) : std::nullopt, (showPreviews ? std::make_optional(mtpIsTrue(*showPreviews)) : std::nullopt), @@ -81,22 +111,19 @@ bool NotifySettingsValue::change( ? (now + *muteForSeconds) : 0) : _mute; - const auto newSound = (_sound && _sound->isEmpty() && notMuted) - ? qsl("default") - : _sound; const auto newSilentPosts = silentPosts ? base::make_optional(*silentPosts) : _silent; return change( newMute, - newSound, + _sound, _showPreviews, newSilentPosts); } bool NotifySettingsValue::change( std::optional mute, - std::optional sound, + std::optional sound, std::optional showPreviews, std::optional silentPosts) { if (_mute == mute @@ -133,7 +160,7 @@ MTPinputPeerNotifySettings NotifySettingsValue::serialize() const { MTP_bool(_showPreviews ? *_showPreviews : true), MTP_bool(_silent ? *_silent : false), MTP_int(_mute ? *_mute : false), - MTP_string(_sound ? *_sound : QString())); + SerializeSound(_sound)); } NotifySettings::NotifySettings() = default; @@ -178,7 +205,9 @@ bool NotifySettings::change( MTPBool(), silentPosts ? MTP_bool(*silentPosts) : MTPBool(), MTP_int(muteUntil), - MTPstring())); + MTPNotificationSound(), + MTPNotificationSound(), + MTPNotificationSound())); } std::optional NotifySettings::muteUntil() const { diff --git a/Telegram/SourceFiles/data/data_notify_settings.h b/Telegram/SourceFiles/data/data_notify_settings.h index dc61df588..4793942e6 100644 --- a/Telegram/SourceFiles/data/data_notify_settings.h +++ b/Telegram/SourceFiles/data/data_notify_settings.h @@ -11,6 +11,20 @@ namespace Data { class NotifySettingsValue; +struct NotifySound { + QString title; + QString data; + DocumentId id = 0; + bool none = false; +}; + +inline bool operator==(const NotifySound &a, const NotifySound &b) { + return (a.id == b.id) + && (a.none == b.none) + && (a.title == b.title) + && (a.data == b.data); +} + class NotifySettings { public: NotifySettings(); diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 80d83a537..3b47ab8ae 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -3964,7 +3964,9 @@ void Session::resetNotifySettingsToDefault(not_null peer) { MTPBool(), MTPBool(), MTPint(), - MTPstring()); + MTPNotificationSound(), + MTPNotificationSound(), + MTPNotificationSound()); if (peer->notifyChange(empty)) { updateNotifySettingsLocal(peer); _session->api().updateNotifySettingsDelayed(peer);