package ctfc import ( "fmt" "os" "os/exec" "runtime" "strings" "gitlab.com/Syndamia/ctfc/go-src/ui" ) func StartupWindow(...string) { clearScreen() fmt.Println(ui.NormalBox(true, "Login", "Register")) fmt.Print(ui.InputField("[L/R]")) command := strings.ToLower(ui.GetInput()) if command == "l" { defer loginWindow() } else if command == "r" { defer registerWindow() } else { defer showError(invalidCommand, StartupWindow) } } func loginWindow(values ...string) { clearScreen() fmt.Println(ui.NormalBox(true, "Login")) switch len(values) { case 0: fmt.Print(ui.InputField("Username")) case 1: fmt.Println(ui.InputFieldFilled("Username", values[0])) fmt.Print(ui.InputField("Password")) } val := ui.GetInput() if len(values) == 0 { defer loginWindow(val) } else if logInUser(values[0], val) { defer chatsWindow() } else { defer showError(invalidCredentials, loginWindow, values...) } } func registerWindow(values ...string) { clearScreen() fmt.Println(ui.NormalBox(true, "Register")) var validationF func(string) bool var fieldName, specification string switch len(values) { case 0: validationF, fieldName, specification = stringValidUsername, "Username", "[A-z, 0-9, *, ., _, -; at least 1 letter]" case 1: fmt.Println(ui.InputFieldFilled("Username", values[0])) validationF, fieldName, specification = stringValidPassword, "Password", "[5-40 characters; at least 1 number]" case 2: fmt.Println(ui.InputFieldFilled("Username", values[0])) fmt.Println(ui.InputFieldFilled("Password", values[1])) validationF, fieldName, specification = stringValidName, "Name", "[2-60 characters]" } fmt.Print(ui.InputField(fieldName + " " + specification)) val := ui.GetInput() if validationF(val) { values = append(values, val) // When user has entered all required values if len(values) == 3 { createUser(values) logInUser(values[0], values[1]) defer chatsWindow() } else { // When there are still values to be given defer registerWindow(values...) } } else { defer showError(invalidValueFor(fieldName), registerWindow, values...) } } func chatsWindow(values ...string) { clearScreen() fmt.Println(ui.NormalBox(true, "Direct Messages", "Account", "Logout")) fmt.Println(ui.PageField(0, 0)) fmt.Println(ui.EmptyLine()) if len(values) > 0 { if values[len(values)-1] == "ShowHelp" { fmt.Println(ui.TextField("Chats page options: [(D)irect messages/(A)ccount/(L)ogout/(<) for previous page/(>) for next page/(C) for create chat/(name) for go to chat room by name/(number) for go to chat room by number/(H)elp]")) } } fmt.Print(ui.InputField("[D/A/L//C/E/name/number/H]")) val := ui.GetInput() handled := handleInputActions(val, true, inputAction{"H", chatsWindow, []string{"ShowHelp"}}, ) if !handled { defer showError(invalidCommand, chatsWindow) } } type inputAction struct { value string execute func(...string) args []string } func handleInputActions(input string, handleNav bool, ia ...inputAction) bool { if handleNav { ia = append(ia, inputAction{"C", chatsWindow, nil}, inputAction{"D", chatsWindow, nil}, inputAction{"A", chatsWindow, nil}, inputAction{"L", chatsWindow, nil}, ) } for _, v := range ia { if input == v.value { defer v.execute(v.args...) return true } } return false } var clearNext = true func showError(message string, callback func(...string), callbackData ...string) { clearScreen() fmt.Println(ui.ErrorBox(message)) clearNext = false defer callback(callbackData...) } func clearScreen() { if !clearNext { clearNext = true return } if runtime.GOOS == "windows" { cmd := exec.Command("cmd", "/c", "cls") cmd.Stdout = os.Stdout cmd.Run() } else { fmt.Println("\033[2J") } }