package handler import ( "mchess_server/api" "mchess_server/chess" "mchess_server/lobbies" "mchess_server/utils" "net/http" "sync" "github.com/gin-gonic/gin" "github.com/google/uuid" "go.uber.org/ratelimit" ) var mut sync.Mutex var limiter = ratelimit.New(10) func HostGameHandler(c *gin.Context) { limiter.Take() player := chess.NewPlayer(uuid.New()) u := lobbies.GetUsher() mut.Lock() defer mut.Unlock() lobby := u.CreateNewPrivateLobby(player) u.AddPlayerToLobbyAndStartGameIfFull(player, lobby) passphrase := lobby.Passphrase.String() info := api.PlayerInfo{ PlayerID: &player.Uuid, LobbyID: &lobby.Uuid, Passphrase: &passphrase, } c.Header("Access-Control-Allow-Origin", "*") c.IndentedJSON(http.StatusOK, info) } func GetLobbyForPassphraseHandler(c *gin.Context) { limiter.Take() reqPassphrase := c.Param("phrase") if reqPassphrase == "" { c.IndentedJSON(http.StatusBadRequest, reqPassphrase) return } passPhraseWithSpaces := utils.ConvertToPassphraseWithSpaces(reqPassphrase) lobby := lobbies.GetLobbyRegistry().GetLobbyByPassphrase(passPhraseWithSpaces) if lobby == nil { c.IndentedJSON(http.StatusNotFound, reqPassphrase) return } lobbyInfo := api.LobbyInfo{ ID: &lobby.Uuid, } c.IndentedJSON(http.StatusOK, lobbyInfo) } // TODO: this will be replaced by the JoinGameHandler() func JoinPrivateGame(c *gin.Context) { limiter.Take() req := api.PlayerInfo{} err := c.ShouldBindJSON(&req) if err != nil || req.Passphrase == nil || *req.Passphrase == "" { c.IndentedJSON(http.StatusNotFound, req) } u := lobbies.GetUsher() if req.Passphrase != nil && *req.Passphrase != "" && req.PlayerID != nil && req.LobbyID != nil { //is reconnect lobby := u.FindExistingPrivateLobby(utils.Passphrase(*req.Passphrase)) _, found := lobby.GetPlayerByUUID(*req.PlayerID) if found { c.IndentedJSON( http.StatusOK, api.PlayerInfo{ PlayerID: req.PlayerID, LobbyID: req.LobbyID, Passphrase: req.Passphrase, }) return } else { c.IndentedJSON(http.StatusNotFound, req) } } player := chess.NewPlayer(uuid.New()) mut.Lock() defer mut.Unlock() lobby := u.FindExistingPrivateLobby(utils.Passphrase(*req.Passphrase)) if lobby != nil { u.AddPlayerToLobbyAndStartGameIfFull(player, lobby) } else { c.IndentedJSON(http.StatusNotFound, req) return } info := api.PlayerInfo{ PlayerID: &player.Uuid, LobbyID: &lobby.Uuid, Passphrase: req.Passphrase, } c.Header("Access-Control-Allow-Origin", "*") c.IndentedJSON(http.StatusOK, info) } func JoinGameHandler(c *gin.Context) { limiter.Take() id := c.Param("id") idAsUUID, err := uuid.Parse(id) if err != nil { c.IndentedJSON(http.StatusBadRequest, nil) return } passphrase := api.Passphrase{} c.ShouldBindJSON(&passphrase) u := lobbies.GetUsher() lobby := u.GetLobbyByID(idAsUUID) if lobby == nil { c.IndentedJSON(http.StatusNotFound, nil) return } lobbyInfo := api.LobbyInfo{ ID: &lobby.Uuid, } c.IndentedJSON(http.StatusOK, lobbyInfo) }