package sircd import ( "log" "net" "os" "container/list" ) type sircd struct { Running bool log *log.Logger netName string ircPort uint16 httpPort uint16 ircListener net.Listener ircClients *list.List } const ( CONN_HOST = "localhost" CONN_PORT = "6667" CONN_TYPE = "tcp" ) func NewSircd() *sircd { s := new(sircd) s.Running = true s.ircClients = list.New() return s } func (s *sircd) SetLogger(l *log.Logger) { s.log = l } func (s *sircd) startIRCServer() { var err error s.ircListener, err = net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT) if err != nil { log.Println("Error listening:", err.Error()) os.Exit(1) } defer s.ircListener.Close() s.log.Println("Listening for irc on " + CONN_HOST + ":" + CONN_PORT) for { // Listen for an incoming connection. conn, err := s.ircListener.Accept() if err != nil { s.log.Fatalf("Error accepting: ", err.Error()) } // Handle connections in a new goroutine. go s.handleIRCConnection(conn) } } func (s *sircd) processIRC() { for { s.readFromClients() } } func (s *sircd) readFromClients() { for e := s.ircClients.Front(); e != nil; e = e.Next() { client := e.Value.(clientIRCConnection) client.ReadSocket() client.ParseMessages() } } func (s *sircd) Start() { go s.startIRCServer() } func (s *sircd) handleIRCConnection(conn net.Conn) { c := newClientIRCConnection(conn, s.log) s.ircClients.PushBack(c) }