diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-10-16 21:13:54 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-10-16 21:13:54 +0300 |
| commit | 92447e02e5fc3977c9cfbca7a8de4132cbb4f13b (patch) | |
| tree | 43a0ecda9c2eaeaf5af39df97ab4ad5083459c2b /backend/handlers | |
| parent | refactor: upload run dialog (diff) | |
| download | lphub-92447e02e5fc3977c9cfbca7a8de4132cbb4f13b.tar.gz lphub-92447e02e5fc3977c9cfbca7a8de4132cbb4f13b.tar.bz2 lphub-92447e02e5fc3977c9cfbca7a8de4132cbb4f13b.zip | |
refactor: upload run logic improvement
Diffstat (limited to 'backend/handlers')
| -rw-r--r-- | backend/handlers/record.go | 94 |
1 files changed, 64 insertions, 30 deletions
diff --git a/backend/handlers/record.go b/backend/handlers/record.go index fea6b5d..2338097 100644 --- a/backend/handlers/record.go +++ b/backend/handlers/record.go | |||
| @@ -24,10 +24,9 @@ import ( | |||
| 24 | ) | 24 | ) |
| 25 | 25 | ||
| 26 | type RecordRequest struct { | 26 | type RecordRequest struct { |
| 27 | HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required" swaggerignore:"true"` | 27 | HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required" swaggerignore:"true"` |
| 28 | PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo" swaggerignore:"true"` | 28 | PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo" swaggerignore:"true"` |
| 29 | IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"` | 29 | PartnerID string `json:"partner_id" form:"partner_id"` |
| 30 | PartnerID string `json:"partner_id" form:"partner_id"` | ||
| 31 | } | 30 | } |
| 32 | 31 | ||
| 33 | type RecordResponse struct { | 32 | type RecordResponse struct { |
| @@ -50,7 +49,12 @@ type RecordResponse struct { | |||
| 50 | // @Success 200 {object} models.Response{data=RecordResponse} | 49 | // @Success 200 {object} models.Response{data=RecordResponse} |
| 51 | // @Router /maps/{mapid}/record [post] | 50 | // @Router /maps/{mapid}/record [post] |
| 52 | func CreateRecordWithDemo(c *gin.Context) { | 51 | func CreateRecordWithDemo(c *gin.Context) { |
| 53 | mapId := c.Param("mapid") | 52 | id := c.Param("mapid") |
| 53 | mapID, err := strconv.Atoi(id) | ||
| 54 | if err != nil { | ||
| 55 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | ||
| 56 | return | ||
| 57 | } | ||
| 54 | // Check if user exists | 58 | // Check if user exists |
| 55 | user, exists := c.Get("user") | 59 | user, exists := c.Get("user") |
| 56 | if !exists { | 60 | if !exists { |
| @@ -62,7 +66,7 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 62 | var isCoop bool | 66 | var isCoop bool |
| 63 | var isDisabled bool | 67 | var isDisabled bool |
| 64 | sql := `SELECT g.name, m.is_disabled FROM maps m INNER JOIN games g ON m.game_id=g.id WHERE m.id = $1` | 68 | sql := `SELECT g.name, m.is_disabled FROM maps m INNER JOIN games g ON m.game_id=g.id WHERE m.id = $1` |
| 65 | err := database.DB.QueryRow(sql, mapId).Scan(&gameName, &isDisabled) | 69 | err = database.DB.QueryRow(sql, mapID).Scan(&gameName, &isDisabled) |
| 66 | if err != nil { | 70 | if err != nil { |
| 67 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 71 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 68 | return | 72 | return |
| @@ -94,8 +98,8 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 94 | var hostDemoUUID, hostDemoFileID, partnerDemoUUID, partnerDemoFileID string | 98 | var hostDemoUUID, hostDemoFileID, partnerDemoUUID, partnerDemoFileID string |
| 95 | var hostDemoScoreCount, hostDemoScoreTime int | 99 | var hostDemoScoreCount, hostDemoScoreTime int |
| 96 | var hostSteamID, partnerSteamID string | 100 | var hostSteamID, partnerSteamID string |
| 97 | client := serviceAccount() | 101 | var hostDemoServerNumber, partnerDemoServerNumber int |
| 98 | srv, err := drive.New(client) | 102 | srv, err := drive.New(serviceAccount()) |
| 99 | if err != nil { | 103 | if err != nil { |
| 100 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 104 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 101 | return | 105 | return |
| @@ -131,13 +135,22 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 131 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 135 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 132 | return | 136 | return |
| 133 | } | 137 | } |
| 134 | hostDemoScoreCount, hostDemoScoreTime, hostSteamID, partnerSteamID, err = parser.ProcessDemo("backend/parser/" + uuid + ".dem") | 138 | parserResult, err := parser.ProcessDemo("backend/parser/" + uuid + ".dem") |
| 135 | if err != nil { | 139 | if err != nil { |
| 136 | deleteFile(srv, file.Id) | 140 | deleteFile(srv, file.Id) |
| 137 | CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionCreateRecordProcessDemoFail, err.Error()) | 141 | CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionCreateRecordProcessDemoFail, err.Error()) |
| 138 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 142 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 139 | return | 143 | return |
| 140 | } | 144 | } |
| 145 | if mapID != parserResult.MapID { | ||
| 146 | deleteFile(srv, file.Id) | ||
| 147 | c.JSON(http.StatusOK, models.ErrorResponse("demo map does not match uploaded map id")) | ||
| 148 | return | ||
| 149 | } | ||
| 150 | hostDemoScoreCount = parserResult.PortalCount | ||
| 151 | hostDemoScoreTime = parserResult.TickCount | ||
| 152 | hostSteamID = parserResult.HostSteamID | ||
| 153 | partnerSteamID = parserResult.PartnerSteamID | ||
| 141 | if hostDemoScoreCount == 0 && hostDemoScoreTime == 0 { | 154 | if hostDemoScoreCount == 0 && hostDemoScoreTime == 0 { |
| 142 | deleteFile(srv, file.Id) | 155 | deleteFile(srv, file.Id) |
| 143 | CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionCreateRecordProcessDemoFail, err.Error()) | 156 | CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionCreateRecordProcessDemoFail, err.Error()) |
| @@ -145,30 +158,32 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 145 | return | 158 | return |
| 146 | } | 159 | } |
| 147 | if !isCoop { | 160 | if !isCoop { |
| 148 | hostSplit := strings.Split(hostSteamID, ":") | 161 | convertedSteamID := strconv.FormatInt(convertSteamID64(hostSteamID), 10) |
| 149 | if hostSplit[len(hostSplit)-1] != user.(models.User).SteamID { | 162 | if convertedSteamID != user.(models.User).SteamID { |
| 150 | c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Host SteamID from demo and request does not match! Check your submission and try again.\nDemo Host SteamID: %s\nRequest Host SteamID: %s", hostSplit[len(hostSplit)-1], user.(models.User).SteamID))) | 163 | deleteFile(srv, file.Id) |
| 164 | c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Host SteamID from demo and request does not match! Check your submission and try again.\nDemo Host SteamID: %s\nRequest Host SteamID: %s", convertedSteamID, user.(models.User).SteamID))) | ||
| 151 | return | 165 | return |
| 152 | } | 166 | } |
| 153 | } else { | 167 | } else { |
| 154 | partnerSplit := strings.Split(partnerSteamID, ":") | 168 | if parserResult.IsHost && i != 0 { |
| 155 | if partnerSplit[len(partnerSplit)-1] != record.PartnerID { | 169 | deleteFile(srv, file.Id) |
| 156 | c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Partner SteamID from demo and request does not match! Check your submission and try again.\nDemo Partner SteamID: %s\nRequest Partner SteamID: %s", partnerSplit[len(partnerSplit)-1], record.PartnerID))) | 170 | c.JSON(http.StatusOK, models.ErrorResponse("Given partner demo is a host demo.")) |
| 157 | return | 171 | return |
| 158 | } | 172 | } |
| 159 | var verifyCoopSteamID string | 173 | if !parserResult.IsHost && i == 0 { |
| 160 | database.DB.QueryRow("SELECT steam_id FROM users WHERE steam_id = $1", record.PartnerID).Scan(&verifyCoopSteamID) | 174 | deleteFile(srv, file.Id) |
| 161 | if verifyCoopSteamID != record.PartnerID { | 175 | c.JSON(http.StatusOK, models.ErrorResponse("Given host demo is a partner demo.")) |
| 162 | c.JSON(http.StatusOK, models.ErrorResponse("Given partner SteamID does not match an account on LPHUB.")) | ||
| 163 | return | 176 | return |
| 164 | } | 177 | } |
| 165 | } | 178 | } |
| 166 | if i == 0 { | 179 | if i == 0 { |
| 167 | hostDemoFileID = file.Id | 180 | hostDemoFileID = file.Id |
| 168 | hostDemoUUID = uuid | 181 | hostDemoUUID = uuid |
| 182 | hostDemoServerNumber = parserResult.ServerNumber | ||
| 169 | } else if i == 1 { | 183 | } else if i == 1 { |
| 170 | partnerDemoFileID = file.Id | 184 | partnerDemoFileID = file.Id |
| 171 | partnerDemoUUID = uuid | 185 | partnerDemoUUID = uuid |
| 186 | partnerDemoServerNumber = parserResult.ServerNumber | ||
| 172 | } | 187 | } |
| 173 | _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) | 188 | _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) |
| 174 | if err != nil { | 189 | if err != nil { |
| @@ -180,18 +195,37 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 180 | } | 195 | } |
| 181 | // Insert into records | 196 | // Insert into records |
| 182 | if isCoop { | 197 | if isCoop { |
| 198 | if hostDemoServerNumber != partnerDemoServerNumber { | ||
| 199 | deleteFile(srv, hostDemoFileID) | ||
| 200 | deleteFile(srv, partnerDemoFileID) | ||
| 201 | c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Host and partner demo server numbers (%d & %d) does not match!", hostDemoServerNumber, partnerDemoServerNumber))) | ||
| 202 | return | ||
| 203 | } | ||
| 204 | convertedHostSteamID := strconv.FormatInt(convertSteamID64(hostSteamID), 10) | ||
| 205 | if convertedHostSteamID != user.(models.User).SteamID && convertedHostSteamID != record.PartnerID { | ||
| 206 | deleteFile(srv, hostDemoFileID) | ||
| 207 | deleteFile(srv, partnerDemoFileID) | ||
| 208 | c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Host SteamID from demo and request does not match! Check your submission and try again.\nDemo Host SteamID: %s\nRequest Host SteamID: %s", convertedHostSteamID, user.(models.User).SteamID))) | ||
| 209 | return | ||
| 210 | } | ||
| 211 | convertedPartnerSteamID := strconv.FormatInt(convertSteamID64(partnerSteamID), 10) | ||
| 212 | if convertedPartnerSteamID != record.PartnerID && convertedPartnerSteamID != user.(models.User).SteamID { | ||
| 213 | deleteFile(srv, hostDemoFileID) | ||
| 214 | deleteFile(srv, partnerDemoFileID) | ||
| 215 | c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Partner SteamID from demo and request does not match! Check your submission and try again.\nDemo Partner SteamID: %s\nRequest Partner SteamID: %s", convertedPartnerSteamID, record.PartnerID))) | ||
| 216 | return | ||
| 217 | } | ||
| 218 | var verifyPartnerSteamID string | ||
| 219 | database.DB.QueryRow("SELECT steam_id FROM users WHERE steam_id = $1", record.PartnerID).Scan(&verifyPartnerSteamID) | ||
| 220 | if verifyPartnerSteamID != record.PartnerID { | ||
| 221 | deleteFile(srv, hostDemoFileID) | ||
| 222 | deleteFile(srv, partnerDemoFileID) | ||
| 223 | c.JSON(http.StatusOK, models.ErrorResponse("Given partner SteamID does not match an account on LPHUB.")) | ||
| 224 | return | ||
| 225 | } | ||
| 183 | sql := `INSERT INTO records_mp(map_id,score_count,score_time,host_id,partner_id,host_demo_id,partner_demo_id) | 226 | sql := `INSERT INTO records_mp(map_id,score_count,score_time,host_id,partner_id,host_demo_id,partner_demo_id) |
| 184 | VALUES($1, $2, $3, $4, $5, $6, $7)` | 227 | VALUES($1, $2, $3, $4, $5, $6, $7)` |
| 185 | var hostID string | 228 | _, err := tx.Exec(sql, mapID, hostDemoScoreCount, hostDemoScoreTime, strconv.FormatInt(convertSteamID64(hostSteamID), 10), strconv.FormatInt(convertSteamID64(partnerSteamID), 10), hostDemoUUID, partnerDemoUUID) |
| 186 | var partnerID string | ||
| 187 | if record.IsPartnerOrange { | ||
| 188 | hostID = user.(models.User).SteamID | ||
| 189 | partnerID = record.PartnerID | ||
| 190 | } else { | ||
| 191 | partnerID = user.(models.User).SteamID | ||
| 192 | hostID = record.PartnerID | ||
| 193 | } | ||
| 194 | _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, hostID, partnerID, hostDemoUUID, partnerDemoUUID) | ||
| 195 | if err != nil { | 229 | if err != nil { |
| 196 | deleteFile(srv, hostDemoFileID) | 230 | deleteFile(srv, hostDemoFileID) |
| 197 | deleteFile(srv, partnerDemoFileID) | 231 | deleteFile(srv, partnerDemoFileID) |
| @@ -202,7 +236,7 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 202 | } else { | 236 | } else { |
| 203 | sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id) | 237 | sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id) |
| 204 | VALUES($1, $2, $3, $4, $5)` | 238 | VALUES($1, $2, $3, $4, $5)` |
| 205 | _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, user.(models.User).SteamID, hostDemoUUID) | 239 | _, err := tx.Exec(sql, mapID, hostDemoScoreCount, hostDemoScoreTime, user.(models.User).SteamID, hostDemoUUID) |
| 206 | if err != nil { | 240 | if err != nil { |
| 207 | deleteFile(srv, hostDemoFileID) | 241 | deleteFile(srv, hostDemoFileID) |
| 208 | CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionCreateRecordInsertRecordFail, err.Error()) | 242 | CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionCreateRecordInsertRecordFail, err.Error()) |