@@ -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()