added a basic function to add multiple Monsters

This commit is contained in:
Patryk Hegenberg 2023-11-29 22:36:00 +01:00
parent bf021090ab
commit 4dd9c18832
4 changed files with 207 additions and 122 deletions

79
main.go
View file

@ -100,7 +100,8 @@ var (
chars []Character
//go:embed templates/*.html
//go:embed images/*
content embed.FS
content embed.FS
Monsters []Monster
)
func main() {
@ -109,6 +110,7 @@ func main() {
http.HandleFunc("/", formHandler(filename))
http.HandleFunc("/submit", submitHandler(filename))
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.FS(content))))
http.HandleFunc("/addMonster", addMonster())
fmt.Println("Server gestartet, erreichbar unter http://localhost:8080")
http.ListenAndServe(":8080", nil)
@ -149,7 +151,7 @@ func submitHandler(filename string) http.HandlerFunc {
// Monster-Objekt erstellen
filename := r.FormValue("filename")
monster := Monster{
/*monster := Monster{
Name: r.FormValue("name"),
Source: r.FormValue("source"),
Size: []string{r.FormValue("size")},
@ -199,14 +201,14 @@ func submitHandler(filename string) http.HandlerFunc {
Entries: []string{r.FormValue("actionEntry")},
},
},
}
}*/
// Charakter-Objekt erstellen oder aktualisieren
mu.Lock()
defer mu.Unlock()
char := getOrCreateCharacter(filename)
char.Monster = append(char.Monster, monster)
char.Monster = append(char.Monster, Monsters...)
// Charakterdaten in JSON umwandeln
charJSON, err := json.Marshal(char)
@ -293,3 +295,72 @@ func parseInt(s string) int {
}
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)
}
}

View file

@ -9,6 +9,9 @@
<!-- 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 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>
body {
display: flex;

View file

@ -7,7 +7,18 @@
<input type="text" name="filename" required placeholder="Dateiname"
class="input input-bordered w-full max-w-xs"><br>
</div>
{{ template "monsterform" . }}
<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" . }}
</div>
</div>
<input type="hidden" name="filename" value="{{.Filename}}">
<div class="card-actions justify-end">
<input type="submit" value="Submit" class="btn">

View file

@ -1,118 +1,118 @@
{{ define "monsterform" }}
<div class="grid grid-cols-2">
<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>
</div>
<div class="grid grid-cols-2">
<label for="source">Monster Source:</label>
<input type="text" name="source" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="size">Size:</label>
<input type="text" name="size" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="type">Type:</label>
<input type="text" name="type" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="alignment">Alignment:</label>
<input type="text" name="alignment" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="ac">AC:</label>
<input type="number" name="ac" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="acFrom">AC From:</label>
<input type="text" name="acFrom" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="hpAverage">HP Average:</label>
<input type="number" name="hpAverage" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="hpFormula">HP Formula:</label>
<input type="text" name="hpFormula" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="speed">Speed:</label>
<input type="number" name="speed" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="str">Str:</label>
<input type="number" name="str" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="dex">Dex:</label>
<input type="number" name="dex" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="con">Con:</label>
<input type="number" name="con" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="int">Int:</label>
<input type="number" name="int" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="wis">Wis:</label>
<input type="number" name="wis" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="cha">Cha:</label>
<input type="number" name="cha" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="saveDex">Save Dex:</label>
<input type="text" name="saveDex" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="saveCon">Save Con:</label>
<input type="text" name="saveCon" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="saveWis">Save Wis:</label>
<input type="text" name="saveWis" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="perception">Perception:</label>
<input type="text" name="perception" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="stealth">Stealth:</label>
<input type="text" name="stealth" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="damageRes">Damage Resistances:</label>
<input type="text" name="damageRes" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="senses">Senses:</label>
<input type="text" name="senses" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="languages">Languages:</label>
<input type="text" name="languages" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="cr">CR:</label>
<input type="text" name="cr" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="traitName">Trait Name:</label>
<input type="text" name="traitName" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="traitEntry">Trait Entry:</label>
<input type="text" name="traitEntry" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="actionName">Action Name:</label>
<input type="text" name="actionName" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="actionEntry">Action Entry:</label>
<input type="text" name="actionEntry" required class="input input-bordered w-full max-w-xs"><br>
</div>
{{end}}
<div class="grid grid-cols-2">
<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>
</div>
<div class="grid grid-cols-2">
<label for="source">Monster Source:</label>
<input type="text" name="source" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="size">Size:</label>
<input type="text" name="size" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="type">Type:</label>
<input type="text" name="type" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="alignment">Alignment:</label>
<input type="text" name="alignment" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="ac">AC:</label>
<input type="number" name="ac" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="acFrom">AC From:</label>
<input type="text" name="acFrom" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="hpAverage">HP Average:</label>
<input type="number" name="hpAverage" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="hpFormula">HP Formula:</label>
<input type="text" name="hpFormula" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="speed">Speed:</label>
<input type="number" name="speed" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="str">Str:</label>
<input type="number" name="str" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="dex">Dex:</label>
<input type="number" name="dex" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="con">Con:</label>
<input type="number" name="con" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="int">Int:</label>
<input type="number" name="int" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="wis">Wis:</label>
<input type="number" name="wis" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="cha">Cha:</label>
<input type="number" name="cha" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="saveDex">Save Dex:</label>
<input type="text" name="saveDex" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="saveCon">Save Con:</label>
<input type="text" name="saveCon" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="saveWis">Save Wis:</label>
<input type="text" name="saveWis" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="perception">Perception:</label>
<input type="text" name="perception" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="stealth">Stealth:</label>
<input type="text" name="stealth" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="damageRes">Damage Resistances:</label>
<input type="text" name="damageRes" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="senses">Senses:</label>
<input type="text" name="senses" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="languages">Languages:</label>
<input type="text" name="languages" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="cr">CR:</label>
<input type="text" name="cr" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="traitName">Trait Name:</label>
<input type="text" name="traitName" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="traitEntry">Trait Entry:</label>
<input type="text" name="traitEntry" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="actionName">Action Name:</label>
<input type="text" name="actionName" required class="input input-bordered w-full max-w-xs"><br>
</div>
<div class="grid grid-cols-2">
<label for="actionEntry">Action Entry:</label>
<input type="text" name="actionEntry" required class="input input-bordered w-full max-w-xs"><br>
</div>
{{end}}