diff options
| author | tyropro <[email protected]> | 2026-04-30 13:15:59 +0100 |
|---|---|---|
| committer | tyropro <[email protected]> | 2026-04-30 13:16:16 +0100 |
| commit | b933019e1b5efef72f6c985f3b7bd9eeb36d6512 (patch) | |
| tree | f5db5a5ff7362b6efe97e8356e23180adf0040d6 | |
| parent | 27a2cefe6d8a50814a0548ec939e780590c3feed (diff) | |
feature: added auto state loading
| -rw-r--r-- | .env | 3 | ||||
| -rw-r--r-- | main.go | 29 | ||||
| -rw-r--r-- | state.go | 5 |
3 files changed, 33 insertions, 4 deletions
@@ -1,4 +1,5 @@ # - "dev" - loopback addr, debug gin mode # - "staging" - all interfaces, debug gin mode # - "release" - all interfaces, release gin mode -MODE="dev" # "dev" || "release" || "staging" +MODE=dev # "dev" || "release" || "staging" +AUTO_LOAD_STATE=true @@ -1,6 +1,7 @@ package main import ( + "log" "os" "github.com/gin-gonic/gin" @@ -13,7 +14,7 @@ type errResp struct { } func main() { - staging_mode, release_mode := getEnv() + staging_mode, release_mode, auto_load_state := getEnv() // keep debug gin mode when in dev mode or staging if release_mode { @@ -21,6 +22,27 @@ func main() { } lobby_manager := NewLobbyManager() + + if auto_load_state { + log.Println("Attempting to load state from file.") + lobby_state, err := load_state_from_file() + if err == nil { + // we define this anonymous function so that the + // defer block gets called after we exit the scope + // of this function + func() { + lobby_manager.mu.Lock() + defer lobby_manager.mu.Unlock() + + lobby_manager.Lobbies = lobby_state + }() + + log.Println("Loaded state from file.") + } else { + log.Println("Failed to load state from file. Skipping.") + } + } + ws_manager := NewWsManager() router := setupRouter(lobby_manager, ws_manager) @@ -32,11 +54,12 @@ func main() { } } -func getEnv() (bool, bool) { +func getEnv() (bool, bool, bool) { staging_mode := os.Getenv("MODE") == "staging" release_mode := os.Getenv("MODE") == "release" + auto_load_state := os.Getenv("AUTO_LOAD_STATE") == "true" - return staging_mode, release_mode + return staging_mode, release_mode, auto_load_state } func setupRouter(lobby_manager *LobbyManager, ws_manager *WsManager) *gin.Engine { @@ -10,6 +10,8 @@ import ( "github.com/gin-gonic/gin" ) +// TODO: Add logging statements to file on Read/Write errors + 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 @@ -74,6 +76,9 @@ func load_state_from_file() (map[string]Lobby, error) { var temp_lobby_manager LobbyManager err = json.Unmarshal(file_contents, &temp_lobby_manager) + if err != nil { + return make(map[string]Lobby), err + } lobby_state := temp_lobby_manager.Lobbies |
