mchess-server/main.go
Marco 6cbd7d37aa Various changes
1. Make lobby a struct containing the players and a mutex used to lock
   itself
2. Wait for websocket connections to be established by both players
   before starting the game.
3. Add methods to write to and read from players
2023-05-30 22:01:20 +02:00

88 lines
1.9 KiB
Go

package main
import (
"context"
"local/m/mchess_server/server"
"log"
"net/http"
"os"
"github.com/gin-gonic/autotls"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"nhooyr.io/websocket"
)
var cert_path = "/etc/letsencrypt/live/chess.sw-gross.de/"
var cert_file = cert_path + "fullchain.pem"
var key_file = cert_path + "privkey.pem"
func main() {
hostname, err := os.Hostname()
if err != nil {
log.Fatal(err)
}
router := gin.Default()
router.GET("/api/random", registerForRandomGame)
router.GET("/api/ws", registerWebSocketConnection)
if hostname == "mbook" {
log.Println("Starting service WITHOUT TLS")
log.Fatal(router.Run("localhost:8080"))
} else {
log.Fatal(autotls.Run(router, "chess.sw-gross.de"))
}
}
func registerForRandomGame(c *gin.Context) {
player := server.NewPlayer(uuid.New())
lobby := server.GetLobby()
lobby.Lock()
server.GetLobby().RegisterPlayer(player)
lobby.Unlock()
log.Println("responding with player id ", player.Uuid)
c.IndentedJSON(http.StatusOK, server.PlayerInfo{
PlayerID: player.Uuid,
})
}
func registerWebSocketConnection(c *gin.Context) {
webSocketConn, err := websocket.Accept(c.Writer, c.Request, nil)
if err != nil {
log.Println(err)
return
}
go waitForAndHandlePlayerID(c, *webSocketConn)
}
func waitForAndHandlePlayerID(ctx context.Context, conn websocket.Conn) {
msgType, id, err := conn.Read(ctx)
log.Println("read from websocket: ", msgType, id, err)
log.Println("id as string", string(id))
uuid, err := uuid.ParseBytes(id)
if err != nil {
log.Println(err)
conn.Close(websocket.StatusCode(400), err.Error())
return
}
lobby := server.GetLobby()
player, found := lobby.GetPlayer(uuid)
if !found {
conn.Close(websocket.StatusCode(400), "player not found")
return
}
if player.Conn != nil {
player.Conn.Close(websocket.StatusCode(400), "closing existing connection")
}
player.SetConnection(ctx, conn)
log.Println("player after setting connection: ", player)
}