mchess-server/main.go

109 lines
2.7 KiB
Go
Raw Normal View History

2022-10-22 18:01:55 +00:00
package main
import (
"context"
"encoding/json"
"fmt"
2023-06-25 14:11:29 +00:00
"mchess_server/api"
"mchess_server/chess"
lobbies "mchess_server/lobby_registry"
"mchess_server/usher"
2022-11-19 10:41:10 +00:00
"log"
"net/http"
2022-12-18 14:43:27 +00:00
"os"
"sync"
2023-04-18 20:12:05 +00:00
"github.com/gin-gonic/gin"
2023-04-18 20:19:28 +00:00
"github.com/google/uuid"
"nhooyr.io/websocket"
2022-10-22 18:01:55 +00:00
)
var cert_path = "/etc/letsencrypt/live/chess.sw-gross.de/"
var cert_file = cert_path + "fullchain.pem"
var key_file = cert_path + "privkey.pem"
2023-04-18 20:12:05 +00:00
func main() {
2022-12-18 14:43:27 +00:00
hostname, err := os.Hostname()
if err != nil {
2023-04-18 20:12:05 +00:00
log.Fatal(err)
2022-12-18 14:43:27 +00:00
}
2023-04-18 20:12:05 +00:00
router := gin.Default()
2023-04-18 20:47:51 +00:00
router.GET("/api/random", registerForRandomGame)
router.GET("/api/ws", registerWebSocketConnection)
2022-11-19 10:41:10 +00:00
2023-04-18 20:12:05 +00:00
if hostname == "mbook" {
log.Println("Starting service WITHOUT TLS")
log.Fatal(router.Run("localhost:8080"))
} else {
2023-06-06 20:58:33 +00:00
gin.SetMode(gin.ReleaseMode)
log.Println("Starting in release mode")
log.Println("Starting service with TLS")
2023-06-06 21:23:28 +00:00
log.Fatal(router.RunTLS("chess.sw-gross.de:9999", cert_file, key_file))
2022-11-19 10:41:10 +00:00
}
2023-04-18 20:12:05 +00:00
}
2022-11-19 10:41:10 +00:00
var mut sync.Mutex
func registerForRandomGame(c *gin.Context) {
player := chess.NewPlayer(uuid.New())
usher := usher.GetUsher()
mut.Lock()
lobby := usher.WelcomeNewPlayer(player)
usher.AddPlayerToLobbyAndStartGameIfFull(player, lobby)
mut.Unlock()
info := api.PlayerInfo{
PlayerID: player.Uuid,
LobbyID: lobby.Uuid,
}
log.Println("responding with info ", info)
c.Header("Access-Control-Allow-Origin", "*")
c.IndentedJSON(http.StatusOK, info)
2023-04-18 20:12:05 +00:00
}
func registerWebSocketConnection(c *gin.Context) {
2023-06-08 18:20:37 +00:00
webSocketConn, err := websocket.Accept(c.Writer, c.Request, &websocket.AcceptOptions{OriginPatterns: []string{"chess.sw-gross.de", "localhost:*"}})
if err != nil {
log.Println(err)
return
}
2023-06-06 20:58:33 +00:00
go waitForAndHandlePlayerID(c, webSocketConn)
}
2023-04-18 20:12:05 +00:00
2023-06-06 20:58:33 +00:00
func waitForAndHandlePlayerID(ctx context.Context, conn *websocket.Conn) {
msgType, msg, err := conn.Read(ctx)
if err != nil {
errorMessage := fmt.Sprintf("Reading from websocket connection did not work: %s", err)
log.Println(errorMessage)
conn.Close(websocket.StatusCode(400), errorMessage)
return
}
log.Println("read from websocket: ", msgType, string(msg), err)
var info api.PlayerInfo
err = json.Unmarshal(msg, &info)
if err != nil {
errorMessage := fmt.Sprintf("Unmarshaling message did not work: %s", err)
log.Println(errorMessage)
conn.Close(websocket.StatusCode(400), errorMessage)
return
}
2023-04-18 20:12:05 +00:00
lobby := lobbies.GetLobbyRegistry().GetLobbyByUUID(info.LobbyID)
player, found := lobby.GetPlayerByUUID(info.PlayerID)
if !found {
conn.Close(websocket.StatusCode(400), "player not found")
return
}
if player.Conn != nil {
player.Conn.Close(websocket.StatusCode(400), "closing existing connection")
2023-04-18 20:12:05 +00:00
}
player.SetConnection(ctx, conn)
log.Println("player after setting connection: ", player)
}