From eb946b426753b002f0777dafed737dc58db11b88 Mon Sep 17 00:00:00 2001 From: Marco Date: Sat, 22 Apr 2023 21:41:24 +0200 Subject: [PATCH] Many changes! 1. Use maintained websocket framework 2. Introduce function that allows to register a websocket connection per player --- go.mod | 2 ++ go.sum | 33 ++++++++++++++++++++ main.go | 74 ++++++++++++++------------------------------ server/chess_move.go | 48 +++++----------------------- server/game.go | 39 ++++++++++------------- server/lobby.go | 5 ++- server/player.go | 11 +++++-- 7 files changed, 96 insertions(+), 116 deletions(-) diff --git a/go.mod b/go.mod index 17052a6..2795063 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/gin-gonic/autotls v0.0.5 github.com/gin-gonic/gin v1.9.0 github.com/google/uuid v1.3.0 + nhooyr.io/websocket v1.8.7 ) require ( @@ -17,6 +18,7 @@ require ( github.com/go-playground/validator/v10 v10.11.2 // indirect github.com/goccy/go-json v0.10.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.10.3 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mattn/go-isatty v0.0.17 // indirect diff --git a/go.sum b/go.sum index a8e9861..ea00b05 100644 --- a/go.sum +++ b/go.sum @@ -11,35 +11,58 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/autotls v0.0.5 h1:SXQWwWGDJHujDlthIij1+jxn3m5IPV8I9Za9bcPzMdo= github.com/gin-gonic/autotls v0.0.5/go.mod h1:RK6LjOz47xARPGuceCOz3pQcYruxM0bVB7jb4AsDYeI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= @@ -51,6 +74,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -59,6 +83,8 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= @@ -72,6 +98,7 @@ golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -81,10 +108,12 @@ golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -93,7 +122,11 @@ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/main.go b/main.go index c62d43a..dc4be65 100644 --- a/main.go +++ b/main.go @@ -9,27 +9,13 @@ import ( "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" -// album represents data about a record album. -type album struct { - ID string `json:"id"` - Title string `json:"title"` - Artist string `json:"artist"` - Price float64 `json:"price"` -} - -// albums slice to seed record album data. -var albums = []album{ - {ID: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99}, - {ID: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99}, - {ID: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99}, -} - func main() { hostname, err := os.Hostname() if err != nil { @@ -37,12 +23,9 @@ func main() { } router := gin.Default() - router.GET("/api/albums", getAlbums) - router.GET("/api/albums/:id", getAlbumByID) - router.POST("/api/albums", postAlbums) - router.GET("/api/random", playRandomGame) - http.HandleFunc("/api/ws", server.PlayHandler) + router.GET("/api/random", registerForRandomGame) + router.POST("/api/ws", registerWebSocketConnection) if hostname == "mbook" { log.Println("Starting service WITHOUT TLS") @@ -52,44 +35,35 @@ func main() { } } -func playRandomGame(c *gin.Context) { - player_uuid := uuid.New() - server.GetLobby().RegisterPlayer(server.NewPlayer(player_uuid)) - c.IndentedJSON(http.StatusOK, player_uuid) +func registerForRandomGame(c *gin.Context) { + + player := server.NewPlayer(uuid.New()) + server.GetLobby().RegisterPlayer(player) + + c.IndentedJSON(http.StatusOK, server.PlayerInfo{ + PlayerID: player.Uuid, + }) } -// getAlbums responds with the list of all albums as JSON. -func getAlbums(c *gin.Context) { - c.IndentedJSON(http.StatusOK, albums) -} +func registerWebSocketConnection(c *gin.Context) { + // w http.ResponseWriter, r *http.Request -// postAlbums adds an album from JSON received in the request body. -func postAlbums(c *gin.Context) { - var newAlbum album + var playerInfo server.PlayerInfo - // Call BindJSON to bind the received JSON to - // newAlbum. - if err := c.BindJSON(&newAlbum); err != nil { - return + err := c.BindJSON(&playerInfo) + if err != nil { + log.Printf("BindJSON has an error: (%e)", err) } - // Add the new album to the slice. - albums = append(albums, newAlbum) - c.IndentedJSON(http.StatusCreated, newAlbum) -} + log.Println("playerID:", playerInfo.PlayerID) -// getAlbumByID locates the album whose ID value matches the id -// parameter sent by the client, then returns that album as a response. -func getAlbumByID(c *gin.Context) { - id := c.Param("id") - - // Loop over the list of albums, looking for - // an album whose ID value matches the parameter. - for _, a := range albums { - if a.ID == id { - c.IndentedJSON(http.StatusOK, a) + player, found := server.GetLobby()[playerInfo.PlayerID] + if found { + webSocketConn, err := websocket.Accept(c.Writer, c.Request, nil) + if err != nil { + log.Println(err) return } + player.Conn = *webSocketConn } - c.IndentedJSON(http.StatusNotFound, gin.H{"message": "album not found"}) } diff --git a/server/chess_move.go b/server/chess_move.go index f101523..6a1f5d8 100644 --- a/server/chess_move.go +++ b/server/chess_move.go @@ -1,47 +1,15 @@ package server -import ( - "errors" - "strings" -) - -type chessMove struct { - realMove bool - startSquare chessCoordinate - endSquare chessCoordinate +type Move struct { + StartSquare Coordinate `json:"startSquare"` + EndSquare Coordinate `json:"endSquare"` } -type chessCoordinate struct { - col int - row int +type Coordinate struct { + Col int `json:"col"` + Row int `json:"row"` } -func parseMove(received string) (*chessMove, error) { - var move chessMove - - splitReceived := strings.Split(received, " ") - - if len(splitReceived) != 3 { - return nil, errors.New("invalid move command") - } - - realMoveString := splitReceived[0] - startSquareString := splitReceived[1] - endSquareString := splitReceived[2] - - if strings.Compare(realMoveString, "mv") == 0 { - move.realMove = true - } else if strings.Compare(realMoveString, "pc") == 0 { - move.realMove = false - } else { - return nil, errors.New("NEITHER MV OR PC RECEIVED AS FIRST BYTES") - } - - move.startSquare.col = int(([]rune(startSquareString)[0] - '0')) - move.startSquare.row = int(([]rune(startSquareString)[1] - '0')) - - move.endSquare.col = int(([]rune(endSquareString)[0] - '0')) - move.endSquare.row = int(([]rune(endSquareString)[1] - '0')) - - return &move, nil +func parseMove(received string) (*Move, error) { + return &Move{}, nil } diff --git a/server/game.go b/server/game.go index 2f57c10..ffbd79a 100644 --- a/server/game.go +++ b/server/game.go @@ -31,7 +31,7 @@ func (game *Game) handle() { gameState := PlayerToMove game.currentTurnPlayer = game.players[0] - var move *chessMove + var move *Move var messageType int var receivedMessage []byte @@ -58,28 +58,24 @@ func (game *Game) handle() { case CheckPlayerChange: - if move.realMove { - if game.currentTurnPlayer.uuid == game.players[0].uuid { - game.currentTurnPlayer = game.players[1] - } else { - game.currentTurnPlayer = game.players[0] - } - - err := WriteMessageToPlayer(&game.players[0], receivedMessage, messageType) - if err != nil { - log.Println("Error during message writing:", err) - continue - } - err = WriteMessageToPlayer(&game.players[1], receivedMessage, messageType) - if err != nil { - log.Println("Error during message writing:", err) - continue - } - gameState = PlayerToMove + if game.currentTurnPlayer.Uuid == game.players[0].Uuid { + game.currentTurnPlayer = game.players[1] } else { - // Nothing to do if move was not real + game.currentTurnPlayer = game.players[0] } + err := WriteMessageToPlayer(&game.players[0], receivedMessage, messageType) + if err != nil { + log.Println("Error during message writing:", err) + continue + } + err = WriteMessageToPlayer(&game.players[1], receivedMessage, messageType) + if err != nil { + log.Println("Error during message writing:", err) + continue + } + gameState = PlayerToMove + } log.Println("GameState = ", gameState) @@ -87,11 +83,10 @@ func (game *Game) handle() { log.Println("with player ", game.currentTurnPlayer, " to move") } } - } func (game *Game) addPlayersToGame(players [2]Player) { - log.Printf("Adding players %s and %s to new game", players[0].uuid.String(), players[1].uuid.String()) + log.Printf("Adding players %s and %s to new game", players[0].Uuid.String(), players[1].Uuid.String()) game.players = players } diff --git a/server/lobby.go b/server/lobby.go index 200395c..71363ae 100644 --- a/server/lobby.go +++ b/server/lobby.go @@ -22,7 +22,7 @@ func newLobby() Lobby { } func (lobby Lobby) RegisterPlayer(player *Player) { - lobby[player.uuid] = *player + lobby[player.Uuid] = *player if len(lobby)%2 == 0 { var players [2]Player @@ -36,5 +36,8 @@ func (lobby Lobby) RegisterPlayer(player *Player) { game := NewGame() game.addPlayersToGame(players) + + delete(lobby, players[0].Uuid) + delete(lobby, players[1].Uuid) } } diff --git a/server/player.go b/server/player.go index e576c97..49ac568 100644 --- a/server/player.go +++ b/server/player.go @@ -2,15 +2,20 @@ package server import ( "github.com/google/uuid" + "nhooyr.io/websocket" ) type Player struct { - uuid uuid.UUID - //Websocket connection here + Uuid uuid.UUID + Conn websocket.Conn +} + +type PlayerInfo struct { + PlayerID uuid.UUID `json:"playerID"` } func NewPlayer(uuid uuid.UUID) *Player { return &Player{ - uuid: uuid, + Uuid: uuid, } }