package main import ( "encoding/json" "log" "math/rand" "net/http" "strconv" "strings" "golang.org/x/text/cases" "golang.org/x/text/language" "namegen/generators" ) var elfArrays *generators.ElfArrays var dwarfArrays *generators.DwarfArrays var arakocraArrays *generators.ArakocraArrays var bugbearArrays *generators.BugbearArrays var changelingArrays *generators.ChangelingArrays var titleCaser = cases.Title(language.English) var dragonbornArrays *generators.DragonbornArrays var duergarArrays *generators.DuergarArrays var eladrinArrays *generators.EladrinArrays var fairyArrays *generators.FairyArrays var genasiArrays *generators.GenasiArrays var githyankiArrays *generators.GithyankiArrays var githzeraiArrays *generators.GithzeraiArrays var gnomeArrays *generators.GnomeArrays var goblinArrays *generators.GoblinArrays var goliathArrays *generators.GoliathArrays var grungArrays *generators.GrungArrays var halfElfArrays *generators.HalfElfArrays var halfOrcArrays *generators.HalfOrcArrays var halflingArrays *generators.HalflingArrays var harengonArrays *generators.HarengonArrays var leoninArrays *generators.LeoninArrays var humanArrays *generators.HumanArrays var koboldArrays *generators.KoboldArrays var kenkuArrays *generators.KenkuArrays var kalashtarArrays *generators.KalashtarArrays var hobgoblinArrays *generators.HobgoblinArrays var lizardfolkArrays *generators.LizardfolkArrays var locathahArrays *generators.LocathahArrays var loxodonArrays *generators.LoxodonArrays var minotaurArrays *generators.MinotaurArrays var orcArrays *generators.OrcArrays var satyrArrays *generators.SatyrArrays var shadarKaiArrays *generators.ShadarKaiArrays var shardmindArrays *generators.ShardmindArrays var shifterArrays *generators.ShifterArrays var simicHybridArrays *generators.SimicHybridArrays var tabaxiArrays *generators.TabaxiArrays var tieflingArrays *generators.TieflingArrays var tortleArrays *generators.TortleArrays var tritonArrays *generators.TritonArrays var vedalkenArrays *generators.VedalkenArrays var verdanArrays *generators.VerdanArrays var warforgedArrays *generators.WarforgedArrays var wildenArrays *generators.WildenArrays var yuantiArrays *generators.YuanTiArrays var modernEnglishArrays *generators.ModernEnglishArrays var modernPortugueseEUArrays *generators.ModernPortugueseEUArrays func init() { var err error elfArrays, err = generators.LoadElfArrays("data/elf.json") if err != nil { log.Fatalf("Failed to load elf arrays: %v", err) } dwarfArrays, err = generators.LoadDwarfArrays("data/dwarf.json") if err != nil { log.Fatalf("Failed to load dwarf arrays: %v", err) } arakocraArrays, err = generators.LoadArakocraArrays("data/arakocra.json") if err != nil { log.Fatalf("Failed to load arakocra arrays: %v", err) } bugbearArrays, err = generators.LoadBugbearArrays("data/bugbear.json") if err != nil { log.Fatalf("Failed to load bugbear arrays: %v", err) } changelingArrays, err = generators.LoadChangelingArrays("data/changeling.json") if err != nil { log.Fatalf("Failed to load changeling arrays: %v", err) } // Load Aasimar data if err := generators.LoadAasimarData("data/aasimar.json"); err != nil { log.Fatalf("Failed to load aasimar arrays: %v", err) } // Load Centaur data if err := generators.LoadCentaurData("data/centaur.json"); err != nil { log.Fatalf("Failed to load centaur arrays: %v", err) } // Load Deep Gnome data if err := generators.LoadDeepGnomeData("data/deep_gnome.json"); err != nil { log.Fatalf("Failed to load deep gnome arrays: %v", err) } // Load Deva data if err := generators.LoadDevaData("data/deva.json"); err != nil { log.Fatalf("Failed to load deva arrays: %v", err) } // Load Dragonborn data dragonbornArrays, err = generators.LoadDragonbornArrays("data/dragonborn.json") if err != nil { log.Fatalf("Failed to load dragonborn arrays: %v", err) } // Load Drow data if err := generators.LoadDrowData("data/drow.json"); err != nil { log.Fatalf("Failed to load drow arrays: %v", err) } // Load Duergar data duergarArrays, err = generators.LoadDuergarArrays("data/duergar.json") if err != nil { log.Fatalf("Failed to load duergar arrays: %v", err) } // Load Eladrin data eladrinArrays, err = generators.LoadEladrinArrays("data/eladrin.json") if err != nil { log.Fatalf("Failed to load eladrin arrays: %v", err) } // Load Fairy data fa, err := generators.LoadFairyArrays("data/fairy.json") if err != nil { log.Fatalf("Failed to load fairy arrays: %v", err) } fairyArrays = &fa // Load Genasi data ga, err := generators.LoadGenasiArrays("data/genasi.json") if err != nil { log.Fatalf("Failed to load genasi arrays: %v", err) } genasiArrays = &ga // Load Githyanki data gaGith, err := generators.LoadGithyankiArrays("data/githyanki.json") if err != nil { log.Fatalf("Failed to load githyanki arrays: %v", err) } githyankiArrays = &gaGith // Load Githzerai data gz, err := generators.LoadGithzeraiArrays("data/githzerai.json") if err != nil { log.Fatalf("Failed to load githzerai arrays: %v", err) } githzeraiArrays = &gz // Load Gnome data gn, err := generators.LoadGnomeArrays("data/gnome.json") if err != nil { log.Fatalf("Failed to load gnome arrays: %v", err) } gnomeArrays = &gn // Load Goblin data gb, err := generators.LoadGoblinArrays("data/goblin.json") if err != nil { log.Fatalf("Failed to load goblin arrays: %v", err) } goblinArrays = &gb // Load Goliath data gol, err := generators.LoadGoliathArrays("data/goliath.json") if err != nil { log.Fatalf("Failed to load goliath arrays: %v", err) } goliathArrays = &gol // Load Grung data gr, err := generators.LoadGrungArrays("data/grung.json") if err != nil { log.Fatalf("Failed to load grung arrays: %v", err) } grungArrays = &gr // Load Half-Elf data halfElf, err := generators.LoadHalfElfArrays("data/half-elf.json") if err != nil { log.Fatalf("Failed to load half-elf arrays: %v", err) } halfElfArrays = &halfElf // Load Half-Orc data halfOrc, err := generators.LoadHalfOrcArrays("data/half-orc.json") if err != nil { log.Fatalf("Failed to load half-orc arrays: %v", err) } halfOrcArrays = &halfOrc // Load Halfling data halfling, err := generators.LoadHalflingArrays("data/halfling.json") if err != nil { log.Fatalf("Failed to load halfling arrays: %v", err) } halflingArrays = &halfling // Load Harengon data harengon, err := generators.LoadHarengonArrays("data/harengon.json") if err != nil { log.Fatalf("Failed to load harengon arrays: %v", err) } harengonArrays = &harengon // Load Leonin data leonin, err := generators.LoadLeoninArrays("data/leonin.json") if err != nil { log.Fatalf("Failed to load leonin arrays: %v", err) } leoninArrays = &leonin // Load Human data human, err := generators.LoadHumanArrays("data/human.json") if err != nil { log.Fatalf("Failed to load human arrays: %v", err) } humanArrays = &human // Load Kobold data kobold, err := generators.LoadKoboldArrays("data/kobold.json") if err != nil { log.Fatalf("Failed to load kobold arrays: %v", err) } koboldArrays = &kobold // Load Kenku data kenku, err := generators.LoadKenkuArrays("data/kenku.json") if err != nil { log.Fatalf("Failed to load kenku arrays: %v", err) } kenkuArrays = &kenku // Load Kalashtar data kalashtar, err := generators.LoadKalashtarArrays("data/kalashtar.json") if err != nil { log.Fatalf("Failed to load kalashtar arrays: %v", err) } kalashtarArrays = &kalashtar // Load Hobgoblin data hobgoblin, err := generators.LoadHobgoblinArrays("data/hobgoblin.json") if err != nil { log.Fatalf("Failed to load hobgoblin arrays: %v", err) } hobgoblinArrays = &hobgoblin // Load Lizardfolk data lizardfolk, err := generators.LoadLizardfolkArrays("data/lizardfolk.json") if err != nil { log.Fatalf("Failed to load lizardfolk arrays: %v", err) } lizardfolkArrays = &lizardfolk // Load Locathah data locathah, err := generators.LoadLocathahArrays("data/locathah.json") if err != nil { log.Fatalf("Failed to load locathah arrays: %v", err) } locathahArrays = &locathah // Load Loxodon data loxodon, err := generators.LoadLoxodonArrays("data/loxodon.json") if err != nil { log.Fatalf("Failed to load loxodon arrays: %v", err) } loxodonArrays = &loxodon // Load Minotaur data minotaur, err := generators.LoadMinotaurArrays("data/minotaur.json") if err != nil { log.Fatalf("Failed to load minotaur arrays: %v", err) } minotaurArrays = &minotaur // Load Orc data orc, err := generators.LoadOrcArrays("data/orc.json") if err != nil { log.Fatalf("Failed to load orc arrays: %v", err) } orcArrays = &orc // Load Satyr data satyr, err := generators.LoadSatyrArrays("data/satyr.json") if err != nil { log.Fatalf("Failed to load satyr arrays: %v", err) } satyrArrays = &satyr // Load Shadar-Kai data shadarKai, err := generators.LoadShadarKaiArrays("data/shadar-kai.json") if err != nil { log.Fatalf("Failed to load shadar-kai arrays: %v", err) } shadarKaiArrays = &shadarKai // Load Shardmind data shardmind, err := generators.LoadShardmindArrays("data/shardmind.json") if err != nil { log.Fatalf("Failed to load shardmind arrays: %v", err) } shardmindArrays = &shardmind // Load Shifter data shifter, err := generators.LoadShifterArrays("data/shifter.json") if err != nil { log.Fatalf("Failed to load shifter arrays: %v", err) } shifterArrays = &shifter // Load Simic Hybrid data simicHybrid, err := generators.LoadSimicHybridArrays("data/simic_hybrid.json") if err != nil { log.Fatalf("Failed to load simic hybrid arrays: %v", err) } simicHybridArrays = &simicHybrid // Load Tabaxi data tabaxi, err := generators.LoadTabaxiArrays("data/tabaxi.json") if err != nil { log.Fatalf("Failed to load tabaxi arrays: %v", err) } tabaxiArrays = &tabaxi // Load Tiefling data tiefling, err := generators.LoadTieflingArrays("data/tiefling.json") if err != nil { log.Fatalf("Failed to load tiefling arrays: %v", err) } tieflingArrays = &tiefling // Load Tortle data tortle, err := generators.LoadTortleArrays("data/tortle.json") if err != nil { log.Fatalf("Failed to load tortle arrays: %v", err) } tortleArrays = &tortle // Load Triton data triton, err := generators.LoadTritonArrays("data/triton.json") if err != nil { log.Fatalf("Failed to load triton arrays: %v", err) } tritonArrays = &triton // Load Vedalken data vedalken, err := generators.LoadVedalkenArrays("data/vedalken.json") if err != nil { log.Fatalf("Failed to load vedalken arrays: %v", err) } vedalkenArrays = &vedalken // Load Verdan data verdan, err := generators.LoadVerdanArrays("data/verdan.json") if err != nil { log.Fatalf("Failed to load verdan arrays: %v", err) } verdanArrays = &verdan // Load Warforged data warforged, err := generators.LoadWarforgedArrays("data/warforged.json") if err != nil { log.Fatalf("Failed to load warforged arrays: %v", err) } warforgedArrays = &warforged // Load Wilden data wilden, err := generators.LoadWildenArrays("data/wilden.json") if err != nil { log.Fatalf("Failed to load wilden arrays: %v", err) } wildenArrays = &wilden // Load Yuan-Ti data yuanti, err := generators.LoadYuanTiArrays("data/yuan-ti.json") if err != nil { log.Fatalf("Failed to load yuan-ti arrays: %v", err) } yuantiArrays = &yuanti // Load Modern English data modernEnglish, err := generators.LoadModernEnglishArrays("data/modern-english.json") if err != nil { log.Fatalf("Failed to load modern english arrays: %v", err) } modernEnglishArrays = &modernEnglish // Load Modern Portuguese (EU) data modernPortugueseEU, err := generators.LoadModernPortugueseEUArrays("data/modern-portuguese.json") if err != nil { log.Fatalf("Failed to load modern portuguese (EU) arrays: %v", err) } modernPortugueseEUArrays = &modernPortugueseEU } // gender: male, female, child, or 0/1/2 func parseGender(param string) int { switch strings.ToLower(param) { case "male", "0": return 0 case "female", "1": return 1 case "child", "2": return 2 default: if g, err := strconv.Atoi(param); err == nil { return g } } return 0 } func getGender(r *http.Request) string { genderParam := r.URL.Query().Get("gender") if strings.ToLower(genderParam) == "female" || parseGender(genderParam) == 1 { return "female" } return "male" } // gender: 0=male, 1=female, 2=child (if supported) func ElfNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) var names []string for i := 0; i < 10; i++ { var nMs, baseName string if gender == "child" || parseGender(r.URL.Query().Get("gender")) == 2 { nMs = generators.ElfNameChild(elfArrays, CheckSwear) for nMs == "" { nMs = generators.ElfNameChild(elfArrays, CheckSwear) } } else { if i < 5 { rnd := rand.Intn(len(elfArrays.Nm12)) rnd2 := rand.Intn(len(elfArrays.Nm13)) for elfArrays.Nm12[rnd] == elfArrays.Nm13[rnd2] { rnd2 = rand.Intn(len(elfArrays.Nm13)) } nMs = elfArrays.Nm12[rnd] + elfArrays.Nm13[rnd2] } else { nMs = generators.ElfNameSur(elfArrays, CheckSwear) for nMs == "" { nMs = generators.ElfNameSur(elfArrays, CheckSwear) } } baseName = nMs if gender == "female" { nMs = generators.ElfNameFem(elfArrays, CheckSwear) for nMs == "" { nMs = generators.ElfNameFem(elfArrays, CheckSwear) } } else { nMs = generators.ElfNameMas(elfArrays, CheckSwear) for nMs == "" { nMs = generators.ElfNameMas(elfArrays, CheckSwear) } } nMs = nMs + " " + baseName } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func DwarfNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) var names []string for i := 0; i < 10; i++ { var nMs, baseName string if i < 5 { rnd := rand.Intn(len(dwarfArrays.Nm12)) rnd2 := rand.Intn(len(dwarfArrays.Nm13)) for dwarfArrays.Nm12[rnd] == dwarfArrays.Nm13[rnd2] { rnd2 = rand.Intn(len(dwarfArrays.Nm13)) } nMs = dwarfArrays.Nm12[rnd] + dwarfArrays.Nm13[rnd2] } else { nMs = generators.DwarfNameSur(dwarfArrays, CheckSwear) for nMs == "" { nMs = generators.DwarfNameSur(dwarfArrays, CheckSwear) } } baseName = nMs if gender == "female" { nMs = generators.DwarfNameFem(dwarfArrays, CheckSwear) for nMs == "" { nMs = generators.DwarfNameFem(dwarfArrays, CheckSwear) } } else { nMs = generators.DwarfNameMas(dwarfArrays, CheckSwear) for nMs == "" { nMs = generators.DwarfNameMas(dwarfArrays, CheckSwear) } } nMs = nMs + " " + baseName names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func ArakocraNamesHandler(w http.ResponseWriter, r *http.Request) { var names []string for i := 0; i < 10; i++ { nMs := generators.ArakocraNameMas(arakocraArrays, CheckSwear, i) for nMs == "" { nMs = generators.ArakocraNameMas(arakocraArrays, CheckSwear, i) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /aasimar-names?gender=male|female|0|1 func AasimarNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := "male" if parseGender(genderParam) == 1 { gender = "female" } var names []string for i := 0; i < 10; i++ { nMs := generators.GenerateAasimarName(gender) for nMs == "" { nMs = generators.GenerateAasimarName(gender) } if CheckSwear(nMs) { nMs = generators.GenerateAasimarName(gender) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func BugbearNamesHandler(w http.ResponseWriter, r *http.Request) { var names []string for i := 0; i < 10; i++ { nMs := generators.BugbearNameMas(bugbearArrays, CheckSwear) for nMs == "" { nMs = generators.BugbearNameMas(bugbearArrays, CheckSwear) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /centaur-names?gender=male|female|0|1 func CentaurNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := "male" if parseGender(genderParam) == 1 { gender = "female" } var names []string for i := 0; i < 10; i++ { nMs := generators.GenerateCentaurName(gender) for nMs == "" { nMs = generators.GenerateCentaurName(gender) } if CheckSwear(nMs) { nMs = generators.GenerateCentaurName(gender) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func ChangelingNamesHandler(w http.ResponseWriter, r *http.Request) { var names []string for i := 0; i < 10; i++ { nMs := generators.ChangelingNameMas(changelingArrays, CheckSwear) for nMs == "" { nMs = generators.ChangelingNameMas(changelingArrays, CheckSwear) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /deep-gnome-names?gender=male|female|0|1 func DeepGnomeNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := "male" if parseGender(genderParam) == 1 { gender = "female" } var names []string for i := 0; i < 10; i++ { nMs := generators.GenerateDeepGnomeName(gender) for nMs == "" { nMs = generators.GenerateDeepGnomeName(gender) } if CheckSwear(nMs) { nMs = generators.GenerateDeepGnomeName(gender) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /deva-names?gender=male|female|0|1 func DevaNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := "male" if parseGender(genderParam) == 1 { gender = "female" } var names []string for i := 0; i < 10; i++ { nMs := generators.GenerateDevaName(gender) for nMs == "" { nMs = generators.GenerateDevaName(gender) } if CheckSwear(nMs) { nMs = generators.GenerateDevaName(gender) } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /dragonborn-names?gender=male|female|surname|0|1|2 func DragonbornNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := "male" if parseGender(genderParam) == 1 { gender = "female" } else if strings.ToLower(genderParam) == "surname" || parseGender(genderParam) == 2 { gender = "surname" } var names []string for i := 0; i < 10; i++ { var nMs string switch gender { case "female": nMs = generators.DragonbornNameFem(dragonbornArrays, CheckSwear) for nMs == "" { nMs = generators.DragonbornNameFem(dragonbornArrays, CheckSwear) } case "surname": nMs = generators.DragonbornNameSur(dragonbornArrays, CheckSwear) for nMs == "" { nMs = generators.DragonbornNameSur(dragonbornArrays, CheckSwear) } default: nMs = generators.DragonbornNameMas(dragonbornArrays, CheckSwear) for nMs == "" { nMs = generators.DragonbornNameMas(dragonbornArrays, CheckSwear) } } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /drow-names?gender=male|female|surname|0|1|2&surname=true func DrowNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := genderParam if gender == "" { gender = "male" } var names []string for i := 0; i < 10; i++ { first := generators.DrowName(gender, "false") surname := generators.DrowSurname() fullName := titleCaser.String(first + " " + surname) for CheckSwear(fullName) { first = generators.DrowName(gender, "false") surname = generators.DrowSurname() fullName = titleCaser.String(first + " " + surname) } names = append(names, fullName) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func DuergarNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) var names []string for i := 0; i < 10; i++ { fullName := generators.DuergarNameFull(duergarArrays, gender, CheckSwear) for fullName == "" { fullName = generators.DuergarNameFull(duergarArrays, gender, CheckSwear) } names = append(names, titleCaser.String(fullName)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func EladrinNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) var names []string for i := 0; i < 10; i++ { var nMs string if gender == "female" { nMs = generators.EladrinNameFem(eladrinArrays, CheckSwear) for nMs == "" { nMs = generators.EladrinNameFem(eladrinArrays, CheckSwear) } } else { nMs = generators.EladrinNameMas(eladrinArrays, CheckSwear) for nMs == "" { nMs = generators.EladrinNameMas(eladrinArrays, CheckSwear) } } names = append(names, titleCaser.String(nMs)) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func FairyNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateFairyNames(*fairyArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GenasiNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateGenasiNames(*genasiArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GithyankiNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateGithyankiNames(githyankiArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GithzeraiNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateGithzeraiNames(githzeraiArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GnomeNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateGnomeNames(gnomeArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GoblinNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateGoblinNames(goblinArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GoliathNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateGoliathNames(goliathArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } func GrungNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateGrungNames(grungArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /half-elf-names?gender=male|female|0|1 func HalfElfNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateHalfElfNames(halfElfArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /half-orc-names?gender=male|female|0|1 func HalfOrcNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateHalfOrcNames(halfOrcArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /halfling-names?gender=male|female|0|1 func HalflingNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateHalflingNames(halflingArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /harengon-names?gender=male|female|0|1 func HarengonNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateHarengonNames(harengonArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /hobgoblin-names func HobgoblinNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateHobgoblinNames(hobgoblinArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /human-names?gender=male|female|0|1 func HumanNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateHumanNames(humanArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /kalashtar-names?gender=male|female|0|1 func KalashtarNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateKalashtarNames(kalashtarArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /kenku-names func KenkuNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateKenkuNames(kenkuArrays) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /kobold-names func KoboldNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateKoboldNames(koboldArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /leonin-names?gender=male|female|0|1 func LeoninNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateLeoninNames(leoninArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /lizardfolk-names?gender=male|female|0|1 func LizardfolkNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateLizardfolkNames(lizardfolkArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /locathah-names func LocathahNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateLocathahNames(locathahArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /loxodon-names?gender=male|female|0|1 func LoxodonNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateLoxodonNames(loxodonArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /minotaur-names?gender=male|female|0|1 func MinotaurNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateMinotaurNames(minotaurArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /orc-names?gender=male|female|0|1 func OrcNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateOrcNames(orcArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /satyr-names?gender=male|female|child|0|1|2 func SatyrNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateSatyrNames(satyrArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /shadar-kai-names?gender=male|female|0|1 func ShadarKaiNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateShadarKaiNames(shadarKaiArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /shardmind-names func ShardmindNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateShardmindNames(shardmindArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /shifter-names?gender=male|female|0|1 func ShifterNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateShifterNames(shifterArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /simic-hybrid-names?gender=male|female|0|1 func SimicHybridNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateSimicHybridNames(simicHybridArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /tabaxi-names?gender=male|female|0|1 func TabaxiNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateTabaxiNames(tabaxiArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /tiefling-names?gender=male|female|virtue|0|1|2 func TieflingNamesHandler(w http.ResponseWriter, r *http.Request) { genderParam := r.URL.Query().Get("gender") gender := "male" if genderParam == "female" || parseGender(genderParam) == 1 { gender = "female" } else if genderParam == "virtue" || parseGender(genderParam) == 2 { gender = "virtue" } names := generators.GenerateTieflingNames(tieflingArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /tortle-names func TortleNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateTortleNames(tortleArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /triton-names?gender=male|female|0|1 func TritonNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateTritonNames(tritonArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /vedalken-names?gender=male|female|0|1 func VedalkenNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateVedalkenNames(vedalkenArrays, gender, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /verdan-names func VerdanNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateVerdanNames(verdanArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /warforged-names func WarforgedNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateWarforgedNames(warforgedArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /wilden-names func WildenNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) names := generators.GenerateWildenNames(wildenArrays, CheckSwear, gender) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /yuan-ti-names func YuanTiNamesHandler(w http.ResponseWriter, r *http.Request) { names := generators.GenerateYuanTiNames(yuantiArrays, CheckSwear) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /modern/english?type=0|1|2 func ModernEnglishNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) typeInt := 0 switch gender { case "female": typeInt = 1 case "unisex": typeInt = 2 } names := generators.GenerateModernEnglishNames(modernEnglishArrays, CheckSwear, typeInt) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) } // /modern/portuguese-eu?type=0|1|2 func ModernPortugueseNamesHandler(w http.ResponseWriter, r *http.Request) { gender := getGender(r) typeInt := 0 switch gender { case "female": typeInt = 1 case "unisex": typeInt = 2 } names := generators.GenerateModernPortugueseEUNames(modernPortugueseEUArrays, CheckSwear, typeInt) for i := range names { names[i] = titleCaser.String(names[i]) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string][]string{"names": names}) }