package generators import ( "encoding/json" "math/rand" "os" "time" ) type VedalkenArrays struct { Nm1 []string `json:"nm1"` Nm2 []string `json:"nm2"` Nm3 []string `json:"nm3"` Nm4 []string `json:"nm4"` Nm5 []string `json:"nm5"` Nm6 []string `json:"nm6"` Nm7 []string `json:"nm7"` Nm8 []string `json:"nm8"` Nm9 []string `json:"nm9"` Nm10 []string `json:"nm10"` Nm11 []string `json:"nm11"` Nm12 []string `json:"nm12"` } func LoadVedalkenArrays(path string) (VedalkenArrays, error) { var arr VedalkenArrays file, err := os.Open(path) if err != nil { return arr, err } defer file.Close() decoder := json.NewDecoder(file) if err := decoder.Decode(&arr); err != nil { return arr, err } return arr, nil } func vedalkenNameMas(a VedalkenArrays, r *rand.Rand) string { nTp := r.Intn(3) rnd := r.Intn(len(a.Nm1)) rnd2 := r.Intn(len(a.Nm2)) rnd3 := r.Intn(len(a.Nm3)) rnd4 := r.Intn(len(a.Nm2)) rnd5 := r.Intn(len(a.Nm5)) if nTp < 2 { for a.Nm1[rnd] == a.Nm3[rnd3] || a.Nm3[rnd3] == a.Nm5[rnd5] { rnd3 = r.Intn(len(a.Nm3)) } return a.Nm1[rnd] + a.Nm2[rnd2] + a.Nm3[rnd3] + a.Nm2[rnd4] + a.Nm5[rnd5] } else { rnd6 := r.Intn(len(a.Nm2)) rnd7 := r.Intn(len(a.Nm4)) for a.Nm4[rnd7] == a.Nm3[rnd3] || a.Nm4[rnd7] == a.Nm5[rnd5] { rnd7 = r.Intn(len(a.Nm4)) } return a.Nm1[rnd] + a.Nm2[rnd2] + a.Nm3[rnd3] + a.Nm2[rnd4] + a.Nm4[rnd7] + a.Nm2[rnd6] + a.Nm5[rnd5] } } func vedalkenNameFem(a VedalkenArrays, r *rand.Rand) string { nTp := r.Intn(3) rnd := r.Intn(len(a.Nm6)) rnd2 := r.Intn(len(a.Nm7)) rnd3 := r.Intn(len(a.Nm8)) rnd4 := r.Intn(len(a.Nm11)) rnd5 := r.Intn(len(a.Nm12)) if rnd2 < 4 { for rnd4 < 3 { rnd4 = r.Intn(len(a.Nm11)) } } if nTp < 2 { for a.Nm6[rnd] == a.Nm8[rnd3] || a.Nm8[rnd3] == a.Nm12[rnd5] { rnd3 = r.Intn(len(a.Nm8)) } return a.Nm6[rnd] + a.Nm7[rnd2] + a.Nm8[rnd3] + a.Nm11[rnd4] + a.Nm12[rnd5] } else { rnd6 := r.Intn(len(a.Nm9)) rnd7 := r.Intn(len(a.Nm10)) for a.Nm10[rnd7] == a.Nm8[rnd3] || a.Nm10[rnd7] == a.Nm12[rnd5] { rnd7 = r.Intn(len(a.Nm10)) } return a.Nm6[rnd] + a.Nm7[rnd2] + a.Nm8[rnd3] + a.Nm9[rnd6] + a.Nm10[rnd7] + a.Nm11[rnd4] + a.Nm12[rnd5] } } func GenerateVedalkenNames(arr *VedalkenArrays, gender string, swearFilter func(string) bool) []string { names := make([]string, 0, 10) r := rand.New(rand.NewSource(time.Now().UnixNano())) for i := 0; i < 10; i++ { var n string if gender == "female" { n = vedalkenNameFem(*arr, r) } else { n = vedalkenNameMas(*arr, r) } for n == "" || swearFilter(n) { if gender == "female" { n = vedalkenNameFem(*arr, r) } else { n = vedalkenNameMas(*arr, r) } } names = append(names, n) } return names }