package main import ( "net"; "log"; "strings"; "irc"; "bufio"; ) var ( users = make(map[net.Conn]map[string]string); sem = make(chan int, 1); ) const welcomeMessage = "Welcome to the IRC Server\n" func getConnections(listener *net.TCPListener, ch chan net.Conn) { for { tmp, _ := listener.Accept(); ch <- tmp; } } func getConnFromUsername(username string) net.Conn { for key, value := range users { if value["nickname"] == username { return key } } return nil; } func registerNickname(nickname string, conn net.Conn) { sem <- 1; users[conn] = map[string]string{"nickname": nickname}; log.Stdoutf("%s HAS REGISTERED A NICK\n", users[conn]["nickname"]); <-sem; } func sendMessage(message string, conn net.Conn, sendNickname string) { conn.Write(strings.Bytes(":" + sendNickname + " PRIVMSG :" + message)) } func parseLine(line string, conn net.Conn) { msg := irc.ParseMessage(line); switch msg.Command { case "PRIVMSG": nickname := msg.Args[0]; message := msg.LastArg; otherUserConn := getConnFromUsername(nickname); senderNickname := users[conn]["nickname"]; sendMessage(message, otherUserConn, senderNickname); case "NICK": nickname := msg.Args[0]; registerNickname(nickname, conn); } } func handleConnection(conn net.Conn) { //registerUser(conn); buf := bufio.NewReader(conn); buf.ReadString('\n'); nick, _ := buf.ReadString('\n'); nick = nick[0:len(nick) - 2]; registerNickname(strings.Split(nick, " ", 0)[1], conn); for { line, err := buf.ReadString('\n'); line = line[0:len(line) - 2]; if err == nil { parseLine(users[conn]["nickname"] + " " + line, conn); } else { log.Stdoutf("ERROR READING FROM CONNECTION %v: %s\n", conn, err); break; } } } func main() { addr, _ := net.ResolveTCPAddr("localhost:6667"); listener, _ := net.ListenTCP("tcp", addr); conChan := make(chan net.Conn); log.Stdout("STARTING SERVER..."); go getConnections(listener, conChan); for { con := <-conChan; log.Stdout("Connection accepted:", con.RemoteAddr().String()); go handleConnection(con); } }