added a basic function to add multiple Monsters
This commit is contained in:
parent
bf021090ab
commit
4dd9c18832
4 changed files with 207 additions and 122 deletions
77
main.go
77
main.go
|
|
@ -101,6 +101,7 @@ var (
|
||||||
//go:embed templates/*.html
|
//go:embed templates/*.html
|
||||||
//go:embed images/*
|
//go:embed images/*
|
||||||
content embed.FS
|
content embed.FS
|
||||||
|
Monsters []Monster
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -109,6 +110,7 @@ func main() {
|
||||||
http.HandleFunc("/", formHandler(filename))
|
http.HandleFunc("/", formHandler(filename))
|
||||||
http.HandleFunc("/submit", submitHandler(filename))
|
http.HandleFunc("/submit", submitHandler(filename))
|
||||||
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.FS(content))))
|
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.FS(content))))
|
||||||
|
http.HandleFunc("/addMonster", addMonster())
|
||||||
|
|
||||||
fmt.Println("Server gestartet, erreichbar unter http://localhost:8080")
|
fmt.Println("Server gestartet, erreichbar unter http://localhost:8080")
|
||||||
http.ListenAndServe(":8080", nil)
|
http.ListenAndServe(":8080", nil)
|
||||||
|
|
@ -149,7 +151,7 @@ func submitHandler(filename string) http.HandlerFunc {
|
||||||
|
|
||||||
// Monster-Objekt erstellen
|
// Monster-Objekt erstellen
|
||||||
filename := r.FormValue("filename")
|
filename := r.FormValue("filename")
|
||||||
monster := Monster{
|
/*monster := Monster{
|
||||||
Name: r.FormValue("name"),
|
Name: r.FormValue("name"),
|
||||||
Source: r.FormValue("source"),
|
Source: r.FormValue("source"),
|
||||||
Size: []string{r.FormValue("size")},
|
Size: []string{r.FormValue("size")},
|
||||||
|
|
@ -199,14 +201,14 @@ func submitHandler(filename string) http.HandlerFunc {
|
||||||
Entries: []string{r.FormValue("actionEntry")},
|
Entries: []string{r.FormValue("actionEntry")},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}*/
|
||||||
|
|
||||||
// Charakter-Objekt erstellen oder aktualisieren
|
// Charakter-Objekt erstellen oder aktualisieren
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
defer mu.Unlock()
|
defer mu.Unlock()
|
||||||
|
|
||||||
char := getOrCreateCharacter(filename)
|
char := getOrCreateCharacter(filename)
|
||||||
char.Monster = append(char.Monster, monster)
|
char.Monster = append(char.Monster, Monsters...)
|
||||||
|
|
||||||
// Charakterdaten in JSON umwandeln
|
// Charakterdaten in JSON umwandeln
|
||||||
charJSON, err := json.Marshal(char)
|
charJSON, err := json.Marshal(char)
|
||||||
|
|
@ -293,3 +295,72 @@ func parseInt(s string) int {
|
||||||
}
|
}
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addMonster() http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// TODO
|
||||||
|
if r.Method != http.MethodPost {
|
||||||
|
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := r.ParseForm()
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
monster := Monster{
|
||||||
|
Name: r.FormValue("name"),
|
||||||
|
Source: r.FormValue("source"),
|
||||||
|
Size: []string{r.FormValue("size")},
|
||||||
|
Type: r.FormValue("type"),
|
||||||
|
Alignment: []string{r.FormValue("alignment")},
|
||||||
|
AC: []AC{
|
||||||
|
{
|
||||||
|
AC: parseInt(r.FormValue("ac")),
|
||||||
|
From: []string{r.FormValue("acFrom")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
HP: HP{
|
||||||
|
Average: parseInt(r.FormValue("hpAverage")),
|
||||||
|
Formula: r.FormValue("hpFormula"),
|
||||||
|
},
|
||||||
|
Speed: Speed{
|
||||||
|
Walk: parseInt(r.FormValue("speed")),
|
||||||
|
},
|
||||||
|
Str: parseInt(r.FormValue("str")),
|
||||||
|
Dex: parseInt(r.FormValue("dex")),
|
||||||
|
Con: parseInt(r.FormValue("con")),
|
||||||
|
Int: parseInt(r.FormValue("int")),
|
||||||
|
Wis: parseInt(r.FormValue("wis")),
|
||||||
|
Cha: parseInt(r.FormValue("cha")),
|
||||||
|
Save: Save{
|
||||||
|
Dex: r.FormValue("saveDex"),
|
||||||
|
Con: r.FormValue("saveCon"),
|
||||||
|
Wis: r.FormValue("saveWis"),
|
||||||
|
},
|
||||||
|
Skill: Skill{
|
||||||
|
Perception: r.FormValue("perception"),
|
||||||
|
Stealth: r.FormValue("stealth"),
|
||||||
|
},
|
||||||
|
DamageRes: []string{r.FormValue("damageRes")},
|
||||||
|
Senses: []string{r.FormValue("senses")},
|
||||||
|
Languages: []string{r.FormValue("languages")},
|
||||||
|
CR: r.FormValue("cr"),
|
||||||
|
Traits: []Trait{
|
||||||
|
{
|
||||||
|
Name: r.FormValue("traitName"),
|
||||||
|
Entries: []string{r.FormValue("traitEntry")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Actions: []Action{
|
||||||
|
{
|
||||||
|
Name: r.FormValue("actionName"),
|
||||||
|
Entries: []string{r.FormValue("actionEntry")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
Monsters = append(Monsters, monster)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,9 @@
|
||||||
<!-- Hier könnten weitere Meta-Tags, Stylesheets, JavaScript-Dateien usw. eingefügt werden -->
|
<!-- Hier könnten weitere Meta-Tags, Stylesheets, JavaScript-Dateien usw. eingefügt werden -->
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css">
|
||||||
<link href="https://cdn.jsdelivr.net/npm/daisyui@2.31.0/dist/full.css" rel="stylesheet" type="text/css">
|
<link href="https://cdn.jsdelivr.net/npm/daisyui@2.31.0/dist/full.css" rel="stylesheet" type="text/css">
|
||||||
|
<script src="https://unpkg.com/htmx.org@1.9.9"
|
||||||
|
integrity="sha384-QFjmbokDn2DjBjq+fM+8LUIVrAgqcNW2s0PjAxHETgRn9l4fvX31ZxDxvwQnyMOX"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,18 @@
|
||||||
<input type="text" name="filename" required placeholder="Dateiname"
|
<input type="text" name="filename" required placeholder="Dateiname"
|
||||||
class="input input-bordered w-full max-w-xs"><br>
|
class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="grid grid-cols-1">
|
||||||
|
<button type="button" hx-post="/addMonster" class="btn">Add Monster</button>
|
||||||
|
</div>
|
||||||
|
<div class="collapse bg-base-200">
|
||||||
|
<input type="checkbox" />
|
||||||
|
<div class="collapse-title text-xl font-medium">
|
||||||
|
Monster
|
||||||
|
</div>
|
||||||
|
<div class="collapse-content">
|
||||||
{{ template "monsterform" . }}
|
{{ template "monsterform" . }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<input type="hidden" name="filename" value="{{.Filename}}">
|
<input type="hidden" name="filename" value="{{.Filename}}">
|
||||||
<div class="card-actions justify-end">
|
<div class="card-actions justify-end">
|
||||||
<input type="submit" value="Submit" class="btn">
|
<input type="submit" value="Submit" class="btn">
|
||||||
|
|
|
||||||
|
|
@ -1,118 +1,118 @@
|
||||||
{{ define "monsterform" }}
|
{{ define "monsterform" }}
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="name">Monster Name:</label>
|
<label for="name">Monster Name:</label>
|
||||||
<input type="text" name="name" required placeholder="Type here" class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="name" required placeholder="Type here" class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="source">Monster Source:</label>
|
<label for="source">Monster Source:</label>
|
||||||
<input type="text" name="source" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="source" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="size">Size:</label>
|
<label for="size">Size:</label>
|
||||||
<input type="text" name="size" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="size" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="type">Type:</label>
|
<label for="type">Type:</label>
|
||||||
<input type="text" name="type" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="type" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="alignment">Alignment:</label>
|
<label for="alignment">Alignment:</label>
|
||||||
<input type="text" name="alignment" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="alignment" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="ac">AC:</label>
|
<label for="ac">AC:</label>
|
||||||
<input type="number" name="ac" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="ac" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="acFrom">AC From:</label>
|
<label for="acFrom">AC From:</label>
|
||||||
<input type="text" name="acFrom" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="acFrom" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="hpAverage">HP Average:</label>
|
<label for="hpAverage">HP Average:</label>
|
||||||
<input type="number" name="hpAverage" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="hpAverage" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="hpFormula">HP Formula:</label>
|
<label for="hpFormula">HP Formula:</label>
|
||||||
<input type="text" name="hpFormula" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="hpFormula" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="speed">Speed:</label>
|
<label for="speed">Speed:</label>
|
||||||
<input type="number" name="speed" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="speed" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="str">Str:</label>
|
<label for="str">Str:</label>
|
||||||
<input type="number" name="str" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="str" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="dex">Dex:</label>
|
<label for="dex">Dex:</label>
|
||||||
<input type="number" name="dex" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="dex" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="con">Con:</label>
|
<label for="con">Con:</label>
|
||||||
<input type="number" name="con" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="con" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="int">Int:</label>
|
<label for="int">Int:</label>
|
||||||
<input type="number" name="int" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="int" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="wis">Wis:</label>
|
<label for="wis">Wis:</label>
|
||||||
<input type="number" name="wis" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="wis" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="cha">Cha:</label>
|
<label for="cha">Cha:</label>
|
||||||
<input type="number" name="cha" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="number" name="cha" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="saveDex">Save Dex:</label>
|
<label for="saveDex">Save Dex:</label>
|
||||||
<input type="text" name="saveDex" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="saveDex" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="saveCon">Save Con:</label>
|
<label for="saveCon">Save Con:</label>
|
||||||
<input type="text" name="saveCon" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="saveCon" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="saveWis">Save Wis:</label>
|
<label for="saveWis">Save Wis:</label>
|
||||||
<input type="text" name="saveWis" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="saveWis" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="perception">Perception:</label>
|
<label for="perception">Perception:</label>
|
||||||
<input type="text" name="perception" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="perception" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="stealth">Stealth:</label>
|
<label for="stealth">Stealth:</label>
|
||||||
<input type="text" name="stealth" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="stealth" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="damageRes">Damage Resistances:</label>
|
<label for="damageRes">Damage Resistances:</label>
|
||||||
<input type="text" name="damageRes" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="damageRes" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="senses">Senses:</label>
|
<label for="senses">Senses:</label>
|
||||||
<input type="text" name="senses" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="senses" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="languages">Languages:</label>
|
<label for="languages">Languages:</label>
|
||||||
<input type="text" name="languages" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="languages" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="cr">CR:</label>
|
<label for="cr">CR:</label>
|
||||||
<input type="text" name="cr" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="cr" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="traitName">Trait Name:</label>
|
<label for="traitName">Trait Name:</label>
|
||||||
<input type="text" name="traitName" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="traitName" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="traitEntry">Trait Entry:</label>
|
<label for="traitEntry">Trait Entry:</label>
|
||||||
<input type="text" name="traitEntry" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="traitEntry" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="actionName">Action Name:</label>
|
<label for="actionName">Action Name:</label>
|
||||||
<input type="text" name="actionName" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="actionName" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<label for="actionEntry">Action Entry:</label>
|
<label for="actionEntry">Action Entry:</label>
|
||||||
<input type="text" name="actionEntry" required class="input input-bordered w-full max-w-xs"><br>
|
<input type="text" name="actionEntry" required class="input input-bordered w-full max-w-xs"><br>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue