Update API scheme, pass privacy info to viewer.

This commit is contained in:
John Preston 2023-07-19 12:30:34 +04:00
parent 585bbd45f4
commit ffd691e556
7 changed files with 61 additions and 19 deletions

View File

@ -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());
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1530,7 +1530,7 @@ storyViews#d36760cf flags:# views_count:int recent_viewers:flags.0?Vector<long>
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<MessageEntity> media:MessageMedia privacy:flags.2?Vector<PrivacyRule> 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<MessageEntity> media:MessageMedia privacy:flags.2?Vector<PrivacyRule> views:flags.3?StoryViews = StoryItem;
userStories#8611a200 flags:# user_id:long max_read_id:flags.0?int stories:Vector<StoryItem> = UserStories;
@ -1677,6 +1677,7 @@ account.invalidateSignInCodes#ca8ae8ba codes:Vector<string> = Bool;
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
users.getFullUser#b60f5918 id:InputUser = users.UserFull;
users.setSecureValueErrors#90c894b5 id:InputUser errors:Vector<SecureValueError> = Bool;
users.getStoriesMaxIDs#ca1cb9ab id:Vector<InputUser> = Vector<int>;
contacts.getContactIDs#7adc669d hash:long = Vector<int>;
contacts.getStatuses#c4a353ee = Vector<ContactStatus>;