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 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package tcplistener
  2. import (
  3. "bufio"
  4. "github.com/juju/loggo"
  5. "github.com/spf13/viper"
  6. "github.com/thoj/go-ircevent"
  7. "net"
  8. "strings"
  9. )
  10. var log = loggo.GetLogger("TCPListener")
  11. type TCPListener struct {
  12. socket net.Listener
  13. irc *irc.Connection
  14. }
  15. func New() (*TCPListener, error) {
  16. var err error
  17. listener := TCPListener{}
  18. listener.socket, err = net.Listen("tcp", viper.GetString("tcp.listen"))
  19. if err != nil {
  20. return nil, err
  21. }
  22. return &listener, nil
  23. }
  24. func (l *TCPListener) Run(irccon *irc.Connection) {
  25. log.Infof("Listening for TCP requests on %s", viper.GetString("tcp_listen"))
  26. l.irc = irccon
  27. go l.acceptConnections()
  28. }
  29. func (l *TCPListener) acceptConnections() {
  30. for {
  31. conn, err := l.socket.Accept()
  32. if err != nil {
  33. break
  34. }
  35. go l.handleConnection(conn)
  36. }
  37. l.socket.Close()
  38. }
  39. func (l *TCPListener) handleConnection(conn net.Conn) {
  40. reader := bufio.NewReader(conn)
  41. for {
  42. msg, err := reader.ReadString('\n')
  43. if err != nil {
  44. break
  45. }
  46. msg = strings.Trim(msg, "\r\n")
  47. if len(msg) > 0 {
  48. log.Infof("[%s] message: %s", conn.RemoteAddr(), msg)
  49. l.parseMessage(msg)
  50. }
  51. if viper.GetBool("tcp.close_after_message") {
  52. conn.Close()
  53. }
  54. }
  55. }
  56. func (l *TCPListener) parseMessage(msg string) {
  57. channels := viper.GetStringSlice("irc.channels")
  58. if msg[0] == '#' || msg[0] == '@' {
  59. parts := strings.SplitN(msg, " ", 2)
  60. if parts[0] == "#*" {
  61. for _, channel := range channels {
  62. chan_parts := strings.Split(channel, " ")
  63. l.irc.Privmsg(chan_parts[0], replaceFormatting(parts[1]))
  64. }
  65. } else {
  66. targets := strings.Split(parts[0], ",")
  67. for _, target := range targets {
  68. if target[0] == '@' {
  69. target = target[1:]
  70. }
  71. l.irc.Privmsg(target, replaceFormatting(parts[1]))
  72. }
  73. }
  74. } else if len(msg) > 7 && msg[0:6] == "%TOPIC" {
  75. parts := strings.SplitN(msg, " ", 3)
  76. l.irc.SendRawf("TOPIC %s :%s", parts[1], replaceFormatting(parts[2]))
  77. } else {
  78. if len(channels) > 0 {
  79. chan_parts := strings.Split(channels[0], " ")
  80. l.irc.Privmsg(chan_parts[0], replaceFormatting(msg))
  81. }
  82. }
  83. }