aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortyropro <[email protected]>2026-04-30 13:00:32 +0100
committertyropro <[email protected]>2026-04-30 13:00:58 +0100
commit27a2cefe6d8a50814a0548ec939e780590c3feed (patch)
treecb782c7ae549fe705f9a1535f4a71eb457cd28f3
parent9ed564c24c3fda3d917979535aab2ea6ca67fab1 (diff)
feature: added state loading from file
-rw-r--r--main.go41
-rw-r--r--state.go93
-rw-r--r--status/status.go3
3 files changed, 98 insertions, 39 deletions
diff --git a/main.go b/main.go
index b081962..2cfc728 100644
--- a/main.go
+++ b/main.go
@@ -1,11 +1,7 @@
package main
import (
- "cluedo-backend/status"
- "encoding/json"
- "net/http"
"os"
- "path/filepath"
"github.com/gin-gonic/gin"
@@ -47,7 +43,8 @@ func setupRouter(lobby_manager *LobbyManager, ws_manager *WsManager) *gin.Engine
router := gin.Default()
// server endpoints
- router.POST("/state/save", save_state(lobby_manager))
+ router.POST("/state/save", save_state_endpoint(lobby_manager))
+ router.POST("/state/load", load_state_endpoint(lobby_manager))
// lobby endpoints
router.GET("/lobbies", get_lobbies(lobby_manager))
@@ -84,37 +81,3 @@ func NewErrResp(msg string) errResp {
Msg: msg,
}
}
-
-func save_state(lobby_manager *LobbyManager) gin.HandlerFunc {
- return func(c *gin.Context) {
- // TODO: Specify these error response to more accurately pinpoint the error
-
- lobby_manager.mu.Lock()
- defer lobby_manager.mu.Unlock()
-
- // marshall state to json
- state_json, err := json.Marshal(lobby_manager)
- if err != nil {
- c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed))
- return
- }
-
- // get the current working directory
- dir, err := os.Getwd()
- if err != nil {
- c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed))
- return
- }
-
- state_file_path := filepath.Join(dir, "state.json")
-
- // write state to file
- err = os.WriteFile(state_file_path, state_json, 0644)
- if err != nil {
- c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed))
- return
- }
-
- c.Status(http.StatusOK)
- }
-}
diff --git a/state.go b/state.go
new file mode 100644
index 0000000..f4ba8e4
--- /dev/null
+++ b/state.go
@@ -0,0 +1,93 @@
+package main
+
+import (
+ "cluedo-backend/status"
+ "encoding/json"
+ "net/http"
+ "os"
+ "path/filepath"
+
+ "github.com/gin-gonic/gin"
+)
+
+func save_state_endpoint(lobby_manager *LobbyManager) gin.HandlerFunc {
+ return func(c *gin.Context) {
+ // TODO: Specify these error response to more accurately pinpoint the error
+
+ lobby_manager.mu.Lock()
+ defer lobby_manager.mu.Unlock()
+
+ // marshall state to json
+ state_json, err := json.Marshal(lobby_manager)
+ if err != nil {
+ c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed))
+ return
+ }
+
+ // get the current working directory
+ dir, err := os.Getwd()
+ if err != nil {
+ c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed))
+ return
+ }
+
+ state_file_path := filepath.Join(dir, "state.json")
+
+ // write state to file
+ err = os.WriteFile(state_file_path, state_json, 0644)
+ if err != nil {
+ c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed))
+ return
+ }
+
+ c.Status(http.StatusOK)
+ }
+}
+
+func load_state_endpoint(lobby_manager *LobbyManager) gin.HandlerFunc {
+ return func(c *gin.Context) {
+ lobby_manager.mu.Lock()
+ defer lobby_manager.mu.Unlock()
+
+ lobby_state, err := load_state_from_file()
+ if err != nil {
+ c.IndentedJSON(status.GenerateErrorResponse(status.LoadFailed))
+ }
+
+ lobby_manager.Lobbies = lobby_state
+
+ c.Status(http.StatusOK)
+ }
+}
+
+func load_state_from_file() (map[string]Lobby, error) {
+ state_file_path, err := get_state_file_path()
+ if err != nil {
+ return make(map[string]Lobby), err
+ }
+
+ file_contents, err := os.ReadFile(state_file_path)
+ if err != nil {
+ return make(map[string]Lobby), err
+ }
+
+ var temp_lobby_manager LobbyManager
+
+ err = json.Unmarshal(file_contents, &temp_lobby_manager)
+
+ lobby_state := temp_lobby_manager.Lobbies
+
+ return lobby_state, nil
+}
+
+func get_state_file_path() (string, error) {
+ // get the current working directory
+ dir, err := os.Getwd()
+ if err != nil {
+ return "", err
+ }
+
+ state_file_path := filepath.Join(dir, "state.json")
+
+ return state_file_path, nil
+}
diff --git a/status/status.go b/status/status.go
index 2acda38..b15ff53 100644
--- a/status/status.go
+++ b/status/status.go
@@ -23,6 +23,7 @@ const (
LobbyTooSmall ErrorStatus = "lobby_too_small"
SaveFailed ErrorStatus = "save_failed"
+ LoadFailed ErrorStatus = "load_failed"
)
type ErrorResponse struct {
@@ -69,6 +70,8 @@ func getHttpStatusCode(error_status ErrorStatus) int {
case SaveFailed:
status_code = http.StatusInternalServerError
+ case LoadFailed:
+ status_code = http.StatusInternalServerError
}
return status_code