diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index 173cfbb91..66e34cff2 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -330,6 +330,7 @@ void DocumentData::setattributes( _flags &= ~(Flag::ImageType | Flag::HasAttachedStickers | Flag::UseTextColor + | Flag::SilentVideo | kStreamingSupportedMask); _flags |= kStreamingSupportedUnknown; @@ -402,6 +403,9 @@ void DocumentData::setattributes( _duration = crl::time( base::SafeRound(data.vduration().v * 1000)); setMaybeSupportsStreaming(data.is_supports_streaming()); + if (data.is_nosound()) { + _flags |= Flag::SilentVideo; + } dimensions = QSize(data.vw().v, data.vh().v); }, [&](const MTPDdocumentAttributeAudio &data) { if (type == FileDocument) { @@ -1542,6 +1546,10 @@ bool DocumentData::isVideoFile() const { return (type == VideoDocument); } +bool DocumentData::isSilentVideo() const { + return _flags & Flag::SilentVideo; +} + crl::time DocumentData::duration() const { return std::max(_duration, crl::time()); } diff --git a/Telegram/SourceFiles/data/data_document.h b/Telegram/SourceFiles/data/data_document.h index 9f013e373..59891c005 100644 --- a/Telegram/SourceFiles/data/data_document.h +++ b/Telegram/SourceFiles/data/data_document.h @@ -166,6 +166,7 @@ public: [[nodiscard]] bool isSongWithCover() const; [[nodiscard]] bool isAudioFile() const; [[nodiscard]] bool isVideoFile() const; + [[nodiscard]] bool isSilentVideo() const; [[nodiscard]] bool isAnimation() const; [[nodiscard]] bool isGifv() const; [[nodiscard]] bool isTheme() const; diff --git a/Telegram/SourceFiles/data/data_story.cpp b/Telegram/SourceFiles/data/data_story.cpp index 210e4a8f4..8b21c7c34 100644 --- a/Telegram/SourceFiles/data/data_story.cpp +++ b/Telegram/SourceFiles/data/data_story.cpp @@ -255,12 +255,16 @@ bool Story::pinned() const { return _pinned; } -bool Story::isPublic() const { - return _isPublic; -} - -bool Story::closeFriends() const { - return _closeFriends; +StoryPrivacy Story::privacy() const { + return _privacyPublic + ? StoryPrivacy::Public + : _privacyCloseFriends + ? StoryPrivacy::CloseFriends + : _privacyContacts + ? StoryPrivacy::Contacts + : _privacySelectedContacts + ? StoryPrivacy::SelectedContacts + : StoryPrivacy::Other; } bool Story::forbidsForward() const { @@ -276,7 +280,7 @@ bool Story::canDownload() const { } bool Story::canShare() const { - return isPublic() && !forbidsForward() && (pinned() || !expired()); + return _privacyPublic && !forbidsForward() && (pinned() || !expired()); } bool Story::canDelete() const { @@ -288,7 +292,7 @@ bool Story::canReport() const { } bool Story::hasDirectLink() const { - if (!_isPublic || (!_pinned && expired())) { + if (!_privacyPublic || (!_pinned && expired())) { return false; } const auto user = _peer->asUser(); @@ -410,8 +414,15 @@ void Story::applyFields( const auto pinned = data.is_pinned(); const auto edited = data.is_edited(); - const auto isPublic = data.is_public(); - const auto closeFriends = data.is_close_friends(); + const auto privacy = data.is_public() + ? StoryPrivacy::Public + : data.is_close_friends() + ? StoryPrivacy::CloseFriends + : data.is_contacts() + ? StoryPrivacy::Contacts + : data.is_selected_contacts() + ? StoryPrivacy::SelectedContacts + : StoryPrivacy::Other; const auto noForwards = data.is_noforwards(); auto caption = TextWithEntities{ data.vcaption().value_or_empty(), @@ -443,13 +454,13 @@ void Story::applyFields( const auto viewsChanged = (_views != views) || (_recentViewers != viewers); - _isPublic = isPublic; - _closeFriends = closeFriends; + _privacyPublic = (privacy == StoryPrivacy::Public); + _privacyCloseFriends = (privacy == StoryPrivacy::CloseFriends); + _privacyContacts = (privacy == StoryPrivacy::Contacts); + _privacySelectedContacts = (privacy == StoryPrivacy::SelectedContacts); _noForwards = noForwards; _edited = edited; _pinned = pinned; - _isPublic = isPublic; - _closeFriends = closeFriends; _noForwards = noForwards; if (viewsChanged) { _views = views; diff --git a/Telegram/SourceFiles/data/data_story.h b/Telegram/SourceFiles/data/data_story.h index d95c4dd40..8ea17b7b7 100644 --- a/Telegram/SourceFiles/data/data_story.h +++ b/Telegram/SourceFiles/data/data_story.h @@ -23,6 +23,14 @@ class Session; class Thread; class PhotoMedia; +enum class StoryPrivacy : uchar { + Public, + CloseFriends, + Contacts, + SelectedContacts, + Other, +}; + struct StoryIdDates { StoryId id = 0; TimeId date = 0; @@ -88,8 +96,7 @@ public: void setPinned(bool pinned); [[nodiscard]] bool pinned() const; - [[nodiscard]] bool isPublic() const; - [[nodiscard]] bool closeFriends() const; + [[nodiscard]] StoryPrivacy privacy() const; [[nodiscard]] bool forbidsForward() const; [[nodiscard]] bool edited() const; @@ -138,8 +145,10 @@ private: const TimeId _expires = 0; TimeId _lastUpdateTime = 0; bool _pinned : 1 = false; - bool _isPublic : 1 = false; - bool _closeFriends : 1 = false; + bool _privacyPublic : 1 = false; + bool _privacyCloseFriends : 1 = false; + bool _privacyContacts : 1 = false; + bool _privacySelectedContacts : 1 = false; bool _noForwards : 1 = false; bool _edited : 1 = false; diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp index 2bdb19098..adad7ec8b 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/update_checker.h" #include "data/stickers/data_custom_emoji.h" #include "data/data_changes.h" +#include "data/data_document.h" #include "data/data_file_origin.h" #include "data/data_message_reactions.h" #include "data/data_session.h" @@ -795,12 +796,16 @@ void Controller::show( _captionText = story->caption(); _captionFullView = nullptr; + const auto document = story->document(); _header->show({ .user = user, .date = story->date(), .fullIndex = _sliderCount ? _index : 0, .fullCount = _sliderCount ? shownCount() : 0, + .privacy = story->privacy(), .edited = story->edited(), + .video = (document != nullptr), + .silent = (document && document->isSilentVideo()), }); if (!changeShown(story)) { return; diff --git a/Telegram/SourceFiles/media/stories/media_stories_header.h b/Telegram/SourceFiles/media/stories/media_stories_header.h index 1393eefd5..2b8f6e61f 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_header.h +++ b/Telegram/SourceFiles/media/stories/media_stories_header.h @@ -10,6 +10,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/timer.h" #include "ui/userpic_view.h" +namespace Data { +enum class StoryPrivacy : uchar; +} // namespace Data + namespace Ui { class RpWidget; class FlatLabel; @@ -24,7 +28,10 @@ struct HeaderData { TimeId date = 0; int fullIndex = 0; int fullCount = 0; + Data::StoryPrivacy privacy = {}; bool edited = false; + bool video = false; + bool silent = false; friend inline auto operator<=>(HeaderData, HeaderData) = default; friend inline bool operator==(HeaderData, HeaderData) = default; diff --git a/Telegram/SourceFiles/mtproto/scheme/api.tl b/Telegram/SourceFiles/mtproto/scheme/api.tl index 18c9bcd5b..9c54c97bc 100644 --- a/Telegram/SourceFiles/mtproto/scheme/api.tl +++ b/Telegram/SourceFiles/mtproto/scheme/api.tl @@ -1530,7 +1530,7 @@ storyViews#d36760cf flags:# views_count:int recent_viewers:flags.0?Vector storyItemDeleted#51e6ee4f id:int = StoryItem; storyItemSkipped#ffadc913 flags:# close_friends:flags.8?true id:int date:int expire_date:int = StoryItem; -storyItem#562aa637 flags:# pinned:flags.5?true public:flags.7?true close_friends:flags.8?true min:flags.9?true noforwards:flags.10?true edited:flags.11?true id:int date:int expire_date:int caption:flags.0?string entities:flags.1?Vector media:MessageMedia privacy:flags.2?Vector views:flags.3?StoryViews = StoryItem; +storyItem#562aa637 flags:# pinned:flags.5?true public:flags.7?true close_friends:flags.8?true min:flags.9?true noforwards:flags.10?true edited:flags.11?true contacts:flags.12?true selected_contacts:flags.13?true id:int date:int expire_date:int caption:flags.0?string entities:flags.1?Vector media:MessageMedia privacy:flags.2?Vector views:flags.3?StoryViews = StoryItem; userStories#8611a200 flags:# user_id:long max_read_id:flags.0?int stories:Vector = UserStories; @@ -1677,6 +1677,7 @@ account.invalidateSignInCodes#ca8ae8ba codes:Vector = Bool; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; users.setSecureValueErrors#90c894b5 id:InputUser errors:Vector = Bool; +users.getStoriesMaxIDs#ca1cb9ab id:Vector = Vector; contacts.getContactIDs#7adc669d hash:long = Vector; contacts.getStatuses#c4a353ee = Vector;