# HG changeset patch # User MrJuneJune # Date 1764651610 28800 # Node ID c2706ffb442be48cc04f92ad3016938397bf8a90 # Parent d2bb317e01db09044d9bf2a7236ab359ed7fff78 [Gara] Peer to peer chat terminal app using go. diff -r d2bb317e01db -r c2706ffb442b gara/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gara/README.md Mon Dec 01 21:00:10 2025 -0800 @@ -0,0 +1,7 @@ +# Go + +Main page: https://go.dev/ + +Install link linux: https://go.dev/dl/go1.25.4.linux-amd64.tar.gz + +Where to install: /usr/local/go diff -r d2bb317e01db -r c2706ffb442b gara/gara Binary file gara/gara has changed diff -r d2bb317e01db -r c2706ffb442b gara/go.mod --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gara/go.mod Mon Dec 01 21:00:10 2025 -0800 @@ -0,0 +1,9 @@ +module gara + +go 1.25.4 + +require ( + golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect + rsc.io/quote v1.5.2 // indirect + rsc.io/sampler v1.3.0 // indirect +) diff -r d2bb317e01db -r c2706ffb442b gara/go.sum --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gara/go.sum Mon Dec 01 21:00:10 2025 -0800 @@ -0,0 +1,6 @@ +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y= +rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff -r d2bb317e01db -r c2706ffb442b gara/main.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gara/main.go Mon Dec 01 21:00:10 2025 -0800 @@ -0,0 +1,139 @@ +package main + +import ( + "fmt" + "bytes" + "net" +) + +type Client struct { + name string + conn net.Conn + message []byte +} + +var clients map[string]Client = make(map[string]Client) +var allowedCharacters = map[byte]bool{ + 'a': true, 'b': true, 'c': true, 'd': true, 'e': true, + 'f': true, 'g': true, 'h': true, 'i': true, 'j': true, + 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, + 'p': true, 'q': true, 'r': true, 's': true, 't': true, + 'u': true, 'v': true, 'w': true, 'x': true, 'y': true, 'z': true, + 'A': true, 'B': true, 'C': true, 'D': true, 'E': true, + 'F': true, 'G': true, 'H': true, 'I': true, 'J': true, + 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, + 'P': true, 'Q': true, 'R': true, 'S': true, 'T': true, + 'U': true, 'V': true, 'W': true, 'X': true, 'Y': true, 'Z': true, +} + +func IsChacterAllowed(chars []byte) bool { + for _, b := range chars { + if !allowedCharacters[b] { + return false + } + } + return true +} + +func ResetClient(client Client) { + ResetClientMessage(client) + delete(clients, client.conn.RemoteAddr().String()) + client.conn.Close() +} + +func ResetClientMessage(client Client) { + for i := range client.message { + client.message[i] = 0 + } +} + +func Loggers(value string) { + fmt.Println(value) +} + +func SendString(client Client, value string) { + fmt.Println("Notifying User: ", client.name) + client.conn.Write(([]byte)(value+"\n")) +} + +func SendToAll(currentClient Client) { + for key, client := range clients { + if currentClient.conn.RemoteAddr().String() == key { + continue + } + formattedMessage := fmt.Sprintf("%v: %v", currentClient.name, (string)(currentClient.message)) + SendString(client, formattedMessage) + } +} + +func HandleConnection(conn net.Conn) { + client := Client{name: "unknown", conn: conn, message: make([]byte, 100)} + defer ResetClient(client) + + SendString(client, "Hello good sir. What is your name?(less than 100 character and no special characters)\n") + for { + _, err := conn.Read(client.message) + if err != nil { + SendString(client, "Something went wrong. Try again.") + continue + } + + for i := 0; i < len(client.message) - 1; i++ { + if (string)(client.message[i:i+2]) == "\r\n" { + client.name = (string)(client.message[:i]) + break; + } + } + + if !IsChacterAllowed(([]byte)(client.name)) { + SendString(client, "Only allow alphabets.") + continue + } + if client.name[0] == (byte)('\r') { + continue + } + ResetClientMessage(client) + break + } + + clients[client.conn.RemoteAddr().String()] = client + + // Hnadle all messages. + for { + err_n := 0 + + if err_n > 10 { + break; + } + + _, err := conn.Read(client.message) + if err != nil { + Loggers("Something went wrong") + err_n += 1 + } + if bytes.Equal(([]byte)("close"), client.message[:5]) { + break + } else { + fmt.Println("Working....") + SendToAll(client) + } + } +} + +func main() { + PORT := ":4200"; + server_conn, err := net.Listen("tcp", PORT) + fmt.Println("Running on ", server_conn.Addr().String()) + + if err != nil { + Loggers("Couldn't run the server") + } + for { + conn, err := server_conn.Accept() + if err != nil { + Loggers("Couldn't accept a client") + } + go HandleConnection(conn) + } +} +