diff --git a/_frontend/src/crea-partita/main.jsx b/_frontend/src/crea-partita/main.jsx
index e5ccf8d..cd16e84 100644
--- a/_frontend/src/crea-partita/main.jsx
+++ b/_frontend/src/crea-partita/main.jsx
@@ -1,6 +1,8 @@
import { render } from 'preact'
import { useState, useEffect } from 'preact/hooks'
+const clamp = (min, value, max) => (value > max ? max : value < min ? min : value)
+
const InputNumero = ({ name, id, value, setValue }) => (
(
type="number"
name={name}
id={id}
+ min="0"
value={value}
- onInput={e => setValue(e.target.value)}
+ onInput={e => setValue(parseInt(e.target.value))}
/>
-
@@ -28,6 +39,8 @@ const App = () => {
.then(res => {
if (res.ok) {
return res.json()
+ } else {
+ location.href = '/login'
}
})
.then(user => setUser(user))
diff --git a/database/database.go b/database/database.go
index b375617..0345082 100644
--- a/database/database.go
+++ b/database/database.go
@@ -2,11 +2,9 @@ package database
import (
"encoding/json"
- "fmt"
"os"
"github.com/aziis98/lupus-lite/model"
- "github.com/aziis98/lupus-lite/util"
)
type Database interface {
@@ -14,15 +12,10 @@ type Database interface {
GetUsers() ([]model.User, error)
GetUser(username string) (model.User, error)
- CreatePartita(partitaConfig model.PartitaConfig) (model.Partita, error)
+ CreatePartita(ownerUid string, partitaConfig model.PartitaConfig) (model.Partita, error)
GetPartita(uid string) (model.Partita, error)
}
-type memDB struct {
- Users map[string]model.User `json:"users"`
- Partite map[string]model.Partita `json:"partite"`
-}
-
func NewInMemoryDB() (Database, error) {
var db memDB
@@ -37,53 +30,3 @@ func NewInMemoryDB() (Database, error) {
return &db, nil
}
-
-func (db *memDB) GetUsers() ([]model.User, error) {
- users := make([]model.User, 0, len(db.Users))
- for _, u := range db.Users {
- users = append(users, u)
- }
-
- return users, nil
-}
-
-func (db *memDB) GetUser(username string) (model.User, error) {
- user, ok := db.Users[username]
- if !ok {
- return model.User{}, fmt.Errorf(`no user with username %q`, username)
- }
-
- return user, nil
-}
-
-func (db *memDB) CreateUser(user model.User) error {
- if _, ok := db.Users[user.Username]; ok {
- return fmt.Errorf(`user with username %q already exists`, user.Username)
- }
-
- db.Users[user.Username] = user
- return nil
-}
-
-func (db *memDB) CreatePartita(partitaConfig model.PartitaConfig) (model.Partita, error) {
- uid := util.GenerateRandomString(12)
- partita := model.Partita{
- Uid: uid,
- Config: partitaConfig,
- Players: []string{},
- Iniziata: false,
- }
-
- db.Partite[uid] = partita
-
- return partita, nil
-}
-
-func (db *memDB) GetPartita(uid string) (model.Partita, error) {
- partita, ok := db.Partite[uid]
- if !ok {
- return model.Partita{}, fmt.Errorf(`nessuna partita con uid %q`, uid)
- }
-
- return partita, nil
-}
diff --git a/database/inmemory.go b/database/inmemory.go
new file mode 100644
index 0000000..9c59352
--- /dev/null
+++ b/database/inmemory.go
@@ -0,0 +1,64 @@
+package database
+
+import (
+ "fmt"
+
+ "github.com/aziis98/lupus-lite/model"
+ "github.com/aziis98/lupus-lite/util"
+)
+
+type memDB struct {
+ Users map[string]model.User `json:"users"`
+ Partite map[string]model.Partita `json:"partite"`
+}
+
+func (db *memDB) GetUsers() ([]model.User, error) {
+ users := make([]model.User, 0, len(db.Users))
+ for _, u := range db.Users {
+ users = append(users, u)
+ }
+
+ return users, nil
+}
+
+func (db *memDB) GetUser(username string) (model.User, error) {
+ user, ok := db.Users[username]
+ if !ok {
+ return model.User{}, fmt.Errorf(`no user with username %q`, username)
+ }
+
+ return user, nil
+}
+
+func (db *memDB) CreateUser(user model.User) error {
+ if _, ok := db.Users[user.Username]; ok {
+ return fmt.Errorf(`user with username %q already exists`, user.Username)
+ }
+
+ db.Users[user.Username] = user
+ return nil
+}
+
+func (db *memDB) CreatePartita(ownerUid string, partitaConfig model.PartitaConfig) (model.Partita, error) {
+ uid := util.GenerateRandomString(16)
+ partita := model.Partita{
+ Uid: uid,
+ OwnerUid: ownerUid,
+ Config: partitaConfig,
+ Players: []string{},
+ Iniziata: false,
+ }
+
+ db.Partite[uid] = partita
+
+ return partita, nil
+}
+
+func (db *memDB) GetPartita(uid string) (model.Partita, error) {
+ partita, ok := db.Partite[uid]
+ if !ok {
+ return model.Partita{}, fmt.Errorf(`nessuna partita con uid %q`, uid)
+ }
+
+ return partita, nil
+}
diff --git a/go.mod b/go.mod
index 709bae3..578ddb5 100644
--- a/go.mod
+++ b/go.mod
@@ -8,6 +8,7 @@ require (
)
require (
+ github.com/alecthomas/repr v0.1.0 // indirect
github.com/andybalholm/brotli v1.0.4 // indirect
github.com/klauspost/compress v1.15.0 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
diff --git a/go.sum b/go.sum
index d294d0c..0b4987c 100644
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,5 @@
+github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
+github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/gofiber/fiber/v2 v2.34.1 h1:C6saXB7385HvtXX+XMzc5Dqj5S/aEXOfKCW7JNep4rA=
diff --git a/model/model.go b/model/model.go
index ff86512..4d4d667 100644
--- a/model/model.go
+++ b/model/model.go
@@ -18,16 +18,15 @@ func (u User) PublicUser() PublicUser {
}
type PartitaConfig struct {
- // NumeroGiocatori indica il numero totale di giocatori (per capire quanto tutti sono entrati nella partita)
- NumeroGiocatori int
-
- // NumeroPerRuolo indica quanti giocatori di un certo ruolo ci dovrebbero essere
- NumeroPerRuolo map[string]int
+ NumeroGiocatori int `json:"numeroGiocatori"` // NumeroGiocatori indica il numero totale di giocatori (per capire quanto tutti sono entrati nella partita)
+ NumeroPerRuolo map[string]int `json:"numeroPerRuolo"` // NumeroPerRuolo indica quanti giocatori di un certo ruolo ci dovrebbero essere
}
type Partita struct {
- Uid string // Uid è il codice identificativo della partita.
- Config PartitaConfig // Config è la configurazione iniziale della partita.
- Players []string // Players è la lista di giocatori che sono entrati in questa partita.
- Iniziata bool // Iniziata indica se la partita è iniziata, quando lo è c'è una tabella corrispondente StatoPartita con le informazioni sui vari giocatori e sullo stato attuale del gioco.
+ Uid string `json:"uid"`
+ OwnerUid string `json:"ownerUid"` // OwnerUid è l'uid dell'utente che ha creato la partita.
+
+ Config PartitaConfig `json:"config"` // Config è la configurazione iniziale della partita.
+ Players []string `json:"players"` // Players è la lista di giocatori che sono entrati fino ad ora nella partita.
+ Iniziata bool `json:"iniziata"` // Iniziata indica se la partita è iniziata, quando lo è c'è una tabella corrispondente.
}
diff --git a/routes/api.go b/routes/api.go
index 2a1df8f..96d0a8b 100644
--- a/routes/api.go
+++ b/routes/api.go
@@ -3,10 +3,14 @@ package routes
import (
"encoding/json"
"log"
+ "strconv"
"time"
+ "github.com/alecthomas/repr"
"github.com/aziis98/lupus-lite/auth"
"github.com/aziis98/lupus-lite/database"
+ "github.com/aziis98/lupus-lite/lupus"
+ "github.com/aziis98/lupus-lite/model"
"github.com/aziis98/lupus-lite/util"
"github.com/gofiber/fiber/v2"
)
@@ -93,6 +97,60 @@ func Api(api fiber.Router) {
return c.Redirect("/login")
})
+ api.Post("/crea-partita", requireLogged, func(c *fiber.Ctx) error {
+ user := requestUser(c)
+
+ var form struct {
+ NumGiocatori string `form:"numero-giocatori"`
+ NumLupi string `form:"numero-lupi"`
+ NumFattucchiere string `form:"numero-fattucchiere"`
+ NumGuardie string `form:"numero-guardie"`
+ NumCacciatori string `form:"numero-cacciatori"`
+ NumMedium string `form:"numero-medium"`
+ NumVeggenti string `form:"numero-veggenti"`
+ }
+ if err := c.BodyParser(&form); err != nil {
+ return err
+ }
+
+ repr.Println(form)
+
+ cfg := model.PartitaConfig{
+ NumeroPerRuolo: map[string]int{},
+ }
+
+ if util.AtoiInto(form.NumGiocatori, &cfg.NumeroGiocatori); err != nil {
+ return err
+ }
+
+ // Questo codice magico scorre su questa "tabella" con colonne ruolo e stringa del ruolo nel form e popola la mappa NumeroPerRuolo da uid ruolo a numero per ruolo.
+ for _, r := range []struct {
+ ruolo lupus.Ruolo
+ num string
+ }{
+ {lupus.Lupo, form.NumLupi},
+ {lupus.Fattucchiera, form.NumFattucchiere},
+ {lupus.Guardia, form.NumGuardie},
+ {lupus.Cacciatore, form.NumCacciatori},
+ {lupus.Medium, form.NumMedium},
+ {lupus.Veggente, form.NumVeggenti},
+ } {
+ num, err := strconv.Atoi(r.num)
+ if err != nil {
+ return err
+ }
+
+ cfg.NumeroPerRuolo[r.ruolo.Uid] = num
+ }
+
+ partita, err := db.CreatePartita(user.Username, cfg)
+ if err != nil {
+ return err
+ }
+
+ return c.JSON(partita)
+ })
+
api.Get("/user", requireLogged, func(c *fiber.Ctx) error {
return c.JSON(requestUser(c).PublicUser())
})
diff --git a/util/util.go b/util/util.go
index 07a8108..3b3be64 100644
--- a/util/util.go
+++ b/util/util.go
@@ -2,6 +2,7 @@ package util
import (
"math/rand"
+ "strconv"
"time"
"unicode"
)
@@ -31,3 +32,13 @@ func IsWhitespaceFree(s string) bool {
return true
}
+
+func AtoiInto(s string, into *int) error {
+ num, err := strconv.Atoi(s)
+ if err != nil {
+ return err
+ }
+
+ *into = num
+ return nil
+}