diff options
| -rw-r--r-- | go-src/chat.go | 33 | ||||
| -rw-r--r-- | go-src/dataValidations.go | 21 | ||||
| -rw-r--r-- | go-src/utils/utils.go | 7 | ||||
| -rw-r--r-- | go-src/windows.go | 51 |
4 files changed, 102 insertions, 10 deletions
diff --git a/go-src/chat.go b/go-src/chat.go new file mode 100644 index 0000000..18a9200 --- /dev/null +++ b/go-src/chat.go @@ -0,0 +1,33 @@ +package ctfc + +import ( + "bytes" + "os" + + "gitlab.com/Syndamia/ctfc/go-src/folderPaths" + "gitlab.com/Syndamia/ctfc/go-src/utils" +) + +type Chat struct { + Name string + Description string + Owner User + Messages []string +} + +func (ch Chat) addMessage(value string) { + ch.Messages = append(ch.Messages, value) + os.WriteFile(folderPaths.FileAtChatsFolder(ch.Name), []byte(value), 0644) +} + +func createChat(data ...string) { + f, _ := os.Create(folderPaths.FileAtChatsFolder(data[0])) + f.WriteString(data[0] + "\n" + data[1] + "\n" + data[2]) + f.Close() +} + +func getChat(name string) Chat { + f, _ := os.ReadFile(folderPaths.FileAtChatsFolder(name)) + values := bytes.Split(f, []byte("\n")) + return Chat{string(values[0]), string(values[1]), getUser(string(values[2])), utils.TwoDByteArrayToStringArray(values[3:])} +} diff --git a/go-src/dataValidations.go b/go-src/dataValidations.go index b391eb3..34c6f03 100644 --- a/go-src/dataValidations.go +++ b/go-src/dataValidations.go @@ -37,19 +37,38 @@ func stringValidRuneAmount(value string, runeStart rune, runeEnd rune, minAmount return sum >= minAmount } +func atLeastOneLetter(value string) bool { + return stringValidRuneAmount(value, 'A', 'Z', 1) || stringValidRuneAmount(value, 'a', 'z', 1) +} + +// Between 2 and 40 characters (A-z, 0-9, ., *, _, -, at least one letter) func stringValidUsername(value string) bool { return stringValidLength(2, 40, value) && stringValidCharacters(value, true, true, '.', '*', '_', '-') && - (stringValidRuneAmount(value, 'A', 'Z', 1) || stringValidRuneAmount(value, 'a', 'z', 1)) + atLeastOneLetter(value) } +// Between 5 and 40 characters (any character, but at least one number) func stringValidPassword(value string) bool { return stringValidLength(5, 40, value) && stringValidCharacters(value, true, true, SpecialCharacters...) && stringValidRuneAmount(value, '0', '9', 1) } +// Between 2 and 60 characters (A-z, spaces, ', -) func stringValidName(value string) bool { return stringValidLength(2, 60, value) && stringValidCharacters(value, true, false, ' ', '\'', '-') } + +// Between 2 and 20 characters (A-z, 0-9, spaces, \_, -, at least one letter) +func stringValidChatName(value string) bool { + return stringValidLength(2, 20, value) && + stringValidCharacters(value, true, true, ' ', '_', '-') && + atLeastOneLetter(value) +} + +// Between 0 and 30 characters (any character) +func stringValidChatDesc(value string) bool { + return stringValidLength(0, 30, value) +} diff --git a/go-src/utils/utils.go b/go-src/utils/utils.go index 673f749..f50ab50 100644 --- a/go-src/utils/utils.go +++ b/go-src/utils/utils.go @@ -16,3 +16,10 @@ func ReplaceAtIndex(in string, r rune, i int) string { out[i] = r return string(out) } + +func TwoDByteArrayToStringArray(in [][]byte) (result []string) { + for _, v := range in { + result = append(result, string(v)) + } + return +} diff --git a/go-src/windows.go b/go-src/windows.go index d442287..183849e 100644 --- a/go-src/windows.go +++ b/go-src/windows.go @@ -10,6 +10,8 @@ import ( "gitlab.com/Syndamia/ctfc/go-src/ui" ) +type window func(...string) + func StartupWindow(...string) { clearScreen() @@ -26,11 +28,14 @@ func StartupWindow(...string) { } func loginWindow(values ...string) { - inputs := formWindow("Login", []formInput{ - {"Username", "", nil}, + inputs := formWindow("Login", StartupWindow, []formInput{ + {"Username", " or [B for Back to start page]", nil}, {"Password", "", nil}, }, values..., ) + if len(inputs) == 0 { + return + } if logInUser(inputs[0], inputs[1]) { defer chatsWindow() @@ -40,12 +45,15 @@ func loginWindow(values ...string) { } func registerWindow(values ...string) { - inputs := formWindow("Register", []formInput{ - {"Username", " [A-z, 0-9, *, ., _, -; at least 1 letter]", stringValidUsername}, + inputs := formWindow("Register", StartupWindow, []formInput{ + {"Username", " [A-z, 0-9, *, ., _, -; at least 1 letter] or [B for Back to start page]", stringValidUsername}, {"Password", " [5-40 characters; at least 1 number]", stringValidPassword}, {"Name", " [2-60 characters]", stringValidName}, }, values..., ) + if len(inputs) == 0 { + return + } createUser(inputs) logInUser(inputs[0], inputs[1]) @@ -67,6 +75,7 @@ func chatsWindow(values ...string) { input := ui.InputField("[D/A/L/</>/C/E/name/number/H]") handled := handleInputActions(input, true, + inputAction{"C", createChatWindow, nil}, inputAction{"H", chatsWindow, []string{"ShowHelp"}}, ) if !handled { @@ -74,6 +83,25 @@ func chatsWindow(values ...string) { } } +func createChatWindow(values ...string) { + inputs := formWindow("Creating a new chat", chatsWindow, []formInput{ + {"Name", " [2-20 characters; A-z, 0-9, spaces, _, -] or [B for Back to chats page]", stringValidChatName}, + {"Description", " [0-30 characters]", stringValidChatDesc}, + }, values..., + ) + if len(inputs) == 0 { + return + } + + createChat(inputs[0], inputs[1], loggedInUser.Username) + defer chatWindow(inputs[0]) +} + +func chatWindow(values ...string) { + currChat := getChat(values[0]) + fmt.Println(currChat) +} + func logoutWindow(...string) { clearScreen() @@ -98,9 +126,9 @@ type formInput struct { validationFunc func(string) bool } -func formWindow(boxTitle string, formInputs []formInput, currentValues ...string) (userInputs []string) { +func formWindow(boxTitle string, backWindow window, formInputs []formInput, currentValues ...string) (userInputs []string) { userInputs = currentValues - for _, v := range formInputs[len(currentValues):] { + for i, v := range formInputs[len(currentValues):] { clearScreen() ui.NormalBox(true, boxTitle) @@ -111,10 +139,15 @@ func formWindow(boxTitle string, formInputs []formInput, currentValues ...string input := ui.InputField(v.name + v.specification) + if i == 0 && backWindow != nil && strings.ToLower(input) == "b" { + defer backWindow() + return + } + if v.validationFunc != nil { if !v.validationFunc(input) { formCallback := func(...string) { - defer formWindow(boxTitle, formInputs, userInputs...) + defer formWindow(boxTitle, backWindow, formInputs, userInputs...) } defer showError(invalidValueFor(v.name), formCallback) return @@ -130,7 +163,7 @@ func formWindow(boxTitle string, formInputs []formInput, currentValues ...string type inputAction struct { value string - execute func(...string) + execute window args []string } @@ -156,7 +189,7 @@ func handleInputActions(input string, handleNav bool, ia ...inputAction) bool { var clearNext = true -func showError(message string, callback func(...string), callbackData ...string) { +func showError(message string, callback window, callbackData ...string) { clearScreen() ui.ErrorBox(message) |
