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.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. log.Debugf("Message: %s", msg)
  48. l.parseMessage(msg)
  49. }
  50. }
  51. func (l *TCPListener) parseMessage(msg string) {
  52. channels := viper.GetStringSlice("irc.channels")
  53. if msg[0] == '#' || msg[0] == '@' {
  54. parts := strings.SplitN(msg, " ", 2)
  55. if parts[0] == "#*" {
  56. for _, channel := range channels {
  57. l.irc.Privmsg(channel, replaceFormatting(parts[1]))
  58. }
  59. } else {
  60. targets := strings.Split(parts[0], ",")
  61. for _, target := range targets {
  62. if target[0] == '@' {
  63. target = target[1:]
  64. }
  65. l.irc.Privmsg(target, replaceFormatting(parts[1]))
  66. }
  67. }
  68. } else if msg[0:6] == "%TOPIC" {
  69. parts := strings.SplitN(msg, " ", 3)
  70. l.irc.SendRawf("TOPIC %s :%s", parts[1], replaceFormatting(parts[2]))
  71. } else {
  72. if len(channels) > 0 {
  73. l.irc.Privmsg(channels[0], replaceFormatting(msg))
  74. }
  75. }
  76. }