Mercurial
view gara/main.go @ 51:68fa88ac73fe
Interview prep for xAI
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Mon, 15 Dec 2025 19:55:17 -0800 |
| parents | c2706ffb442b |
| children |
line wrap: on
line source
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) } }