Implement country leaderboards
This commit is contained in:
@@ -166,16 +166,24 @@ func UserWhatsTheIDGET(md common.MethodData) common.CodeMessager {
|
||||
return r
|
||||
}
|
||||
|
||||
var modesToReadable = [...]string{
|
||||
"std",
|
||||
"taiko",
|
||||
"ctb",
|
||||
"mania",
|
||||
}
|
||||
|
||||
type modeData struct {
|
||||
RankedScore uint64 `json:"ranked_score"`
|
||||
TotalScore uint64 `json:"total_score"`
|
||||
PlayCount int `json:"playcount"`
|
||||
ReplaysWatched int `json:"replays_watched"`
|
||||
TotalHits int `json:"total_hits"`
|
||||
Level float64 `json:"level"`
|
||||
Accuracy float64 `json:"accuracy"`
|
||||
PP int `json:"pp"`
|
||||
GlobalLeaderboardRank *int `json:"global_leaderboard_rank"`
|
||||
RankedScore uint64 `json:"ranked_score"`
|
||||
TotalScore uint64 `json:"total_score"`
|
||||
PlayCount int `json:"playcount"`
|
||||
ReplaysWatched int `json:"replays_watched"`
|
||||
TotalHits int `json:"total_hits"`
|
||||
Level float64 `json:"level"`
|
||||
Accuracy float64 `json:"accuracy"`
|
||||
PP int `json:"pp"`
|
||||
GlobalLeaderboardRank *int `json:"global_leaderboard_rank"`
|
||||
CountryLeaderboardRank *int `json:"country_leaderboard_rank"`
|
||||
}
|
||||
type userFullResponse struct {
|
||||
common.ResponseBase
|
||||
@@ -214,33 +222,25 @@ SELECT
|
||||
|
||||
users_stats.ranked_score_std, users_stats.total_score_std, users_stats.playcount_std,
|
||||
users_stats.replays_watched_std, users_stats.total_hits_std,
|
||||
users_stats.avg_accuracy_std, users_stats.pp_std, leaderboard_std.position as std_position,
|
||||
users_stats.avg_accuracy_std, users_stats.pp_std,
|
||||
|
||||
users_stats.ranked_score_taiko, users_stats.total_score_taiko, users_stats.playcount_taiko,
|
||||
users_stats.replays_watched_taiko, users_stats.total_hits_taiko,
|
||||
users_stats.avg_accuracy_taiko, users_stats.pp_taiko, leaderboard_taiko.position as taiko_position,
|
||||
users_stats.avg_accuracy_taiko, users_stats.pp_taiko,
|
||||
|
||||
users_stats.ranked_score_ctb, users_stats.total_score_ctb, users_stats.playcount_ctb,
|
||||
users_stats.replays_watched_ctb, users_stats.total_hits_ctb,
|
||||
users_stats.avg_accuracy_ctb, users_stats.pp_ctb, leaderboard_ctb.position as ctb_position,
|
||||
users_stats.avg_accuracy_ctb, users_stats.pp_ctb,
|
||||
|
||||
users_stats.ranked_score_mania, users_stats.total_score_mania, users_stats.playcount_mania,
|
||||
users_stats.replays_watched_mania, users_stats.total_hits_mania,
|
||||
users_stats.avg_accuracy_mania, users_stats.pp_mania, leaderboard_mania.position as mania_position,
|
||||
users_stats.avg_accuracy_mania, users_stats.pp_mania,
|
||||
|
||||
users.silence_reason, users.silence_end
|
||||
|
||||
FROM users
|
||||
LEFT JOIN users_stats
|
||||
ON users.id=users_stats.id
|
||||
LEFT JOIN leaderboard_std
|
||||
ON users.id=leaderboard_std.user
|
||||
LEFT JOIN leaderboard_taiko
|
||||
ON users.id=leaderboard_taiko.user
|
||||
LEFT JOIN leaderboard_ctb
|
||||
ON users.id=leaderboard_ctb.user
|
||||
LEFT JOIN leaderboard_mania
|
||||
ON users.id=leaderboard_mania.user
|
||||
WHERE ` + whereClause + ` AND ` + md.User.OnlyUserPublic(true) + `
|
||||
LIMIT 1
|
||||
`
|
||||
@@ -261,19 +261,19 @@ LIMIT 1
|
||||
|
||||
&r.STD.RankedScore, &r.STD.TotalScore, &r.STD.PlayCount,
|
||||
&r.STD.ReplaysWatched, &r.STD.TotalHits,
|
||||
&r.STD.Accuracy, &r.STD.PP, &r.STD.GlobalLeaderboardRank,
|
||||
&r.STD.Accuracy, &r.STD.PP,
|
||||
|
||||
&r.Taiko.RankedScore, &r.Taiko.TotalScore, &r.Taiko.PlayCount,
|
||||
&r.Taiko.ReplaysWatched, &r.Taiko.TotalHits,
|
||||
&r.Taiko.Accuracy, &r.Taiko.PP, &r.Taiko.GlobalLeaderboardRank,
|
||||
&r.Taiko.Accuracy, &r.Taiko.PP,
|
||||
|
||||
&r.CTB.RankedScore, &r.CTB.TotalScore, &r.CTB.PlayCount,
|
||||
&r.CTB.ReplaysWatched, &r.CTB.TotalHits,
|
||||
&r.CTB.Accuracy, &r.CTB.PP, &r.CTB.GlobalLeaderboardRank,
|
||||
&r.CTB.Accuracy, &r.CTB.PP,
|
||||
|
||||
&r.Mania.RankedScore, &r.Mania.TotalScore, &r.Mania.PlayCount,
|
||||
&r.Mania.ReplaysWatched, &r.Mania.TotalHits,
|
||||
&r.Mania.Accuracy, &r.Mania.PP, &r.Mania.GlobalLeaderboardRank,
|
||||
&r.Mania.Accuracy, &r.Mania.PP,
|
||||
|
||||
&r.SilenceInfo.Reason, &r.SilenceInfo.End,
|
||||
)
|
||||
@@ -290,8 +290,15 @@ LIMIT 1
|
||||
r.CustomBadge = &b
|
||||
}
|
||||
|
||||
for _, m := range []*modeData{&r.STD, &r.Taiko, &r.CTB, &r.Mania} {
|
||||
for modeID, m := range [...]*modeData{&r.STD, &r.Taiko, &r.CTB, &r.Mania} {
|
||||
m.Level = ocl.GetLevelPrecise(int64(m.TotalScore))
|
||||
|
||||
if i := leaderboardPosition(md.R, modesToReadable[modeID], r.ID); i != 0 {
|
||||
m.GlobalLeaderboardRank = &i
|
||||
}
|
||||
if i := countryPosition(md.R, modesToReadable[modeID], r.ID, r.Country); i != 0 {
|
||||
m.CountryLeaderboardRank = &i
|
||||
}
|
||||
}
|
||||
|
||||
rows, err := md.DB.Query("SELECT b.id, b.name, b.icon FROM user_badges ub "+
|
||||
|
Reference in New Issue
Block a user