From b921f7b7eefc5521b1d7793aff34681f795d22ae Mon Sep 17 00:00:00 2001 From: Settel Date: Sun, 19 Sep 2021 23:31:24 +0200 Subject: [PATCH] save state --- server/.gitignore | 1 + server/Makefile | 2 +- server/src/application/continueGame.go | 4 +++ server/src/application/saveGame.go | 37 ++++++++++++++++++++++++++ server/src/game/getGameState.go | 21 +++++++++++++++ server/src/game/player.go | 2 +- server/src/game/struct.go | 5 ++++ 7 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 server/src/application/saveGame.go create mode 100644 server/src/game/getGameState.go diff --git a/server/.gitignore b/server/.gitignore index 9bd736e..31d9a42 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1 +1,2 @@ knyt +data/games/*/state.json diff --git a/server/Makefile b/server/Makefile index e70c712..2b59296 100644 --- a/server/Makefile +++ b/server/Makefile @@ -21,4 +21,4 @@ _run-endless-loop: while true; do $(MAKE) run || sleep 3; done _run-inotify-restart: - inotifyloop . curl -s http://localhost:32039/__intern__/exit + inotifyloop --exclude 'data/.*' . curl -s http://localhost:32039/__intern__/exit diff --git a/server/src/application/continueGame.go b/server/src/application/continueGame.go index d70cef5..a62d9f5 100644 --- a/server/src/application/continueGame.go +++ b/server/src/application/continueGame.go @@ -22,4 +22,8 @@ func (app *Application) ContinueGame(usr *user.User, w http.ResponseWriter, r *h } gm.ContinueGame() + + if err := app.saveGame(gm); err != nil { + fmt.Println(err) + } } diff --git a/server/src/application/saveGame.go b/server/src/application/saveGame.go new file mode 100644 index 0000000..e1be5be --- /dev/null +++ b/server/src/application/saveGame.go @@ -0,0 +1,37 @@ +package application + +import ( + "encoding/json" + "os" + "path" + "sirlab.de/go/knyt/game" +) + +func (app *Application) saveGame(gm *game.Game) error { + gameJson := gm.GetGameState() + jsonString, errMarshal := json.MarshalIndent(gameJson, "", " ") + if errMarshal != nil { + return errMarshal + } + + dirName := path.Join(app.config.DataDir, "games", gm.GetId()) + f, err := os.CreateTemp(dirName, "state.tmp-*.json") + if err != nil { + return err + } + defer os.Remove(f.Name()) + + if _, err := f.Write(jsonString); err != nil { + return err + } + if err := f.Close(); err != nil { + return err + } + + fileName := path.Join(dirName, "state.json") + if err := os.Rename(f.Name(), fileName); err != nil { + return err + } + + return nil +} diff --git a/server/src/game/getGameState.go b/server/src/game/getGameState.go new file mode 100644 index 0000000..a37a3b4 --- /dev/null +++ b/server/src/game/getGameState.go @@ -0,0 +1,21 @@ +package game + +func (gm *Game) GetGameState() GameStateJson { + gm.mu.Lock() + defer gm.mu.Unlock() + + stateJson := GameStateJson{ + Scores: make(map[string]int, 0), + QuotesPlayed: make([]string, 0), + } + for id, pi := range gm.players { + stateJson.Scores[id] = pi.score + } + for id, quote := range gm.quotes { + if quote.IsPlayed() { + stateJson.QuotesPlayed = append(stateJson.QuotesPlayed, id) + } + } + + return stateJson +} diff --git a/server/src/game/player.go b/server/src/game/player.go index 0035dbe..4bea917 100644 --- a/server/src/game/player.go +++ b/server/src/game/player.go @@ -65,6 +65,6 @@ func (gm *Game) AddPlayer(usr *user.User) { name: usr.GetName(), isPlaying: false, isIdle: true, - score: 7, + score: 0, } } diff --git a/server/src/game/struct.go b/server/src/game/struct.go index bee1e97..110d54e 100644 --- a/server/src/game/struct.go +++ b/server/src/game/struct.go @@ -66,3 +66,8 @@ type Game struct { type GameJson struct { Name string `json:"name"` } + +type GameStateJson struct { + Scores map[string]int `json:"scores"` + QuotesPlayed []string `json:"quotesPlayed"` +}