mirror of https://github.com/fluffle/goirc
77 lines
1.6 KiB
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
|
|
}
|