diff --git a/chatserver.go b/chatserver.go index 3e01eed..b7e2fbb 100644 --- a/chatserver.go +++ b/chatserver.go @@ -92,7 +92,7 @@ var broadcastMsg chan chatMsg // Telnet var wantsServerHello chan bufferedConn var authTelnet chan telnetUser -var cleanTelnet chan telnetUser +var cleanTelnet chan telnetUser // intentionally blocking // HTTP var demuxHttpClient chan bufferedConn @@ -101,7 +101,7 @@ var valAuthReqs chan authReq var delAuthReqs chan authReq func usage() { - fmt.Fprintf(os.Stderr, "\nusage: go run chatserver.go\n") + fmt.Fprintf(os.Stderr, "\nusage: go run chatserver*.go\n") flag.PrintDefaults() fmt.Println() @@ -301,7 +301,7 @@ func main() { virginConns = make(chan net.Conn, 128) // TCP & Authentication - telnetConns := make(map[bufferedConn]telnetUser) + telnetConns := make(map[string]telnetUser) wantsServerHello = make(chan bufferedConn, 128) authTelnet = make(chan telnetUser, 128) @@ -389,7 +389,12 @@ func main() { case u := <-authTelnet: // allow to receive messages // (and be counted among the users) - telnetConns[u.bufConn] = u + _, ok := telnetConns[u.email] + if ok { + // this is a blocking channel, and that's important + cleanTelnet <- telnetConns[u.email] + } + telnetConns[u.email] = u // is chan chan the right way to handle this? u.userCount <- len(telnetConns) broadcastMsg <- chatMsg{ @@ -422,7 +427,7 @@ func main() { close(u.newMsg) // we can safely ignore this error, if any u.bufConn.Close() - delete(telnetConns, u.bufConn) + delete(telnetConns, u.email) case bufConn := <-gotClientHello: go muxTcp(bufConn) case bufConn := <-demuxHttpClient: