gotel

simple terminal chat program
git clone git://git.mdnr.space/gotel
Log | Files | Refs | README | LICENSE

commit 6f59b78e2f686dd95a96076ed7444c18ec810ba9
parent bf2041b4a74dc3e5572b2163e3314592463a6693
Author: mdnrz <mehdeenoroozi@gmail.com>
Date:   Tue,  8 Apr 2025 00:56:04 +0330

use maps for client lookup; insert author username in messages

Diffstat:
Mhello.go | 38++++++++++++++++++++++----------------
1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/hello.go b/hello.go @@ -4,7 +4,7 @@ import ( "log" "net" "time" - "slices" + "strings" ) type msgType int @@ -52,31 +52,37 @@ func client(conn net.Conn, Client_q chan Client) { } func server(Client_q chan Client) { - clientsOnline := []Client{} - clientsOffline := []Client{} + clientsOnline := make(map[string]Client) + clientsOffline := make(map[string]Client) for { client := <-Client_q + keyString := client.Conn.RemoteAddr().String(); switch client.Request { case msgConnect: - log.Printf("Got login request from %s\n", client.Conn.RemoteAddr().String()); - clientsOffline = append(clientsOffline, client) + log.Printf("Got login request from %s\n", keyString); + clientsOffline[keyString] = client; case msgText: - // TODO: This loop can be avoided by adding a `loggedIn` boolean to client - for index, clientOffline := range clientsOffline { - if clientOffline.Conn == client.Conn { - clientOffline.UserName = client.Text; - log.Printf("logging in %s\n", clientOffline.UserName); - clientsOnline = append(clientsOnline, clientOffline); - clientsOffline = slices.Delete(clientsOffline, index, index+1); + clientOffline, ok := clientsOffline[keyString]; + if ok { + clientOffline.UserName = strings.TrimRight(client.Text, "\r\n"); + log.Printf("logging in %s\n", clientOffline.UserName); + clientsOnline[keyString] = clientOffline; + delete(clientsOffline, keyString); + _, err := clientsOnline[keyString].Conn.Write([]byte("Welcome " + clientsOnline[keyString].UserName + "\n\n")); + if err != nil { + log.Printf("Could not send message to client %s\n", clientsOnline[keyString].UserName) } + break; } - for index, clientOnline := range clientsOnline { - if clientOnline.Conn == client.Conn { + author, _ := clientsOnline[keyString]; + author.Text = client.Text; + for _, value := range clientsOnline { + if value.Conn == author.Conn { continue } - _, err := clientOnline.Conn.Write([]byte(clientOnline.UserName + ": " + client.Text)) + _, err := value.Conn.Write([]byte(author.UserName + ": " + author.Text)) if err != nil { - log.Printf("Could not send message to client %s\n", clientOnline.UserName) + log.Printf("Could not send message to client %s\n", value.UserName) } } }