@@ -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
1624type 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+
2340type leaderboardResponse struct {
2441 common.ResponseBase
2542 Users []leaderboardUser `json:"users"`
@@ -28,7 +45,7 @@ type leaderboardResponse struct {
2845const 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