From 8ccb3babebcffb430693cd92a6eae61d4a7680d7 Mon Sep 17 00:00:00 2001 From: Evan Goode Date: Sat, 22 Mar 2025 17:43:56 -0400 Subject: [PATCH] Fix player faces on admin page --- front.go | 7 ++++--- model.go | 11 ----------- player.go | 11 +++++++++++ user.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ view/admin.tmpl | 6 +++++- view/user.tmpl | 2 +- 6 files changed, 70 insertions(+), 16 deletions(-) diff --git a/front.go b/front.go index 149d6b2..976d6ec 100644 --- a/front.go +++ b/front.go @@ -62,9 +62,10 @@ func NewTemplate(app *App) *Template { } funcMap := template.FuncMap{ - "PlayerSkinURL": app.PlayerSkinURL, - "InviteURL": app.InviteURL, - "IsDefaultAdmin": app.IsDefaultAdmin, + "PrimaryPlayerSkinURL": app.PrimaryPlayerSkinURL, + "PlayerSkinURL": app.PlayerSkinURL, + "InviteURL": app.InviteURL, + "IsDefaultAdmin": app.IsDefaultAdmin, } for _, name := range names { diff --git a/model.go b/model.go index 79caa2e..6f2d02a 100644 --- a/model.go +++ b/model.go @@ -291,17 +291,6 @@ func (app *App) InviteURL(invite *Invite) (string, error) { return url + "?invite=" + invite.Code, nil } -func (app *App) PlayerSkinURL(player *Player) (*string, error) { - if !player.SkinHash.Valid { - return nil, nil - } - url, err := app.SkinURL(player.SkinHash.String) - if err != nil { - return nil, err - } - return &url, nil -} - func (app *App) CapeURL(hash string) (string, error) { return url.JoinPath(app.FrontEndURL, "web/texture/cape/"+hash+".png") } diff --git a/player.go b/player.go index f4806fc..a6827d4 100644 --- a/player.go +++ b/player.go @@ -602,3 +602,14 @@ func (app *App) DeletePlayer(caller *User, player *Player) error { return nil } + +func (app *App) PlayerSkinURL(player *Player) (*string, error) { + if !player.SkinHash.Valid { + return nil, nil + } + url, err := app.SkinURL(player.SkinHash.String) + if err != nil { + return nil, err + } + return &url, nil +} diff --git a/user.go b/user.go index 4f1351e..2dac108 100644 --- a/user.go +++ b/user.go @@ -7,11 +7,13 @@ import ( "errors" "fmt" "github.com/google/uuid" + "github.com/samber/mo" "github.com/zitadel/oidc/v3/pkg/client/rp" "github.com/zitadel/oidc/v3/pkg/oidc" "gorm.io/gorm" "io" "net/http" + "slices" "time" ) @@ -674,3 +676,50 @@ func (app *App) DeleteOIDCIdentity( return nil }) } + +func (app *App) PrimaryPlayerSkinURL(user *User) (*string, error) { + if len(user.Players) == 0 { + return nil, nil + } + + player := (func() mo.Option[*Player] { + if len(user.Players) == 0 { + return mo.None[*Player]() + } + + for _, player := range user.Players { + if player.Name == user.Username { + if player.SkinHash.Valid { + return mo.Some(&player) + } + break + } + } + + playersDecreasingAge := make([]*Player, 0, len(user.Players)) + for i := range user.Players { + playersDecreasingAge = append(playersDecreasingAge, &user.Players[i]) + } + slices.SortFunc(playersDecreasingAge, func(a *Player, b *Player) int { + return a.CreatedAt.Compare(b.CreatedAt) + }) + + for _, player := range playersDecreasingAge { + if player.SkinHash.Valid { + return mo.Some(player) + } + } + + return mo.None[*Player]() + })() + + if p, ok := player.Get(); ok { + skinURL, err := app.SkinURL(p.SkinHash.String) + if err != nil { + return nil, err + } + return &skinURL, nil + } + + return nil, nil +} diff --git a/view/admin.tmpl b/view/admin.tmpl index a1c2bb9..1ad76f1 100644 --- a/view/admin.tmpl +++ b/view/admin.tmpl @@ -103,7 +103,11 @@
diff --git a/view/user.tmpl b/view/user.tmpl index 37aea2b..708e45d 100644 --- a/view/user.tmpl +++ b/view/user.tmpl @@ -55,7 +55,7 @@ class="list-profile-picture" {{ with $playerSkinURL := PlayerSkinURL $player }} {{ if $playerSkinURL }} - style="background-image: url({{ PlayerSkinURL $player }});" + style="background-image: url({{ $playerSkinURL }});" {{ end }} {{ end }} >