diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-09-12 00:25:15 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-09-12 00:25:15 +0300 |
| commit | df6f6cb5ff8957be8f01d58d60857da2c094a3d9 (patch) | |
| tree | 5ec5a8a95633d7fa6cce62654a9bc6fc6204f788 /backend/handlers/home.go | |
| parent | refactor: fix module ver (diff) | |
| download | lphub-df6f6cb5ff8957be8f01d58d60857da2c094a3d9.tar.gz lphub-df6f6cb5ff8957be8f01d58d60857da2c094a3d9.tar.bz2 lphub-df6f6cb5ff8957be8f01d58d60857da2c094a3d9.zip | |
refactor: unofficial rankings implementation
Diffstat (limited to 'backend/handlers/home.go')
| -rw-r--r-- | backend/handlers/home.go | 100 |
1 files changed, 94 insertions, 6 deletions
diff --git a/backend/handlers/home.go b/backend/handlers/home.go index 1734d28..fd7c6c0 100644 --- a/backend/handlers/home.go +++ b/backend/handlers/home.go | |||
| @@ -1,8 +1,11 @@ | |||
| 1 | package handlers | 1 | package handlers |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "encoding/json" | ||
| 5 | "io" | ||
| 4 | "log" | 6 | "log" |
| 5 | "net/http" | 7 | "net/http" |
| 8 | "os" | ||
| 6 | "sort" | 9 | "sort" |
| 7 | "strings" | 10 | "strings" |
| 8 | 11 | ||
| @@ -18,9 +21,26 @@ type SearchResponse struct { | |||
| 18 | } | 21 | } |
| 19 | 22 | ||
| 20 | type RankingsResponse struct { | 23 | type RankingsResponse struct { |
| 21 | Overall []models.UserRanking `json:"rankings_overall"` | ||
| 22 | Singleplayer []models.UserRanking `json:"rankings_singleplayer"` | 24 | Singleplayer []models.UserRanking `json:"rankings_singleplayer"` |
| 23 | Multiplayer []models.UserRanking `json:"rankings_multiplayer"` | 25 | Multiplayer []models.UserRanking `json:"rankings_multiplayer"` |
| 26 | Overall []models.UserRanking `json:"rankings_overall"` | ||
| 27 | } | ||
| 28 | |||
| 29 | type SteamUserRanking struct { | ||
| 30 | UserName string `json:"user_name"` | ||
| 31 | AvatarLink string `json:"avatar_link"` | ||
| 32 | SteamID string `json:"steam_id"` | ||
| 33 | SpScore int `json:"sp_score"` | ||
| 34 | MpScore int `json:"mp_score"` | ||
| 35 | OverallScore int `json:"overall_score"` | ||
| 36 | SpRank int `json:"sp_rank"` | ||
| 37 | MpRank int `json:"mp_rank"` | ||
| 38 | OverallRank int `json:"overall_rank"` | ||
| 39 | } | ||
| 40 | type RankingsSteamResponse struct { | ||
| 41 | Singleplayer []SteamUserRanking `json:"rankings_singleplayer"` | ||
| 42 | Multiplayer []SteamUserRanking `json:"rankings_multiplayer"` | ||
| 43 | Overall []SteamUserRanking `json:"rankings_overall"` | ||
| 24 | } | 44 | } |
| 25 | 45 | ||
| 26 | type MapShortWithGame struct { | 46 | type MapShortWithGame struct { |
| @@ -30,18 +50,18 @@ type MapShortWithGame struct { | |||
| 30 | Map string `json:"map"` | 50 | Map string `json:"map"` |
| 31 | } | 51 | } |
| 32 | 52 | ||
| 33 | // GET Rankings | 53 | // GET Rankings LPHUB |
| 34 | // | 54 | // |
| 35 | // @Description Get rankings of every player. | 55 | // @Description Get rankings of every player from LPHUB. |
| 36 | // @Tags rankings | 56 | // @Tags rankings |
| 37 | // @Produce json | 57 | // @Produce json |
| 38 | // @Success 200 {object} models.Response{data=RankingsResponse} | 58 | // @Success 200 {object} models.Response{data=RankingsResponse} |
| 39 | // @Router /rankings [get] | 59 | // @Router /rankings/lphub [get] |
| 40 | func Rankings(c *gin.Context) { | 60 | func RankingsLPHUB(c *gin.Context) { |
| 41 | response := RankingsResponse{ | 61 | response := RankingsResponse{ |
| 42 | Overall: []models.UserRanking{}, | ||
| 43 | Singleplayer: []models.UserRanking{}, | 62 | Singleplayer: []models.UserRanking{}, |
| 44 | Multiplayer: []models.UserRanking{}, | 63 | Multiplayer: []models.UserRanking{}, |
| 64 | Overall: []models.UserRanking{}, | ||
| 45 | } | 65 | } |
| 46 | // Singleplayer rankings | 66 | // Singleplayer rankings |
| 47 | sql := `SELECT u.steam_id, u.user_name, u.avatar_link, COUNT(DISTINCT map_id), | 67 | sql := `SELECT u.steam_id, u.user_name, u.avatar_link, COUNT(DISTINCT map_id), |
| @@ -171,6 +191,74 @@ func Rankings(c *gin.Context) { | |||
| 171 | }) | 191 | }) |
| 172 | } | 192 | } |
| 173 | 193 | ||
| 194 | // GET Rankings Steam | ||
| 195 | // | ||
| 196 | // @Description Get rankings of every player from Steam. | ||
| 197 | // @Tags rankings | ||
| 198 | // @Produce json | ||
| 199 | // @Success 200 {object} models.Response{data=RankingsSteamResponse} | ||
| 200 | // @Router /rankings/steam [get] | ||
| 201 | func RankingsSteam(c *gin.Context) { | ||
| 202 | response := RankingsSteamResponse{ | ||
| 203 | Singleplayer: []SteamUserRanking{}, | ||
| 204 | Multiplayer: []SteamUserRanking{}, | ||
| 205 | Overall: []SteamUserRanking{}, | ||
| 206 | } | ||
| 207 | spJson, err := os.Open("../rankings/output/sp.json") | ||
| 208 | if err != nil { | ||
| 209 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 210 | return | ||
| 211 | } | ||
| 212 | defer spJson.Close() | ||
| 213 | spJsonBytes, err := io.ReadAll(spJson) | ||
| 214 | if err != nil { | ||
| 215 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 216 | return | ||
| 217 | } | ||
| 218 | err = json.Unmarshal(spJsonBytes, &response.Singleplayer) | ||
| 219 | if err != nil { | ||
| 220 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 221 | return | ||
| 222 | } | ||
| 223 | mpJson, err := os.Open("../rankings/output/mp.json") | ||
| 224 | if err != nil { | ||
| 225 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 226 | return | ||
| 227 | } | ||
| 228 | defer mpJson.Close() | ||
| 229 | mpJsonBytes, err := io.ReadAll(mpJson) | ||
| 230 | if err != nil { | ||
| 231 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 232 | return | ||
| 233 | } | ||
| 234 | err = json.Unmarshal(mpJsonBytes, &response.Multiplayer) | ||
| 235 | if err != nil { | ||
| 236 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 237 | return | ||
| 238 | } | ||
| 239 | overallJson, err := os.Open("../rankings/output/overall.json") | ||
| 240 | if err != nil { | ||
| 241 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 242 | return | ||
| 243 | } | ||
| 244 | defer overallJson.Close() | ||
| 245 | overallJsonBytes, err := io.ReadAll(overallJson) | ||
| 246 | if err != nil { | ||
| 247 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 248 | return | ||
| 249 | } | ||
| 250 | err = json.Unmarshal(overallJsonBytes, &response.Overall) | ||
| 251 | if err != nil { | ||
| 252 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 253 | return | ||
| 254 | } | ||
| 255 | c.JSON(http.StatusOK, models.Response{ | ||
| 256 | Success: true, | ||
| 257 | Message: "Successfully retrieved rankings.", | ||
| 258 | Data: response, | ||
| 259 | }) | ||
| 260 | } | ||
| 261 | |||
| 174 | // GET Search With Query | 262 | // GET Search With Query |
| 175 | // | 263 | // |
| 176 | // @Description Get all user and map data matching to the query. | 264 | // @Description Get all user and map data matching to the query. |