package twitchbot
|
|
|
|
import (
|
|
"bufio"
|
|
"net"
|
|
"net/textproto"
|
|
)
|
|
|
|
type Client struct {
|
|
Token string
|
|
Nick string
|
|
conn net.Conn
|
|
writer *textproto.Writer
|
|
reader *textproto.Reader
|
|
handlers map[string][]func(*Command) bool
|
|
}
|
|
|
|
func (client *Client) Connect(host string) error {
|
|
conn, err := net.Dial("tcp", host)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
client.conn = conn
|
|
client.writer = textproto.NewWriter(bufio.NewWriter(conn))
|
|
client.reader = textproto.NewReader(bufio.NewReader(conn))
|
|
return nil
|
|
}
|
|
|
|
func (client *Client) Auth() error {
|
|
err := client.writer.PrintfLine("PASS %s", client.Token)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = client.writer.PrintfLine("NICK %s", client.Nick)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (client *Client) AddHandler(command string, f func(*Command) bool) {
|
|
if client.handlers == nil {
|
|
client.handlers = make(map[string][]func(*Command) bool)
|
|
}
|
|
handlers, ok := client.handlers[command]
|
|
if !ok {
|
|
client.handlers[command] = []func(*Command) bool{f}
|
|
} else {
|
|
client.handlers[command] = append(handlers, f)
|
|
}
|
|
}
|
|
|
|
func (client *Client) Send(command *Command) error {
|
|
err := client.writer.PrintfLine(command.Build())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (client *Client) CapReq(cap string) error {
|
|
err := client.Send(&Command{
|
|
Command: "CAP",
|
|
Args: []string{"REQ"},
|
|
Suffix: cap,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (client *Client) Join(channel string) error {
|
|
err := client.Send(&Command{
|
|
Command: "JOIN",
|
|
Args: []string{channel},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (client *Client) Close() {
|
|
err := client.conn.Close()
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
func (client *Client) Handle() error {
|
|
for {
|
|
packet, err := client.reader.ReadLine()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
command := ParsePacket(packet)
|
|
handlers := client.handlers[command.Command]
|
|
for _, handler := range handlers {
|
|
if !handler(command) {
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
}
|