diff --git a/client/src/components/admin/AdminEditPlayer.vue b/client/src/components/admin/AdminEditPlayer.vue index dce3b0c..2d4e096 100644 --- a/client/src/components/admin/AdminEditPlayer.vue +++ b/client/src/components/admin/AdminEditPlayer.vue @@ -2,19 +2,25 @@
-

ooookay!

- +
- + - + - + + + + + + + +
Name: {{ player.name }}
Score: {{ player.score }}
Authcode: {{ player.authcode }}
 
@@ -24,6 +30,22 @@ @@ -49,5 +71,9 @@ export default { content: 'x'; } } + + &__table { + margin: 64px; + } } diff --git a/client/src/pages/admin.vue b/client/src/pages/admin.vue index 16b8f7c..d083297 100644 --- a/client/src/pages/admin.vue +++ b/client/src/pages/admin.vue @@ -7,7 +7,7 @@
- +
@@ -54,6 +54,10 @@ export default { this.overlay.open = true this.overlay.player = player }, + async editPlayerClose() { + this.overlay.open = false + await this.$engine.fetchGameInfo({ g: this.$store.state.engine.user.game }) + }, }, } @@ -79,7 +83,7 @@ export default { position: absolute; left: 10%; top: 10%; - width: 80%; + width: 800px; } &__player-overlay-close { float: right; diff --git a/client/src/plugins/engine/index.js b/client/src/plugins/engine/index.js index 4e4f896..4360e05 100644 --- a/client/src/plugins/engine/index.js +++ b/client/src/plugins/engine/index.js @@ -5,6 +5,7 @@ import fetchUpdate from './fetchUpdate' import fetchUserInfo from './fetchUserInfo' import fetchGameInfo from './fetchGameInfo' import setGameName from './setGameName' +import savePlayer from './savePlayer' import collectQuotes from './collectQuotes' import startGame from './startGame' import resetGame from './resetGame' @@ -31,6 +32,7 @@ export default (context, inject) => { fetchUserInfo, fetchGameInfo, setGameName, + savePlayer, collectQuotes, getMyQuotes, saveQuote, diff --git a/client/src/plugins/engine/savePlayer.js b/client/src/plugins/engine/savePlayer.js new file mode 100644 index 0000000..f2a4a9e --- /dev/null +++ b/client/src/plugins/engine/savePlayer.js @@ -0,0 +1,11 @@ +export default async function(player) { + const { store } = this.context + + await this.callApi('/api/savePlayer', { + g: store.state.engine.user?.game, + id: player.id, + name: player.name, + score: player.score, + authcode: player.authcode, + }) +} diff --git a/server/src/application/savePlayer.go b/server/src/application/savePlayer.go new file mode 100644 index 0000000..346c41e --- /dev/null +++ b/server/src/application/savePlayer.go @@ -0,0 +1,69 @@ +package application + +import ( + "fmt" + "net/http" + "sirlab.de/go/knyt/game" + "sirlab.de/go/knyt/user" +) + +func (app *Application) SavePlayer(usr *user.User, w http.ResponseWriter, r *http.Request) { + gameRef := r.URL.Query().Get("g") + gm, err := app.GetGameById(gameRef) + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "game not found") + return + } + + if usr.GetGameId() != gameRef || !usr.IsGamemaster() { + w.WriteHeader(http.StatusForbidden) + fmt.Fprintf(w, "forbidden") + return + } + + id := r.URL.Query().Get("id") + name := r.URL.Query().Get("name") + authcode := r.URL.Query().Get("authcode") + if name == "" { + w.WriteHeader(http.StatusBadRequest) + fmt.Printf("player name must not be empty\n") + fmt.Fprintf(w, "server error") + return + } + if id != "" { + if err := app.modifyUser(id, gm, name, authcode); err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Printf("%v\n", err) + fmt.Fprintf(w, "server error") + return + } + } else { + if err := app.createUser(gm, name, authcode); err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Printf("%v\n", err) + fmt.Fprintf(w, "server error") + return + } + } + fmt.Fprintf(w, "ok") +} + +func (app *Application) modifyUser(id string, gm *game.Game, name, authcode string) error { + modifyUser := app.users[id] + if modifyUser.GetId() != id || modifyUser.GetGameId() != gm.GetId() { + return fmt.Errorf("couldn't find player %s in game %s", id, gm.GetId()) + } + modifyUser.SetName(name) + modifyUser.SetAuthcode(authcode) + if err := modifyUser.SaveUser(); err != nil { + return err + } + gm.UpdatePlayer(modifyUser) + return nil +} + +func (app *Application) createUser(gm *game.Game, name, authcode string) error { + return fmt.Errorf("Application.createUser() not yet implemented.") + +} diff --git a/server/src/game/player.go b/server/src/game/player.go index 4bea917..9c66552 100644 --- a/server/src/game/player.go +++ b/server/src/game/player.go @@ -68,3 +68,18 @@ func (gm *Game) AddPlayer(usr *user.User) { score: 0, } } + +func (gm *Game) UpdatePlayer(usr *user.User) { + usrId := usr.GetId() + + gm.mu.Lock() + defer gm.mu.Unlock() + + player := gm.players[usrId] + if player.id != usrId { + return + } + + player.name = usr.GetName() + gm.players[usrId] = player +} diff --git a/server/src/knowyt.go b/server/src/knowyt.go index ed322bf..9dc2179 100644 --- a/server/src/knowyt.go +++ b/server/src/knowyt.go @@ -24,6 +24,7 @@ func main() { mux.PrivateHandleFunc("/api/userinfo", mux.GetUserInfo) mux.PrivateHandleFunc("/api/gameinfo", app.GetGameInfo) mux.PrivateHandleFunc("/api/setGameName", app.SetGameName) + mux.PrivateHandleFunc("/api/savePlayer", app.SavePlayer) mux.PrivateHandleFunc("/api/sync", app.SyncHandler) mux.PrivateHandleFunc("/api/collectQuotes", app.CollectQuotes) mux.PrivateHandleFunc("/api/startGame", app.StartGame) diff --git a/server/src/user/struct.go b/server/src/user/struct.go index 5ef1079..24ac3e2 100644 --- a/server/src/user/struct.go +++ b/server/src/user/struct.go @@ -13,6 +13,7 @@ const ( type User struct { mu sync.Mutex id string + filename string authcode string name string role string diff --git a/server/src/user/user.go b/server/src/user/user.go index 5244a31..5bca22f 100644 --- a/server/src/user/user.go +++ b/server/src/user/user.go @@ -24,6 +24,7 @@ func NewUserFromFile(fileName string) (*User, error) { return &User{ id: id, name: userJson.Name, + filename: fileName, role: userJson.Role, authcode: userJson.Authcode, gameId: userJson.GameId, @@ -31,6 +32,26 @@ func NewUserFromFile(fileName string) (*User, error) { } } +func (usr *User) SaveUser() error { + usr.mu.Lock() + defer usr.mu.Unlock() + + userJson := UserJson{ + Name: usr.name, + Authcode: usr.authcode, + Role: usr.role, + GameId: usr.gameId, + } + if jsonBytes, err := json.Marshal(userJson); err != nil { + return err + } else { + if err := os.WriteFile(usr.filename, jsonBytes, 0666); err != nil { + return err + } + } + return nil +} + func (usr *User) GetId() string { usr.mu.Lock() defer usr.mu.Unlock() @@ -45,6 +66,13 @@ func (usr *User) GetAuthCode() string { return usr.authcode } +func (usr *User) SetAuthcode(authcode string) { + usr.mu.Lock() + defer usr.mu.Unlock() + + usr.authcode = authcode +} + func (usr *User) GetName() string { usr.mu.Lock() defer usr.mu.Unlock() @@ -52,6 +80,13 @@ func (usr *User) GetName() string { return usr.name } +func (usr *User) SetName(name string) { + usr.mu.Lock() + defer usr.mu.Unlock() + + usr.name = name +} + func (usr *User) GetRole() string { usr.mu.Lock() defer usr.mu.Unlock()