sircd/sircd/server.go

97 lines
2.0 KiB
Go
Raw Normal View History

2019-08-19 23:30:59 +00:00
package sircd
import (
2019-08-20 02:15:56 +00:00
"github.com/sirupsen/logrus"
2019-08-19 23:30:59 +00:00
"net"
)
type sircd struct {
2019-08-20 02:15:56 +00:00
Running bool
2019-08-21 06:15:12 +00:00
serverName string
2019-08-20 02:15:56 +00:00
log *logrus.Logger
netName string
ircPort uint16
httpPort uint16
ircListener net.Listener
ircClients map[*ircClient]bool
newClients chan *ircClient
deadClients chan *ircClient
messageQueue chan *ircMessage
2019-08-19 23:30:59 +00:00
}
const (
CONN_HOST = "localhost"
CONN_PORT = "6667"
CONN_TYPE = "tcp"
)
func NewSircd() *sircd {
s := new(sircd)
2019-08-20 00:50:40 +00:00
s.Running = true
2019-08-20 02:15:56 +00:00
s.ircClients = make(map[*ircClient]bool)
2019-08-19 23:30:59 +00:00
return s
}
2019-08-21 06:15:12 +00:00
func (s *sircd) SetLogger(logger *logrus.Logger) {
s.log = logger
}
func (s *sircd) SetServerName(name string) {
s.serverName = name
2019-08-19 23:56:27 +00:00
}
2019-08-20 02:15:56 +00:00
func (s *sircd) Start() {
s.newClients = make(chan *ircClient, 128)
s.deadClients = make(chan *ircClient, 128)
s.messageQueue = make(chan *ircMessage, 128)
2019-08-20 00:50:40 +00:00
var err error
2019-08-19 23:30:59 +00:00
s.ircListener, err = net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
2019-08-20 00:50:40 +00:00
if err != nil {
2019-08-20 02:15:56 +00:00
s.log.Fatalln("Error listening:", err.Error())
2019-08-20 00:50:40 +00:00
}
s.log.Println("Listening for irc on " + CONN_HOST + ":" + CONN_PORT)
2019-08-19 23:30:59 +00:00
2019-08-20 02:15:56 +00:00
go func() {
2019-08-19 23:30:59 +00:00
conn, err := s.ircListener.Accept()
if err != nil {
2019-08-20 02:15:56 +00:00
s.log.Panicf("Error accepting: ", err.Error())
2019-08-19 23:30:59 +00:00
}
2019-08-21 06:15:12 +00:00
s.newClients <- newIrcClient(conn, s.log, s.messageQueue, s)
2019-08-20 02:15:56 +00:00
}()
2019-08-20 00:50:40 +00:00
2019-08-20 02:15:56 +00:00
go s.mainloop()
2019-08-19 23:30:59 +00:00
}
2019-08-20 02:15:56 +00:00
func (s *sircd) mainloop() {
for {
select {
case client := <-s.newClients:
s.ircClients[client] = true
s.log.Println("new irc client: %s", client.Id)
go func() {
buf := make([]byte, 1024*1024)
for {
nbyte, err := client.conn.Read(buf)
if err != nil {
2019-08-21 06:15:12 +00:00
//this will surface it in the deadClients channel
client.Kill()
2019-08-20 02:15:56 +00:00
break
} else {
fragment := make([]byte, nbyte)
copy(fragment, buf[:nbyte])
// this will populate the message channel
client.AppendInputBuffer(fragment)
}
}
}()
case deadClient := <-s.deadClients:
delete(s.ircClients, deadClient)
2019-08-21 06:15:12 +00:00
deadClient.CleanupAndClose()
2019-08-20 02:15:56 +00:00
case message := <-s.messageQueue:
s.processIRCMessage(message)
}
}
2019-08-19 23:30:59 +00:00
}