aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSyndamia <kamen.d.mladenov@protonmail.com>2021-07-09 13:58:13 +0300
committerSyndamia <kamen.d.mladenov@protonmail.com>2021-07-09 13:58:13 +0300
commit366a50ac99594311268512e6fe3e158a63793683 (patch)
treecffc5fa3525715e3e8b0f353df60515fb0042f68
parentf0c2a9ea2f7bd7cf8cee14c6184a7998c8aad89b (diff)
downloadctfc-366a50ac99594311268512e6fe3e158a63793683.tar
ctfc-366a50ac99594311268512e6fe3e158a63793683.tar.gz
ctfc-366a50ac99594311268512e6fe3e158a63793683.zip
Implemented going back in pages that use forms and implemented basic creation and getting of chats
-rw-r--r--go-src/chat.go33
-rw-r--r--go-src/dataValidations.go21
-rw-r--r--go-src/utils/utils.go7
-rw-r--r--go-src/windows.go51
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)