From 8fca36836cf284bf9b2eb9eba96a4b532249cee8 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sun, 7 Jan 2024 14:20:01 -0800 Subject: [PATCH] Add notice of private profile pic, inner circle placeholder * On a user gallery page: if the current user can not see their default profile pic (friends-only or private), include a notice and link to the FAQ about this. * Add a new placeholder avatar for profile pics that are set to "Inner circle only" when viewed by members outside the circle. --- pkg/controller/chat/chat.go | 2 ++ pkg/controller/photo/user_gallery.go | 8 +++++ pkg/models/user.go | 40 +++++++++++++++++++++--- pkg/models/user_relationship.go | 16 ++++++---- web/static/css/theme.css | 2 +- web/static/img/shy-secret.png | Bin 0 -> 20210 bytes web/templates/account/profile.html | 12 +------ web/templates/faq.html | 32 +++++++++++++++++++ web/templates/partials/like_modal.html | 2 ++ web/templates/partials/user_avatar.html | 10 ++++++ web/templates/photo/gallery.html | 21 +++++++++++++ 11 files changed, 122 insertions(+), 23 deletions(-) create mode 100644 web/static/img/shy-secret.png diff --git a/pkg/controller/chat/chat.go b/pkg/controller/chat/chat.go index 58bfd0c..9a3a178 100644 --- a/pkg/controller/chat/chat.go +++ b/pkg/controller/chat/chat.go @@ -104,6 +104,8 @@ func Landing() http.HandlerFunc { avatar = "/static/img/shy-private.png" case models.PhotoFriends: avatar = "/static/img/shy-friends.png" + case models.PhotoInnerCircle: + avatar = "/static/img/shy-secret.png" } // Country flag emoji. diff --git a/pkg/controller/photo/user_gallery.go b/pkg/controller/photo/user_gallery.go index b35fb27..9d987d5 100644 --- a/pkg/controller/photo/user_gallery.go +++ b/pkg/controller/photo/user_gallery.go @@ -196,6 +196,13 @@ func UserPhotos() http.HandlerFunc { likeMap := models.MapLikes(currentUser, "photos", photoIDs) commentMap := models.MapCommentCounts("photos", photoIDs) + // Can we see their default profile picture? If no: show a hint on the Gallery page that + // their default pic isn't visible. + var profilePictureHidden models.PhotoVisibility + if ok, visibility := user.CanSeeProfilePicture(currentUser); !ok && visibility != models.PhotoPublic { + profilePictureHidden = visibility + } + var vars = map[string]interface{}{ "IsOwnPhotos": currentUser.ID == user.ID, "IsShyUser": isShy, @@ -203,6 +210,7 @@ func UserPhotos() http.HandlerFunc { "IsMyPrivateUnlockedFor": isGranted, // have WE granted THIS USER to see our private pics? "AreWeGrantedPrivate": isGrantee, // have THEY granted US private photo access. "AreFriends": areFriends, + "ProfilePictureHiddenVisibility": profilePictureHidden, "User": user, "Photos": photos, "PhotoCount": models.CountPhotosICanSee(user, currentUser), diff --git a/pkg/models/user.go b/pkg/models/user.go index 4586561..8eed924 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -536,16 +536,46 @@ func (u *User) NameOrUsername() string { // // Expects that UserRelationships are available on the user. func (u *User) VisibleAvatarURL(currentUser *User) string { - if u.ProfilePhoto.Visibility == PhotoPrivate && !u.UserRelationship.IsPrivateGranted { - return "/static/img/shy-private.png" - } else if u.ProfilePhoto.Visibility == PhotoFriends && !u.UserRelationship.IsFriend { - return "/static/img/shy-friends.png" - } else if u.ProfilePhoto.CroppedFilename != "" { + canSee, visibility := u.CanSeeProfilePicture(currentUser) + if canSee { return config.PhotoWebPath + "/" + u.ProfilePhoto.CroppedFilename } + + switch visibility { + case PhotoPrivate: + return "/static/img/shy-private.png" + case PhotoInnerCircle: + return "/static/img/shy-secret.png" + case PhotoFriends: + return "/static/img/shy-friends.png" + } + return "/static/img/shy.png" } +// CanSeeProfilePicture returns whether the current user can see the user's profile picture. +// +// Returns a boolean (false if currentUser can't see) and the Visibility setting of the profile photo. +// +// If the user has no profile photo, returns (false, PhotoPublic) which should manifest as the blue shy.png placeholder image. +func (u *User) CanSeeProfilePicture(currentUser *User) (bool, PhotoVisibility) { + visibility := u.ProfilePhoto.Visibility + if visibility == PhotoPrivate && !u.UserRelationship.IsPrivateGranted { + // Private photo + return false, visibility + } else if visibility == PhotoFriends && !u.UserRelationship.IsFriend { + // Friends only + return false, visibility + } else if visibility == PhotoInnerCircle && !currentUser.IsInnerCircle() { + // Inner circle only + return false, visibility + } else if u.ProfilePhoto.CroppedFilename != "" { + // Happy path + return true, visibility + } + return false, PhotoPublic +} + // HashPassword sets the user's hashed (bcrypt) password. func (u *User) HashPassword(password string) error { passwd, err := bcrypt.GenerateFromPassword([]byte(password), config.BcryptCost) diff --git a/pkg/models/user_relationship.go b/pkg/models/user_relationship.go index 0ff49d6..d9d6dcf 100644 --- a/pkg/models/user_relationship.go +++ b/pkg/models/user_relationship.go @@ -5,17 +5,19 @@ package models // The zero-values should fail safely: in case the UserRelationship isn't populated correctly, // private profile pics show as private by default. type UserRelationship struct { - IsFriend bool // if true, a friends-only profile pic can show - IsPrivateGranted bool // if true, a private profile pic can show + IsFriend bool // if true, a friends-only profile pic can show + IsPrivateGranted bool // if true, a private profile pic can show + IsInnerCirclePeer bool // if true, the current user is in the inner circle so may see circle-only profile picture } // SetUserRelationships updates a set of User objects to populate their UserRelationships in // relationship to the current user who is looking. -func SetUserRelationships(user *User, users []*User) error { +func SetUserRelationships(currentUser *User, users []*User) error { // Collect the current user's Friendships and Private Grants. var ( - friendIDs = FriendIDs(user.ID) - privateGrants = PrivateGrantedUserIDs(user.ID) + friendIDs = FriendIDs(currentUser.ID) + privateGrants = PrivateGrantedUserIDs(currentUser.ID) + isInnerCircle = currentUser.IsInnerCircle() ) // Map them for easier lookup. @@ -34,7 +36,9 @@ func SetUserRelationships(user *User, users []*User) error { // Inject the UserRelationships. for _, u := range users { - if u.ID == user.ID { + u.UserRelationship.IsInnerCirclePeer = isInnerCircle + + if u.ID == currentUser.ID { // Current user - set both bools to true - you can always see your own profile pic. u.UserRelationship.IsFriend = true u.UserRelationship.IsPrivateGranted = true diff --git a/web/static/css/theme.css b/web/static/css/theme.css index 409119f..8c9cfbf 100644 --- a/web/static/css/theme.css +++ b/web/static/css/theme.css @@ -58,7 +58,7 @@ img { } .has-text-private { - color: #CC00CC; + color: #CC00CC !important; } .has-text-private-light { diff --git a/web/static/img/shy-secret.png b/web/static/img/shy-secret.png new file mode 100644 index 0000000000000000000000000000000000000000..204029336006d14a72ff317488f2983d355cf58e GIT binary patch literal 20210 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
- {{if .User.ProfilePhoto.ID}} - {{if and (eq .User.ProfilePhoto.Visibility "private") (not .User.UserRelationship.IsPrivateGranted)}} - - {{else if and (eq .User.ProfilePhoto.Visibility "friends") (not .User.UserRelationship.IsFriend)}} - - {{else}} - - {{end}} - {{else}} - - {{end}} + {{if and .LoggedIn (eq .CurrentUser.ID .User.ID) (not .IsPrivate)}} diff --git a/web/templates/faq.html b/web/templates/faq.html index b644a52..cc0537a 100644 --- a/web/templates/faq.html +++ b/web/templates/faq.html @@ -378,8 +378,40 @@ granted access to see your private photos. + {{if .CurrentUser.IsInnerCircle}} +
  • + {{PrettyCircle}} + : + your profile pic displays as a gradient + + placeholder image for members outside the inner circle. +
      +
    • + Note: only {{PrettyCircle}} members see this info on the FAQ page. + Members outside the circle will see the gradient avatar, but be told that it means + "Private." +
    • +
    +
  • + {{end}} +

    + Note that it is required that your default profile picture must include your face, + but with the visibility settings you may limit who will see it if you need to. +

    + +

    + If you find a member's gallery where they have no face visible in any of their pictures, it may + be that their default profile picture is just not visible to you, and a notice appears at the top + of their gallery page if this is the case. +

    + +

    + If you find a member whose profile photo you can see, and it also does not include their + face, please report their profile to the admin. +

    +

    What are the visibility options for my profile page?

    diff --git a/web/templates/partials/like_modal.html b/web/templates/partials/like_modal.html index 396c9ce..965aa74 100644 --- a/web/templates/partials/like_modal.html +++ b/web/templates/partials/like_modal.html @@ -27,6 +27,8 @@ {{else if and (eq $User.ProfilePhoto.Visibility "friends") (not $User.UserRelationship.IsFriend)}} + {{else if and (eq $User.ProfilePhoto.Visibility "circle") (not $User.UserRelationship.IsInnerCirclePeer)}} + {{else}} {{end}} diff --git a/web/templates/partials/user_avatar.html b/web/templates/partials/user_avatar.html index 2f97315..2d96b3d 100644 --- a/web/templates/partials/user_avatar.html +++ b/web/templates/partials/user_avatar.html @@ -9,6 +9,8 @@ {{else if and (eq .ProfilePhoto.Visibility "friends") (not .UserRelationship.IsFriend)}} + {{else if and (eq .ProfilePhoto.Visibility "circle") (not .UserRelationship.IsInnerCirclePeer)}} + {{else}} {{end}} @@ -28,6 +30,8 @@ {{else if and (eq .ProfilePhoto.Visibility "friends") (not .UserRelationship.IsFriend)}} + {{else if and (eq .ProfilePhoto.Visibility "circle") (not .UserRelationship.IsInnerCirclePeer)}} + {{else}} {{end}} @@ -47,6 +51,8 @@ {{else if and (eq .ProfilePhoto.Visibility "friends") (not .UserRelationship.IsFriend)}} + {{else if and (eq .ProfilePhoto.Visibility "circle") (not .UserRelationship.IsInnerCirclePeer)}} + {{else}} {{end}} @@ -66,6 +72,8 @@ {{else if and (eq .ProfilePhoto.Visibility "friends") (not .UserRelationship.IsFriend)}} + {{else if and (eq .ProfilePhoto.Visibility "circle") (not .UserRelationship.IsInnerCirclePeer)}} + {{else}} {{end}} @@ -85,6 +93,8 @@ {{else if and (eq .ProfilePhoto.Visibility "friends") (not .UserRelationship.IsFriend)}} + {{else if and (eq .ProfilePhoto.Visibility "circle") (not .UserRelationship.IsInnerCirclePeer)}} + {{else}} {{end}} diff --git a/web/templates/photo/gallery.html b/web/templates/photo/gallery.html index 5f4c24b..cff1b83 100644 --- a/web/templates/photo/gallery.html +++ b/web/templates/photo/gallery.html @@ -192,6 +192,27 @@

    {{end}} + + {{if .ProfilePictureHiddenVisibility}} +
    + + Notice: + @{{.User.Username}}'s default profile picture is set to + {{if eq .ProfilePictureHiddenVisibility "friends"}} + + Friends only + {{else if eq .ProfilePictureHiddenVisibility "circle"}} + + Private + {{else}} + + Private + {{end}} + visibility and can not be seen by you. + Learn more +
    + {{end}} + {{if .InnerCircleInviteView}}