aboutsummaryrefslogtreecommitdiff
path: root/backend/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'backend/handlers')
-rw-r--r--backend/handlers/record.go94
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
26type RecordRequest struct { 26type 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
33type RecordResponse struct { 32type 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]
52func CreateRecordWithDemo(c *gin.Context) { 51func 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())