Skip to content

Commit 2a5bc26

Browse files
cmyuiJosh
andauthored
Custom title choice (#85)
* Changes to /users/self/settings * Add to regular user APIs * ordered titles * done * i actually don't hate this * whitesp[ace * try prod * if it works lmao * fix * fixes? * vibecoding too hard * yes * clan fix * lol * one war crime down * clean dupe up * strange * perhaps * [0] * happy * slog fix * fix * ah yes * asda * rm cmt --------- Co-authored-by: Josh <joshua.smith@super.com>
1 parent fb7f1d8 commit 2a5bc26

4 files changed

Lines changed: 414 additions & 33 deletions

File tree

app/v1/clan.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -604,13 +604,45 @@ func ClanMembersGET(md common.MethodData) common.CodeMessager {
604604
}
605605
defer rows.Close()
606606
for rows.Next() {
607-
a := userData{}
607+
userDB := userDataDB{}
608608

609-
err = rows.Scan(&a.ID, &a.Username, &a.RegisteredOn, &a.Privileges, &a.LatestActivity, &a.UsernameAKA, &a.Country)
609+
err = rows.Scan(&userDB.ID, &userDB.Username, &userDB.RegisteredOn, &userDB.Privileges, &userDB.LatestActivity, &userDB.UsernameAKA, &userDB.Country, &userDB.UserTitle)
610610
if err != nil {
611611
md.Err(err)
612612
return Err500
613613
}
614+
615+
var eligibleTitles []eligibleTitle
616+
eligibleTitles, err = getEligibleTitles(md, userDB.Privileges)
617+
if err != nil {
618+
md.Err(err)
619+
return Err500
620+
}
621+
622+
// Convert to API response format
623+
a := userData{
624+
ID: userDB.ID,
625+
Username: userDB.Username,
626+
UsernameAKA: userDB.UsernameAKA,
627+
RegisteredOn: userDB.RegisteredOn,
628+
Privileges: userDB.Privileges,
629+
LatestActivity: userDB.LatestActivity,
630+
Country: userDB.Country,
631+
}
632+
633+
// Handle user title conversion
634+
if userDB.UserTitle.Valid && userDB.UserTitle.String != "" {
635+
a.UserTitle = userTitleResponse{
636+
ID: userDB.UserTitle.String,
637+
Title: getUserTitleFromID(userDB.UserTitle.String),
638+
}
639+
} else if len(eligibleTitles) > 0 {
640+
a.UserTitle = userTitleResponse{
641+
ID: eligibleTitles[0].ID,
642+
Title: eligibleTitles[0].Title,
643+
}
644+
}
645+
614646
cmd.Members = append(cmd.Members, a)
615647
}
616648
res := struct {

app/v1/leaderboard.go

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,30 @@ import (
1313
"zxq.co/ripple/ocl"
1414
)
1515

16+
// leaderboardUserDB is used for scanning from database
17+
type leaderboardUserDB struct {
18+
userDataDB
19+
PlayStyle int `db:"play_style"`
20+
FavouriteMode int `db:"favourite_mode"`
21+
}
22+
23+
// leaderboardUser is used for API responses
1624
type leaderboardUser struct {
1725
userData
1826
ChosenMode modeData `json:"chosen_mode"`
1927
PlayStyle int `json:"play_style"`
2028
FavouriteMode int `json:"favourite_mode"`
2129
}
2230

31+
// toLeaderboardUser converts leaderboardUserDB to leaderboardUser
32+
func (lub *leaderboardUserDB) toLeaderboardUser(eligibleTitles []eligibleTitle) leaderboardUser {
33+
return leaderboardUser{
34+
userData: lub.userDataDB.toUserData(eligibleTitles),
35+
PlayStyle: lub.PlayStyle,
36+
FavouriteMode: lub.FavouriteMode,
37+
}
38+
}
39+
2340
type leaderboardResponse struct {
2441
common.ResponseBase
2542
Users []leaderboardUser `json:"users"`
@@ -28,7 +45,7 @@ type leaderboardResponse struct {
2845
const lbUserQuery = `
2946
SELECT
3047
users.id, users.username, users.register_datetime, users.privileges, users.latest_activity,
31-
users.username_aka, users.country, users.play_style, users.favourite_mode,
48+
users.username_aka, users.country, users.user_title, users.play_style, users.favourite_mode,
3249
3350
user_stats.ranked_score, user_stats.total_score, user_stats.playcount,
3451
user_stats.replays_watched, user_stats.total_hits,
@@ -37,7 +54,7 @@ const lbUserQuery = `
3754
INNER JOIN user_stats ON user_stats.user_id = users.id `
3855

3956
// previously done horrible hardcoding makes this the spaghetti it is
40-
func getLbUsersDb(p int, l int, rx int, modeInt int, sort string, md *common.MethodData) []leaderboardUser {
57+
func getLbUsersDb(p int, l int, rx int, modeInt int, sort string, md common.MethodData) []leaderboardUser {
4158
var query, order string
4259
if sort == "score" {
4360
order = "ORDER BY user_stats.ranked_score DESC, user_stats.pp DESC"
@@ -53,21 +70,36 @@ func getLbUsersDb(p int, l int, rx int, modeInt int, sort string, md *common.Met
5370
defer rows.Close()
5471
var users []leaderboardUser
5572
for i := 1; rows.Next(); i++ {
56-
u := leaderboardUser{}
73+
userDB := leaderboardUserDB{}
74+
var chosenMode modeData
75+
5776
err := rows.Scan(
58-
&u.ID, &u.Username, &u.RegisteredOn, &u.Privileges, &u.LatestActivity,
77+
&userDB.ID, &userDB.Username, &userDB.RegisteredOn, &userDB.Privileges, &userDB.LatestActivity,
5978

60-
&u.UsernameAKA, &u.Country, &u.PlayStyle, &u.FavouriteMode,
79+
&userDB.UsernameAKA, &userDB.Country, &userDB.UserTitle, &userDB.PlayStyle, &userDB.FavouriteMode,
6180

62-
&u.ChosenMode.RankedScore, &u.ChosenMode.TotalScore, &u.ChosenMode.PlayCount,
63-
&u.ChosenMode.ReplaysWatched, &u.ChosenMode.TotalHits,
64-
&u.ChosenMode.Accuracy, &u.ChosenMode.PP,
81+
&chosenMode.RankedScore, &chosenMode.TotalScore, &chosenMode.PlayCount,
82+
&chosenMode.ReplaysWatched, &chosenMode.TotalHits,
83+
&chosenMode.Accuracy, &chosenMode.PP,
6584
)
6685
if err != nil {
6786
md.Err(err)
6887
continue
6988
}
70-
u.ChosenMode.Level = ocl.GetLevelPrecise(int64(u.ChosenMode.TotalScore))
89+
90+
chosenMode.Level = ocl.GetLevelPrecise(int64(chosenMode.TotalScore))
91+
92+
var eligibleTitles []eligibleTitle
93+
eligibleTitles, err = getEligibleTitles(md, userDB.Privileges)
94+
if err != nil {
95+
md.Err(err)
96+
return make([]leaderboardUser, 0)
97+
}
98+
99+
// Convert to API response format
100+
u := userDB.toLeaderboardUser(eligibleTitles)
101+
u.ChosenMode = chosenMode
102+
71103
users = append(users, u)
72104
}
73105
return users
@@ -91,7 +123,7 @@ func LeaderboardGET(md common.MethodData) common.CodeMessager {
91123
}
92124

93125
if sort != "pp" {
94-
resp := leaderboardResponse{Users: getLbUsersDb(p, l, rx, modeInt, sort, &md)}
126+
resp := leaderboardResponse{Users: getLbUsersDb(p, l, rx, modeInt, sort, md)}
95127
resp.Code = 200
96128
return resp
97129
}
@@ -126,21 +158,35 @@ func LeaderboardGET(md common.MethodData) common.CodeMessager {
126158
}
127159
defer rows.Close()
128160
for rows.Next() {
129-
var u leaderboardUser
161+
userDB := leaderboardUserDB{}
162+
var chosenMode modeData
163+
130164
err := rows.Scan(
131-
&u.ID, &u.Username, &u.RegisteredOn, &u.Privileges, &u.LatestActivity,
165+
&userDB.ID, &userDB.Username, &userDB.RegisteredOn, &userDB.Privileges, &userDB.LatestActivity,
132166

133-
&u.UsernameAKA, &u.Country, &u.PlayStyle, &u.FavouriteMode,
167+
&userDB.UsernameAKA, &userDB.Country, &userDB.UserTitle, &userDB.PlayStyle, &userDB.FavouriteMode,
134168

135-
&u.ChosenMode.RankedScore, &u.ChosenMode.TotalScore, &u.ChosenMode.PlayCount,
136-
&u.ChosenMode.ReplaysWatched, &u.ChosenMode.TotalHits,
137-
&u.ChosenMode.Accuracy, &u.ChosenMode.PP,
169+
&chosenMode.RankedScore, &chosenMode.TotalScore, &chosenMode.PlayCount,
170+
&chosenMode.ReplaysWatched, &chosenMode.TotalHits,
171+
&chosenMode.Accuracy, &chosenMode.PP,
138172
)
139173
if err != nil {
140174
md.Err(err)
141175
continue
142176
}
143-
u.ChosenMode.Level = ocl.GetLevelPrecise(int64(u.ChosenMode.TotalScore))
177+
178+
chosenMode.Level = ocl.GetLevelPrecise(int64(chosenMode.TotalScore))
179+
180+
var eligibleTitles []eligibleTitle
181+
eligibleTitles, err = getEligibleTitles(md, userDB.Privileges)
182+
if err != nil {
183+
md.Err(err)
184+
return Err500
185+
}
186+
187+
// Convert to API response format
188+
u := userDB.toLeaderboardUser(eligibleTitles)
189+
u.ChosenMode = chosenMode
144190
if rx == 1 {
145191
if i := relaxboardPosition(md.R, m, u.ID); i != nil {
146192
u.ChosenMode.GlobalLeaderboardRank = i

0 commit comments

Comments
 (0)