feat: set game language
This commit is contained in:
parent
6f1d276523
commit
c624f71b7f
@ -6,6 +6,17 @@
|
|||||||
<td>{{ gameinfo.name }}</td>
|
<td>{{ gameinfo.name }}</td>
|
||||||
<td><div class="admin-tile-gameinfo__edit-game-name" @click="editName()"></div></td>
|
<td><div class="admin-tile-gameinfo__edit-game-name" @click="editName()"></div></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Sprache:</td>
|
||||||
|
<td v-if="!editLangShowDropdown">{{ gameinfo.lang }}</td>
|
||||||
|
<td v-if="editLangShowDropdown">
|
||||||
|
<select v-model="lang" @change="editLangChange">
|
||||||
|
<option value="de">de</option>
|
||||||
|
<option value="en">en</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td><div class="admin-tile-gameinfo__edit-game-lang" @click="editLang()"></div></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Erstellt:</td>
|
<td>Erstellt:</td>
|
||||||
<td colspan="2">{{ $formatter.date(gameinfo.created) }}</td>
|
<td colspan="2">{{ $formatter.date(gameinfo.created) }}</td>
|
||||||
@ -36,6 +47,8 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showId: false,
|
showId: false,
|
||||||
|
lang: '---',
|
||||||
|
editLangShowDropdown: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -47,13 +60,23 @@ export default {
|
|||||||
await this.$engine.fetchGameInfo({ g })
|
await this.$engine.fetchGameInfo({ g })
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
editLang() {
|
||||||
|
this.editLangShowDropdown = true
|
||||||
|
},
|
||||||
|
async editLangChange() {
|
||||||
|
this.editLangShowDropdown = false
|
||||||
|
const g = this.$store.state.engine.user.game
|
||||||
|
await this.$engine.setGameLang({ g, lang: this.lang })
|
||||||
|
await this.$engine.fetchGameInfo({ g })
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.admin-tile-gameinfo {
|
.admin-tile-gameinfo {
|
||||||
&__edit-game-name {
|
&__edit-game-name,
|
||||||
|
&__edit-game-lang {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #a0a0a0;
|
color: #a0a0a0;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
<table class="admin-tile-games__table">
|
<table class="admin-tile-games__table">
|
||||||
<tr>
|
<tr>
|
||||||
<th class="admin-tile-games__table-head">Game name</th>
|
<th class="admin-tile-games__table-head">Game name</th>
|
||||||
|
<th class="admin-tile-games__table-head">Lang</th>
|
||||||
<th class="admin-tile-games__table-head">Status</th>
|
<th class="admin-tile-games__table-head">Status</th>
|
||||||
<th class="admin-tile-games__table-head"># players</th>
|
<th class="admin-tile-games__table-head"># players</th>
|
||||||
<th class="admin-tile-games__table-head">Gamemaster(s)</th>
|
<th class="admin-tile-games__table-head">Gamemaster(s)</th>
|
||||||
@ -14,6 +15,7 @@
|
|||||||
:key="id"
|
:key="id"
|
||||||
>
|
>
|
||||||
<td>{{ games[id].name }}</td>
|
<td>{{ games[id].name }}</td>
|
||||||
|
<td>{{ games[id].lang }}</td>
|
||||||
<td>{{ games[id].state }}</td>
|
<td>{{ games[id].state }}</td>
|
||||||
<td>{{ games[id].players.length }}</td>
|
<td>{{ games[id].players.length }}</td>
|
||||||
<td>{{ gamemasters[id] }}</td>
|
<td>{{ gamemasters[id] }}</td>
|
||||||
|
@ -6,6 +6,7 @@ import fetchUserInfo from './fetchUserInfo'
|
|||||||
import fetchGameInfo from './fetchGameInfo'
|
import fetchGameInfo from './fetchGameInfo'
|
||||||
import fetchGames from './fetchGames'
|
import fetchGames from './fetchGames'
|
||||||
import setGameName from './setGameName'
|
import setGameName from './setGameName'
|
||||||
|
import setGameLang from './setGameLang'
|
||||||
import savePlayer from './savePlayer'
|
import savePlayer from './savePlayer'
|
||||||
import deletePlayer from './deletePlayer'
|
import deletePlayer from './deletePlayer'
|
||||||
import collectQuotes from './collectQuotes'
|
import collectQuotes from './collectQuotes'
|
||||||
@ -36,6 +37,7 @@ export default (context, inject) => {
|
|||||||
fetchGameInfo,
|
fetchGameInfo,
|
||||||
fetchGames,
|
fetchGames,
|
||||||
setGameName,
|
setGameName,
|
||||||
|
setGameLang,
|
||||||
savePlayer,
|
savePlayer,
|
||||||
deletePlayer,
|
deletePlayer,
|
||||||
collectQuotes,
|
collectQuotes,
|
||||||
|
8
client/src/plugins/engine/setGameLang.js
Normal file
8
client/src/plugins/engine/setGameLang.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export default async function({ g, lang }) {
|
||||||
|
const { store } = this.context
|
||||||
|
|
||||||
|
await this.callApi('/api/setGameLang', {
|
||||||
|
g,
|
||||||
|
lang,
|
||||||
|
})
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
{"name":"Team Hogwards","created":1649841591}
|
{"name":"Team Hogwards","lang":"de","created":1649841591}
|
@ -22,6 +22,10 @@ type PlayerInfo struct {
|
|||||||
func (app *Application) CreateGame(w http.ResponseWriter, r *http.Request) {
|
func (app *Application) CreateGame(w http.ResponseWriter, r *http.Request) {
|
||||||
name := r.URL.Query().Get("name")
|
name := r.URL.Query().Get("name")
|
||||||
teamname := r.URL.Query().Get("teamname")
|
teamname := r.URL.Query().Get("teamname")
|
||||||
|
lang := r.URL.Query().Get("lang")
|
||||||
|
if lang != "de" && lang != "en" {
|
||||||
|
lang = "de"
|
||||||
|
}
|
||||||
|
|
||||||
authcode := ""
|
authcode := ""
|
||||||
rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
|
rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
@ -29,7 +33,7 @@ func (app *Application) CreateGame(w http.ResponseWriter, r *http.Request) {
|
|||||||
authcode += strconv.Itoa(rnd.Intn(1000) / 10 % 10)
|
authcode += strconv.Itoa(rnd.Intn(1000) / 10 % 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
gm, err := app.createGame(teamname)
|
gm, err := app.createGame(teamname, lang)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
fmt.Printf("%v\n", err)
|
fmt.Printf("%v\n", err)
|
||||||
@ -56,7 +60,7 @@ func (app *Application) CreateGame(w http.ResponseWriter, r *http.Request) {
|
|||||||
fmt.Fprintf(w, string(jsonString))
|
fmt.Fprintf(w, string(jsonString))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *Application) createGame(gamename string) (*game.Game, error) {
|
func (app *Application) createGame(gamename, lang string) (*game.Game, error) {
|
||||||
gameId := uuid.NewString()
|
gameId := uuid.NewString()
|
||||||
gameDirName := path.Join(app.config.DataDir, "games", gameId)
|
gameDirName := path.Join(app.config.DataDir, "games", gameId)
|
||||||
gameFileName := path.Join(gameDirName, "game.json")
|
gameFileName := path.Join(gameDirName, "game.json")
|
||||||
@ -68,8 +72,8 @@ func (app *Application) createGame(gamename string) (*game.Game, error) {
|
|||||||
if err := os.Mkdir(quotesDirName, 0777); err != nil {
|
if err := os.Mkdir(quotesDirName, 0777); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
fmt.Printf("createGame(\"%s\": \"%s\")\n", gameId, gamename)
|
fmt.Printf("createGame(\"%s\": \"%s\" [%s])\n", gameId, gamename, lang)
|
||||||
gm, err := game.NewGame(gameId, gameFileName, gamename)
|
gm, err := game.NewGame(gameId, gameFileName, gamename, lang)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
32
server/src/application/setGameLang.go
Normal file
32
server/src/application/setGameLang.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package application
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"sirlab.de/go/knowyt/user"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (app *Application) SetGameLang(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
|
||||||
|
}
|
||||||
|
|
||||||
|
lang := r.URL.Query().Get("lang")
|
||||||
|
if err := gm.SetGameLang(lang); err != nil {
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
fmt.Printf("%v", err)
|
||||||
|
fmt.Fprintf(w, "server error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "ok")
|
||||||
|
}
|
@ -20,10 +20,15 @@ func NewGameFromFile(id, fileName string) (*Game, error) {
|
|||||||
if err := json.Unmarshal(jsonBytes, &gmJson); err != nil {
|
if err := json.Unmarshal(jsonBytes, &gmJson); err != nil {
|
||||||
return nil, fmt.Errorf("%s: %v\n", fileName, err)
|
return nil, fmt.Errorf("%s: %v\n", fileName, err)
|
||||||
} else {
|
} else {
|
||||||
|
lang := gmJson.Lang
|
||||||
|
if lang == "" {
|
||||||
|
lang = "de"
|
||||||
|
}
|
||||||
gm := Game{
|
gm := Game{
|
||||||
id: id,
|
id: id,
|
||||||
filename: fileName,
|
filename: fileName,
|
||||||
name: gmJson.Name,
|
name: gmJson.Name,
|
||||||
|
lang: lang,
|
||||||
created: gmJson.Created,
|
created: gmJson.Created,
|
||||||
eng: engine.NewEngine(),
|
eng: engine.NewEngine(),
|
||||||
players: make(map[string]playerInfo, 0),
|
players: make(map[string]playerInfo, 0),
|
||||||
@ -35,11 +40,12 @@ func NewGameFromFile(id, fileName string) (*Game, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGame(id, fileName, name string) (*Game, error) {
|
func NewGame(id, fileName, name, lang string) (*Game, error) {
|
||||||
gm := Game{
|
gm := Game{
|
||||||
id: id,
|
id: id,
|
||||||
filename: fileName,
|
filename: fileName,
|
||||||
name: name,
|
name: name,
|
||||||
|
lang: lang,
|
||||||
eng: engine.NewEngine(),
|
eng: engine.NewEngine(),
|
||||||
players: make(map[string]playerInfo, 0),
|
players: make(map[string]playerInfo, 0),
|
||||||
state: STATE_IDLE,
|
state: STATE_IDLE,
|
||||||
@ -56,6 +62,7 @@ func (gm *Game) SaveGame() error {
|
|||||||
|
|
||||||
gmJson := GameJson{
|
gmJson := GameJson{
|
||||||
Name: gm.name,
|
Name: gm.name,
|
||||||
|
Lang: gm.lang,
|
||||||
Created: gm.created,
|
Created: gm.created,
|
||||||
}
|
}
|
||||||
if jsonBytes, err := json.Marshal(gmJson); err != nil {
|
if jsonBytes, err := json.Marshal(gmJson); err != nil {
|
||||||
|
@ -19,6 +19,7 @@ func (gm *Game) initGameInfoJson() *GameInfoJson {
|
|||||||
gameInfo := GameInfoJson{
|
gameInfo := GameInfoJson{
|
||||||
Id: gm.id,
|
Id: gm.id,
|
||||||
Name: gm.name,
|
Name: gm.name,
|
||||||
|
Lang: gm.lang,
|
||||||
Created: gm.created,
|
Created: gm.created,
|
||||||
State: gm.state,
|
State: gm.state,
|
||||||
Players: make([]PlayerInfoJson, 0),
|
Players: make([]PlayerInfoJson, 0),
|
||||||
|
14
server/src/game/setGameLang.go
Normal file
14
server/src/game/setGameLang.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package game
|
||||||
|
|
||||||
|
import ()
|
||||||
|
|
||||||
|
func (gm *Game) SetGameLang(lang string) error {
|
||||||
|
gm.mu.Lock()
|
||||||
|
if lang != "de" && lang != "en" {
|
||||||
|
lang = "de"
|
||||||
|
}
|
||||||
|
gm.lang = lang
|
||||||
|
gm.mu.Unlock()
|
||||||
|
|
||||||
|
return gm.SaveGame()
|
||||||
|
}
|
@ -60,6 +60,7 @@ type Game struct {
|
|||||||
id string
|
id string
|
||||||
filename string
|
filename string
|
||||||
name string
|
name string
|
||||||
|
lang string
|
||||||
created int64
|
created int64
|
||||||
players map[string]playerInfo
|
players map[string]playerInfo
|
||||||
eng *engine.Engine
|
eng *engine.Engine
|
||||||
@ -71,6 +72,7 @@ type Game struct {
|
|||||||
|
|
||||||
type GameJson struct {
|
type GameJson struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
Lang string `json:"lang"`
|
||||||
Created int64 `json:"created"`
|
Created int64 `json:"created"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,6 +101,7 @@ type PlayerInfoJson struct {
|
|||||||
type GameInfoJson struct {
|
type GameInfoJson struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
Lang string `json:"lang"`
|
||||||
Created int64 `json:"created"`
|
Created int64 `json:"created"`
|
||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
Players []PlayerInfoJson `json:"players"`
|
Players []PlayerInfoJson `json:"players"`
|
||||||
|
@ -26,6 +26,7 @@ func main() {
|
|||||||
mux.PrivateHandleFunc("/api/gameinfo", app.GetGameInfo)
|
mux.PrivateHandleFunc("/api/gameinfo", app.GetGameInfo)
|
||||||
mux.PrivateHandleFunc("/api/games", app.GetGames)
|
mux.PrivateHandleFunc("/api/games", app.GetGames)
|
||||||
mux.PrivateHandleFunc("/api/setGameName", app.SetGameName)
|
mux.PrivateHandleFunc("/api/setGameName", app.SetGameName)
|
||||||
|
mux.PrivateHandleFunc("/api/setGameLang", app.SetGameLang)
|
||||||
mux.PrivateHandleFunc("/api/savePlayer", app.SavePlayer)
|
mux.PrivateHandleFunc("/api/savePlayer", app.SavePlayer)
|
||||||
mux.PrivateHandleFunc("/api/deletePlayer", app.DeletePlayer)
|
mux.PrivateHandleFunc("/api/deletePlayer", app.DeletePlayer)
|
||||||
mux.PrivateHandleFunc("/api/sync", app.SyncHandler)
|
mux.PrivateHandleFunc("/api/sync", app.SyncHandler)
|
||||||
|
Loading…
Reference in New Issue
Block a user