Improved user lists
This commit is contained in:
parent
4f4a6e7f13
commit
5284698e73
@ -9,10 +9,14 @@ component AvatarNoLink(user *arn.User)
|
|||||||
if user.HasAvatar()
|
if user.HasAvatar()
|
||||||
img.user-image.lazy(data-src=user.SmallAvatar(), data-webp="true", alt=user.Nick)
|
img.user-image.lazy(data-src=user.SmallAvatar(), data-webp="true", alt=user.Nick)
|
||||||
else
|
else
|
||||||
SVGAvatar
|
SVGAvatar(user)
|
||||||
|
|
||||||
component SVGAvatar
|
component SVGAvatar(user *arn.User)
|
||||||
svg.user-image(viewBox="0 0 50 50")
|
svg.user-image(viewBox="0 0 50 50")
|
||||||
circle.head(cx="25", cy="19", r="10")
|
circle.head(cx="25", cy="19", r="10")
|
||||||
circle.body(cx="25", cy="50", r="20")
|
circle.body(cx="25", cy="50", r="20")
|
||||||
//- text(x="25", y="44", text-anchor="middle") TODO
|
|
||||||
|
if len(user.Nick) <= 6
|
||||||
|
text.svg-nick(x="25", y="44", text-anchor="middle")= user.Nick
|
||||||
|
else
|
||||||
|
text.svg-nick(x="25", y="44", text-anchor="middle")= user.Nick[:6]
|
@ -80,7 +80,9 @@ func Configure(app *aero.Application) {
|
|||||||
|
|
||||||
// User lists
|
// User lists
|
||||||
l.Page("/users", users.Active)
|
l.Page("/users", users.Active)
|
||||||
|
l.Page("/users/noavatar", users.ActiveNoAvatar)
|
||||||
l.Page("/users/osu", users.Osu)
|
l.Page("/users/osu", users.Osu)
|
||||||
|
l.Page("/users/overwatch", users.Overwatch)
|
||||||
l.Page("/users/staff", users.Staff)
|
l.Page("/users/staff", users.Staff)
|
||||||
|
|
||||||
// Statistics
|
// Statistics
|
||||||
|
22
pages/users/overwatch.pixy
Normal file
22
pages/users/overwatch.pixy
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
component OverwatchRankingList(users []*arn.User)
|
||||||
|
h1.page-title Overwatch ranking list
|
||||||
|
|
||||||
|
UsersTabs
|
||||||
|
|
||||||
|
table.osu-ranking-list
|
||||||
|
thead
|
||||||
|
tr.mountable
|
||||||
|
th #
|
||||||
|
th Player
|
||||||
|
th Name
|
||||||
|
th.osu-ranking-pp Skill Rating
|
||||||
|
tbody
|
||||||
|
for index, user := range users
|
||||||
|
tr.osu-ranking.mountable
|
||||||
|
td= toString(index + 1) + "."
|
||||||
|
td
|
||||||
|
Avatar(user)
|
||||||
|
td
|
||||||
|
a.ajax(href=user.Link())= user.Nick
|
||||||
|
td.osu-ranking-pp= strconv.Itoa(user.Accounts.Overwatch.SkillRating) + " SR"
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
|||||||
"github.com/aerogo/aero"
|
"github.com/aerogo/aero"
|
||||||
"github.com/animenotifier/arn"
|
"github.com/animenotifier/arn"
|
||||||
"github.com/animenotifier/notify.moe/components"
|
"github.com/animenotifier/notify.moe/components"
|
||||||
|
"github.com/animenotifier/notify.moe/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Active ...
|
// Active ...
|
||||||
@ -21,6 +22,14 @@ func Active(ctx *aero.Context) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sort.Slice(users, func(i, j int) bool {
|
sort.Slice(users, func(i, j int) bool {
|
||||||
|
if users[i].HasAvatar() != users[j].HasAvatar() {
|
||||||
|
if users[i].HasAvatar() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
followersA := followCount[users[i]]
|
followersA := followCount[users[i]]
|
||||||
followersB := followCount[users[j]]
|
followersB := followCount[users[j]]
|
||||||
|
|
||||||
@ -31,7 +40,39 @@ func Active(ctx *aero.Context) string {
|
|||||||
return followersA > followersB
|
return followersA > followersB
|
||||||
})
|
})
|
||||||
|
|
||||||
// arn.SortUsersLastSeen(users)
|
return ctx.HTML(components.Users(users))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ActiveNoAvatar ...
|
||||||
|
func ActiveNoAvatar(ctx *aero.Context) string {
|
||||||
|
users := arn.FilterUsers(func(user *arn.User) bool {
|
||||||
|
return user.IsActive() && !user.HasAvatar()
|
||||||
|
})
|
||||||
|
|
||||||
|
followCount := map[*arn.User]int{}
|
||||||
|
|
||||||
|
for _, user := range users {
|
||||||
|
followCount[user] = user.FollowersCount()
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(users, func(i, j int) bool {
|
||||||
|
if users[i].HasAvatar() != users[j].HasAvatar() {
|
||||||
|
if users[i].HasAvatar() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
followersA := followCount[users[i]]
|
||||||
|
followersB := followCount[users[j]]
|
||||||
|
|
||||||
|
if followersA == followersB {
|
||||||
|
return users[i].Nick < users[j].Nick
|
||||||
|
}
|
||||||
|
|
||||||
|
return followersA > followersB
|
||||||
|
})
|
||||||
|
|
||||||
return ctx.HTML(components.Users(users))
|
return ctx.HTML(components.Users(users))
|
||||||
}
|
}
|
||||||
@ -54,23 +95,74 @@ func Osu(ctx *aero.Context) string {
|
|||||||
return ctx.HTML(components.OsuRankingList(users))
|
return ctx.HTML(components.OsuRankingList(users))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Overwatch ...
|
||||||
|
func Overwatch(ctx *aero.Context) string {
|
||||||
|
users := arn.FilterUsers(func(user *arn.User) bool {
|
||||||
|
return user.IsActive() && user.HasAvatar() && user.Accounts.Overwatch.SkillRating > 0
|
||||||
|
})
|
||||||
|
|
||||||
|
// Sort by Skill Ratings
|
||||||
|
sort.Slice(users, func(i, j int) bool {
|
||||||
|
return users[i].Accounts.Overwatch.SkillRating > users[j].Accounts.Overwatch.SkillRating
|
||||||
|
})
|
||||||
|
|
||||||
|
if len(users) > 50 {
|
||||||
|
users = users[:50]
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.HTML(components.OverwatchRankingList(users))
|
||||||
|
}
|
||||||
|
|
||||||
// Staff ...
|
// Staff ...
|
||||||
func Staff(ctx *aero.Context) string {
|
func Staff(ctx *aero.Context) string {
|
||||||
users := arn.FilterUsers(func(user *arn.User) bool {
|
users := arn.FilterUsers(func(user *arn.User) bool {
|
||||||
return user.IsActive() && user.HasAvatar() && user.Role != ""
|
return user.IsActive() && user.HasAvatar() && user.Role != ""
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Make order deterministic
|
||||||
sort.Slice(users, func(i, j int) bool {
|
sort.Slice(users, func(i, j int) bool {
|
||||||
if users[i].Role == "" {
|
return users[i].Nick < users[j].Nick
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if users[j].Role == "" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return users[i].Role == "admin"
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return ctx.HTML(components.Users(users))
|
admins := &utils.UserList{
|
||||||
|
Name: "Developer",
|
||||||
|
Users: []*arn.User{},
|
||||||
|
}
|
||||||
|
|
||||||
|
contributors := &utils.UserList{
|
||||||
|
Name: "Contributors",
|
||||||
|
Users: []*arn.User{},
|
||||||
|
}
|
||||||
|
|
||||||
|
// contributors.Users = append(contributors.Users, )
|
||||||
|
|
||||||
|
editors := &utils.UserList{
|
||||||
|
Name: "Editors",
|
||||||
|
Users: []*arn.User{},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, user := range users {
|
||||||
|
if user.Role == "admin" {
|
||||||
|
admins.Users = append(admins.Users, user)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if user.ID == "VJOK1ckvx" || user.ID == "SUQOAFFkR" {
|
||||||
|
contributors.Users = append(contributors.Users, user)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if user.Role == "editor" {
|
||||||
|
editors.Users = append(editors.Users, user)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
userLists := []*utils.UserList{
|
||||||
|
admins,
|
||||||
|
contributors,
|
||||||
|
editors,
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.HTML(components.UserLists(userLists))
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,23 @@ component Users(users []*arn.User)
|
|||||||
.mountable
|
.mountable
|
||||||
Avatar(user)
|
Avatar(user)
|
||||||
|
|
||||||
|
component UserLists(groups []*utils.UserList)
|
||||||
|
h1.page-title Users
|
||||||
|
|
||||||
|
UsersTabs
|
||||||
|
|
||||||
|
each group in groups
|
||||||
|
h3.user-list-name.mountable= group.Name
|
||||||
|
|
||||||
|
.user-avatars
|
||||||
|
each user in group.Users
|
||||||
|
.mountable
|
||||||
|
Avatar(user)
|
||||||
|
|
||||||
component UsersTabs
|
component UsersTabs
|
||||||
.tabs
|
.tabs
|
||||||
Tab("Active", "users", "/users")
|
Tab("Active", "users", "/users")
|
||||||
|
Tab("No Avatar", "users", "/users/noavatar")
|
||||||
Tab("Osu", "gamepad", "/users/osu")
|
Tab("Osu", "gamepad", "/users/osu")
|
||||||
|
Tab("Overwatch", "overwatch", "/users/overwatch")
|
||||||
Tab("Staff", "user-secret", "/users/staff")
|
Tab("Staff", "user-secret", "/users/staff")
|
@ -7,4 +7,7 @@
|
|||||||
margin 0.4rem
|
margin 0.4rem
|
||||||
|
|
||||||
.user
|
.user
|
||||||
display flex
|
display flex
|
||||||
|
|
||||||
|
.user-list-name
|
||||||
|
text-align center
|
@ -2,4 +2,8 @@
|
|||||||
fill text-color
|
fill text-color
|
||||||
|
|
||||||
.body
|
.body
|
||||||
fill text-color
|
fill text-color
|
||||||
|
|
||||||
|
.svg-nick
|
||||||
|
fill bg-color
|
||||||
|
font-size 50%
|
20
utils/FilterCapitalLetters.go
Normal file
20
utils/FilterCapitalLetters.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
// import (
|
||||||
|
// "strings"
|
||||||
|
// "unicode"
|
||||||
|
// )
|
||||||
|
|
||||||
|
// // FilterCapitalLetters returns the capital letters of a name.
|
||||||
|
// func FilterCapitalLetters(nick string) string {
|
||||||
|
// return strings.Map(
|
||||||
|
// func(r rune) rune {
|
||||||
|
// if !unicode.IsUpper(r) {
|
||||||
|
// return -1
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return r
|
||||||
|
// },
|
||||||
|
// nick,
|
||||||
|
// )
|
||||||
|
// }
|
9
utils/UserList.go
Normal file
9
utils/UserList.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import "github.com/animenotifier/arn"
|
||||||
|
|
||||||
|
// UserList is a named list of users.
|
||||||
|
type UserList struct {
|
||||||
|
Name string
|
||||||
|
Users []*arn.User
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user