go-sonic/sonic/connector.go
2019-03-25 15:58:07 +01:00

68 lines
1.1 KiB
Go

package sonic
import (
"bufio"
"bytes"
"errors"
"fmt"
"net"
"strings"
)
type Connection struct {
Host string
Port int
Password string
Channel Channel
reader *bufio.Reader
conn net.Conn
}
func (c *Connection) Connect() error {
if !IsChannelValid(c.Channel) {
return errors.New("invalid channel name")
}
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", c.Host, c.Port))
if err != nil {
return err
} else {
c.conn = conn
c.reader = bufio.NewReader(c.conn)
err := c.write(fmt.Sprintf("START %s %s", c.Channel, c.Password))
if err != nil {
return err
}
_, err = c.read()
_, err = c.read()
if err != nil {
return err
}
return nil
}
}
func (c Connection) read() (string, error) {
buffer := bytes.Buffer{}
for {
line, isPrefix, err := c.reader.ReadLine()
buffer.Write(line)
if err != nil || !isPrefix {
break
}
}
str := buffer.String()
if strings.HasPrefix(str, "ERR ") {
return "", errors.New(str[4:])
}
return str, nil
}
func (c Connection) write(str string) error {
_, err := c.conn.Write([]byte(str + "\r\n"))
return err
}