f2e847922f
* Profile pictures on profile pages now link to the gallery when clicked. * Admins can no longer automatically see the default profile pic on profile pages unless they have photo moderator ability. * Photo view counts are not added when an admin with photo moderator ability should not have otherwise been able to see the photo.
140 lines
4.4 KiB
Go
140 lines
4.4 KiB
Go
package account
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/config"
|
|
"code.nonshy.com/nonshy/website/pkg/log"
|
|
"code.nonshy.com/nonshy/website/pkg/middleware"
|
|
"code.nonshy.com/nonshy/website/pkg/models"
|
|
"code.nonshy.com/nonshy/website/pkg/session"
|
|
"code.nonshy.com/nonshy/website/pkg/templates"
|
|
"code.nonshy.com/nonshy/website/pkg/worker"
|
|
)
|
|
|
|
// User profile page (/u/username)
|
|
func Profile() http.HandlerFunc {
|
|
tmpl := templates.Must("account/profile.html")
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// Parse the username out of the URL parameters.
|
|
var username = r.PathValue("username")
|
|
|
|
// Find this user.
|
|
user, err := models.FindUser(username)
|
|
if err != nil {
|
|
templates.NotFoundPage(w, r)
|
|
return
|
|
}
|
|
|
|
// Get the current user (if logged in). If not, check for external view.
|
|
currentUser, err := session.CurrentUser(r)
|
|
if err != nil {
|
|
// The viewer is not logged in, bail now with the basic profile page. If this
|
|
// user doesn't allow external viewers, redirect to login page.
|
|
if user.Visibility != models.UserVisibilityExternal {
|
|
session.FlashError(w, r, "You must be signed in to view this page.")
|
|
templates.Redirect(w, "/login?next="+url.QueryEscape(r.URL.String()))
|
|
return
|
|
}
|
|
|
|
vars := map[string]interface{}{
|
|
"User": user,
|
|
}
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// Is the site under a Maintenance Mode restriction?
|
|
if middleware.MaintenanceMode(currentUser, w, r) {
|
|
return
|
|
}
|
|
|
|
// Forcing an external view? (preview of logged-out profile view for visibility=external accounts)
|
|
// You must be logged-in actually to see this.
|
|
if r.FormValue("view") == "external" {
|
|
vars := map[string]interface{}{
|
|
"User": user,
|
|
"IsPrivate": true,
|
|
"IsExternalView": true,
|
|
}
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// Inject relationship booleans for profile picture display.
|
|
models.SetUserRelationships(currentUser, []*models.User{user})
|
|
|
|
// Admin user (photo moderator) can always see the profile pic - but only on this page.
|
|
// Other avatar displays will show the yellow or pink shy.png if the admin is not friends or not granted.
|
|
if currentUser.HasAdminScope(config.ScopePhotoModerator) {
|
|
user.UserRelationship.IsFriend = true
|
|
user.UserRelationship.IsPrivateGranted = true
|
|
}
|
|
|
|
var isSelf = currentUser.ID == user.ID
|
|
|
|
// Give a Not Found page if we can not see this user.
|
|
if err := user.CanBeSeenBy(currentUser); err != nil {
|
|
log.Error("%s can not be seen by viewer %s: %s", user.Username, currentUser.Username, err)
|
|
templates.NotFoundPage(w, r)
|
|
return
|
|
}
|
|
|
|
// Are they friends? And/or is this user private?
|
|
var (
|
|
isFriend = models.FriendStatus(currentUser.ID, user.ID)
|
|
isPrivate = !currentUser.IsAdmin && !isSelf && user.Visibility == models.UserVisibilityPrivate && isFriend != "approved"
|
|
)
|
|
|
|
// Get Likes for this profile.
|
|
likeMap := models.MapLikes(currentUser, "users", []uint64{user.ID})
|
|
|
|
// Get the summary of WHO liked this picture.
|
|
likeExample, likeRemainder, err := models.WhoLikes(currentUser, "users", user.ID)
|
|
if err != nil {
|
|
log.Error("WhoLikes(user %d): %s", user.ID, err)
|
|
}
|
|
|
|
// Chat Moderation Rule: count of rules applied to the user, for admin view.
|
|
var chatModerationRules int
|
|
if currentUser.HasAdminScope(config.ScopeChatModerator) {
|
|
if rules := user.GetProfileField("chat_moderation_rules"); len(rules) > 0 {
|
|
chatModerationRules = len(strings.Split(rules, ","))
|
|
}
|
|
}
|
|
|
|
vars := map[string]interface{}{
|
|
"User": user,
|
|
"LikeMap": likeMap,
|
|
"IsFriend": isFriend,
|
|
"IsPrivate": isPrivate,
|
|
"PhotoCount": models.CountPhotosICanSee(user, currentUser),
|
|
"NoteCount": models.CountNotesAboutUser(currentUser, user),
|
|
"FriendCount": models.CountFriends(user.ID),
|
|
"OnChat": worker.GetChatStatistics().IsOnline(user.Username),
|
|
|
|
// Details on who likes their profile page.
|
|
"LikeExample": likeExample,
|
|
"LikeRemainder": likeRemainder,
|
|
"LikeTableName": "users",
|
|
"LikeTableID": user.ID,
|
|
|
|
// Admin numbers.
|
|
"NumChatModerationRules": chatModerationRules,
|
|
}
|
|
|
|
if err := tmpl.Execute(w, r, vars); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
})
|
|
}
|