You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tcplistener.go 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package tcplistener
  2. import (
  3. "bufio"
  4. "github.com/irccloud/irccat/dispatcher"
  5. "github.com/juju/loggo"
  6. "github.com/spf13/viper"
  7. "github.com/thoj/go-ircevent"
  8. "net"
  9. "strings"
  10. )
  11. var log = loggo.GetLogger("TCPListener")
  12. type TCPListener struct {
  13. socket net.Listener
  14. irc *irc.Connection
  15. }
  16. func New() (*TCPListener, error) {
  17. var err error
  18. listener := TCPListener{}
  19. listener.socket, err = net.Listen("tcp", viper.GetString("tcp.listen"))
  20. if err != nil {
  21. return nil, err
  22. }
  23. return &listener, nil
  24. }
  25. func (l *TCPListener) Run(irccon *irc.Connection) {
  26. log.Infof("Listening for TCP requests on %s", viper.GetString("tcp.listen"))
  27. l.irc = irccon
  28. go l.acceptConnections()
  29. }
  30. func (l *TCPListener) acceptConnections() {
  31. for {
  32. conn, err := l.socket.Accept()
  33. if err != nil {
  34. break
  35. }
  36. go l.handleConnection(conn)
  37. }
  38. l.socket.Close()
  39. }
  40. func (l *TCPListener) handleConnection(conn net.Conn) {
  41. reader := bufio.NewReader(conn)
  42. for {
  43. msg, err := reader.ReadString('\n')
  44. if err != nil {
  45. break
  46. }
  47. msg = strings.Trim(msg, "\r\n")
  48. if len(msg) > 0 {
  49. dispatcher.Send(l.irc, msg, log, conn.RemoteAddr().String())
  50. }
  51. }
  52. conn.Close()
  53. }