diff --git a/server/src/handlers/handlers.go b/server/src/handlers/handlers.go index f08ecaf..0cd796b 100644 --- a/server/src/handlers/handlers.go +++ b/server/src/handlers/handlers.go @@ -18,6 +18,7 @@ func SyncHandler(c *gin.Context) { c.String(http.StatusBadRequest, "Unknown Request") return } + t := c.Params.ByName("token") m, err := Matches.GetMatchByToken(t) if err != nil { @@ -25,22 +26,46 @@ func SyncHandler(c *gin.Context) { c.String(http.StatusNotFound, "NotFound") return } - full, err := m.GetFullFrame(m.Fragment) - delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay) - if err != nil { - log.Printf("ERR : %v\n", err) - c.String(http.StatusNotFound, "NotFound") - return + if c.Query("fragment") != "" { + frag, err := strconv.Atoi(c.Query("fragment")) + if err != nil { + c.String(http.StatusBadRequest, "fragment should be int") + return + } + full, err := m.GetFullFrame(m.Fragment) + specifiedfull, err := m.GetFullFrame(uint32(frag)) + if err != nil { + log.Printf("ERR : %v\n", err) + c.String(http.StatusNotFound, "NotFound") + return + } + c.JSON(http.StatusOK, gin.H{ + "tick": specifiedfull.Tick, + "rtdelay": time.Since(specifiedfull.At).Seconds(), + "rcvage": time.Since(full.At).Seconds(), + "fragment": frag, + "signup_fragment": m.SignupFragment, + "tps": m.Tps, + "protocol": m.Protocol, + }) + } else { + full, err := m.GetFullFrame(m.Fragment) + delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay) + if err != nil { + log.Printf("ERR : %v\n", err) + c.String(http.StatusNotFound, "NotFound") + return + } + c.JSON(http.StatusOK, gin.H{ + "tick": full.Tick, + "rtdelay": time.Since(delayedfull.At).Seconds(), + "rcvage": time.Since(full.At).Seconds(), + "fragment": m.Fragment - Matches.Delay, + "signup_fragment": m.SignupFragment, + "tps": m.Tps, + "protocol": m.Protocol, + }) } - c.JSON(http.StatusOK, gin.H{ - "tick": full.Tick, - "rtdelay": time.Since(delayedfull.At).Seconds(), - "rcvage": time.Since(full.At).Seconds(), - "fragment": m.Fragment - Matches.Delay, - "signup_fragment": m.SignupFragment, - "tps": m.Tps, - "protocol": m.Protocol, - }) } // SyncByIDHandler handlers request against /match/:token/sync by ID @@ -56,22 +81,46 @@ func SyncByIDHandler(c *gin.Context) { c.String(http.StatusNotFound, "NotFound") return } - full, err := m.GetFullFrame(m.Fragment) - delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay) - if err != nil { - log.Printf("ERR : %v\n", err) - c.String(http.StatusNotFound, "NotFound") - return + if c.Query("fragment") != "" { + frag, err := strconv.Atoi(c.Query("fragment")) + if err != nil { + c.String(http.StatusBadRequest, "fragment should be int") + return + } + full, err := m.GetFullFrame(m.Fragment) + specifiedfull, err := m.GetFullFrame(uint32(frag)) + if err != nil { + log.Printf("ERR : %v\n", err) + c.String(http.StatusNotFound, "NotFound") + return + } + c.JSON(http.StatusOK, gin.H{ + "tick": specifiedfull.Tick, + "rtdelay": time.Since(specifiedfull.At).Seconds(), + "rcvage": time.Since(full.At).Seconds(), + "fragment": frag, + "signup_fragment": m.SignupFragment, + "tps": m.Tps, + "protocol": m.Protocol, + }) + } else { + full, err := m.GetFullFrame(m.Fragment) + delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay) + if err != nil { + log.Printf("ERR : %v\n", err) + c.String(http.StatusNotFound, "NotFound") + return + } + c.JSON(http.StatusOK, gin.H{ + "tick": full.Tick, + "rtdelay": time.Since(delayedfull.At).Seconds(), + "rcvage": time.Since(full.At).Seconds(), + "fragment": m.Fragment - Matches.Delay, + "signup_fragment": m.SignupFragment, + "tps": m.Tps, + "protocol": m.Protocol, + }) } - c.JSON(http.StatusOK, gin.H{ - "tick": full.Tick, - "rtdelay": time.Since(delayedfull.At).Seconds(), - "rcvage": time.Since(full.At).Seconds(), - "fragment": m.Fragment - Matches.Delay, - "signup_fragment": m.SignupFragment, - "tps": m.Tps, - "protocol": m.Protocol, - }) } // GetBodyHandler handles fragment request from CS:GO client