goirc/stream.go

77 lines
1.6 KiB
Go

package main
import (
"http"
"strings"
"json"
"bufio"
"io/ioutil"
"time"
irc "github.com/fluffle/goirc/client"
)
var justinTv map[string]bool = make(map[string]bool)
func announceJustinTv(conn *irc.Conn, channel string) {
for {
time.Sleep(30000000000) // 30 seconds
live := pollJustinTv()
if len(live) > 0 {
say(conn, channel, "Now streaming: %s; http://stream.sc2gg.com/", strings.Join(live, ", "))
}
}
}
func pollJustinTv() []string {
newStreams := make(map[string]bool)
qChannel := ""
streams, err := http.Get("http://stream.sc2gg.com/streams")
if err == nil {
defer streams.Body.Close()
b := bufio.NewReader(streams.Body)
for {
line, err := b.ReadString('\n')
if err != nil {
break
}
username := strings.Split(line, "\t", 2)[1]
if len(username) > 3 && username[:3] == "/j/" {
username = username[3:len(username)-1]
newStreams[username] = false
qChannel += username + ","
}
}
}
if len(qChannel) == 0 {
return nil
}
response, err := http.Get("http://api.justin.tv/api/stream/list.json?channel=" + qChannel[:len(qChannel)-1])
if err != nil {
return nil
}
defer response.Body.Close()
b, err := ioutil.ReadAll(response.Body)
if err != nil {
return nil
}
var result []interface{}
err = json.Unmarshal(b, &result)
if err != nil {
return nil
}
live := make([]string, 0)
for _, r := range(result) {
data := r.(map[string]interface{})
channel := data["channel"].(map[string]interface{})
username := channel["login"].(string)
newStreams[username] = true
if !justinTv[username] {
live = append(live, username)
}
}
justinTv = newStreams
return live
}