123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package tcplistener
-
- import (
- "bufio"
- "github.com/juju/loggo"
- "github.com/spf13/viper"
- "github.com/thoj/go-ircevent"
- "net"
- "strings"
- )
-
- var log = loggo.GetLogger("TCPListener")
-
- type TCPListener struct {
- socket net.Listener
- irc *irc.Connection
- }
-
- func New() (*TCPListener, error) {
- var err error
-
- listener := TCPListener{}
- listener.socket, err = net.Listen("tcp", viper.GetString("tcp_listen"))
- if err != nil {
- return nil, err
- }
-
- return &listener, nil
- }
-
- func (l *TCPListener) Run(irccon *irc.Connection) {
- log.Infof("Listening for TCP requests on %s", viper.GetString("tcp_listen"))
- l.irc = irccon
- go l.acceptConnections()
- }
-
- func (l *TCPListener) acceptConnections() {
- for {
- conn, err := l.socket.Accept()
- if err != nil {
- break
- }
- go l.handleConnection(conn)
- }
- l.socket.Close()
- }
-
- func (l *TCPListener) handleConnection(conn net.Conn) {
- reader := bufio.NewReader(conn)
- for {
- msg, err := reader.ReadString('\n')
- if err != nil {
- break
- }
- msg = strings.Trim(msg, "\r\n")
- log.Debugf("Message: %s", msg)
- l.parseMessage(msg)
- }
- }
-
- func (l *TCPListener) parseMessage(msg string) {
- channels := viper.GetStringSlice("irc.channels")
-
- if msg[0] == '#' || msg[0] == '@' {
- parts := strings.SplitN(msg, " ", 2)
- if parts[0] == "#*" {
- for _, channel := range channels {
- l.irc.Privmsg(channel, replaceFormatting(parts[1]))
- }
- } else {
- targets := strings.Split(parts[0], ",")
- for _, target := range targets {
- if target[0] == '@' {
- target = target[1:]
- }
- l.irc.Privmsg(target, replaceFormatting(parts[1]))
- }
- }
- } else if msg[0:6] == "%TOPIC" {
- parts := strings.SplitN(msg, " ", 3)
- l.irc.SendRawf("TOPIC %s :%s", parts[1], replaceFormatting(parts[2]))
- } else {
- if len(channels) > 0 {
- l.irc.Privmsg(channels[0], replaceFormatting(msg))
- }
- }
- }
|