package main
import (
"encoding/xml"
"errors"
"flag"
"fmt"
"net/http"
"strings"
"time"
"github.com/hamcha/clessy/tg"
)
func assert(err error) {
if err != nil {
panic(err)
}
}
var chatID *int
var lastPage string
var broker *tg.Broker
var apichat *tg.APIChat
const mspaRSS = "http://mspaintadventures.com/rss/rss.xml"
const timelayout = "Mon, 2 Jan 2006 15:04:05 -0700"
type Item struct {
Title string `xml:"title"`
Link string `xml:"link"`
Date string `xml:"pubDate"`
}
type RSS struct {
Items []Item `xml:"channel>item"`
}
func process(b *tg.Broker, update tg.APIMessage) {
if update.Chat.ChatID == *chatID && *(update.Text) == "!start" {
broker = b
apichat = update.Chat
broker.SendTextMessage(apichat, "Ok! Aspetto updates..", &update.MessageID)
}
}
func advert(page Item) {
date, _ := time.Parse(timelayout, page.Date)
dateStr := date.Format("15:04:05")
parts := strings.Split(page.Link, "p=")
pagen := strings.Trim(parts[1], "0")
text := "Nuova pagina uscita!\n\n#" + pagen + " - " + dateStr + "\n" + page.Title + "\n\nClicca qui per leggerla"
broker.SendTextMessage(apichat, text, nil)
}
func startPolling(delay int64) {
panicFn := func(err error) {
broker.SendTextMessage(apichat, "Errore cercando di leggere l'RSS! @HAMCHA LEGGI LA CONSOLE!", nil)
panic(err)
}
for broker == nil {
// Wait for broker
time.Sleep(time.Second)
}
for {
resp, err := http.Get(mspaRSS)
if err != nil {
panicFn(err)
}
var out RSS
err = xml.NewDecoder(resp.Body).Decode(&out)
if err != nil {
panicFn(err)
}
if len(out.Items) < 1 {
panicFn(errors.New("0 items in the RSS Feed?"))
}
if out.Items[0].Link != lastPage {
fmt.Println("Got new page: " + out.Items[0].Link)
if lastPage != "" {
advert(out.Items[0])
}
lastPage = out.Items[0].Link
}
time.Sleep(time.Second * time.Duration(delay))
}
}
func main() {
brokerAddr := flag.String("broker", "localhost:7314", "Broker address:port")
delay := flag.Int64("delau", 5*60, "How many seconds between each poll")
chatID = flag.Int("chatid", -68373985, "Telegram Chat ID to count stats for")
flag.Parse()
lastPage = ""
go startPolling(*delay)
err := tg.CreateBrokerClient(*brokerAddr, process)
assert(err)
}