mtfosbot/module/twitch-irc/twitch-irc.go
2018-09-13 18:18:59 +08:00

147 lines
2.2 KiB
Go

package twitchirc
import (
"fmt"
"net"
"time"
"gopkg.in/irc.v2"
"git.trj.tw/golang/mtfosbot/module/config"
)
var client *irc.Client
var queue *QueueList
var channels []string
// InitIRC -
func InitIRC() (err error) {
conf := config.GetConf()
conn, err := net.Dial("tcp", conf.Twitch.ChatHost)
if err != nil {
return
}
config := irc.ClientConfig{
Handler: irc.HandlerFunc(ircHandle),
}
client = irc.NewClient(conn, config)
err = client.Run()
queue = NewQueue()
go runQueue()
channels = make([]string, 0)
return
}
// SendMessage -
func SendMessage(ch, msg string) {
if len(ch) == 0 {
return
}
if indexOf(channels, ch) == -1 {
return
}
m := &MsgObj{
Command: "PRIVMSG",
Params: []string{
fmt.Sprintf("#%s", ch),
fmt.Sprintf(":%s", msg),
},
}
queue.Add(m)
}
// JoinChannel -
func JoinChannel(ch string) {
if len(ch) == 0 {
return
}
if indexOf(channels, ch) != -1 {
return
}
m := &MsgObj{
Command: "JOIN",
Params: []string{
fmt.Sprintf("#%s", ch),
},
}
queue.Add(m)
// msg := &irc.Message{}
// msg.Command = "JOIN"
// msg.Params = []string{
// fmt.Sprintf("#%s", ch),
// }
// client.WriteMessage(msg)
}
// LeaveChannel -
func LeaveChannel(ch string) {
if len(ch) == 0 {
return
}
if indexOf(channels, ch) == -1 {
return
}
m := &MsgObj{
Command: "PART",
Params: []string{
fmt.Sprintf("#%s", ch),
},
}
queue.Add(m)
}
func runQueue() {
for {
if !queue.IsEmpty() {
m := queue.Get()
msg := &irc.Message{}
msg.Command = m.Command
msg.Params = m.Params
if m.Command == "JOIN" {
if indexOf(channels, m.Params[0][1:]) != -1 {
continue
}
channels = append(channels, m.Params[0][1:])
} else if m.Command == "PART" {
if indexOf(channels, m.Params[0][1:]) == -1 {
continue
}
idx := indexOf(channels, m.Params[0][1:])
channels = append(channels[:idx], channels[idx+1:]...)
}
fmt.Println("< ", msg.String())
client.WriteMessage(msg)
}
time.Sleep(time.Microsecond * 1500)
}
}
func ircHandle(c *irc.Client, m *irc.Message) {
fmt.Println("> ", m.String())
}
func indexOf(c []string, data string) int {
if len(c) == 0 {
return -1
}
for k, v := range c {
if v == data {
return k
}
}
return -1
}