// vi:ts=4:sts=4:sw=4:noet:tw=72 // // This code is mostly derived from the example code by Jim Teeuwen // and is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication // license. package modules import ( "bufio" "errors" "flag" "fmt" "io" "os" "time" gorss "git.dnix.de/an/go-pkg-rss" xmlx "git.dnix.de/an/go-pkg-xmlx" "git.dnix.de/an/xlog" ) var hideOutput = true var rssFeeds = flag.String("rss_feeds", "feeds.txt", "Feed list file") var rssChannel = flag.String("rss_channel", "", "Target channel") func init() { MsgFuncs["rss"] = rssHandleMessage RunFuncs["rss"] = rssRun } func rssRun() { time.Sleep(5 * time.Second) file, err := os.Open(*rssFeeds) if err != nil { xlog.Fatal(err.Error()) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { go rssPollFeed(scanner.Text(), 5, rssCharsetReader) } if err := scanner.Err(); err != nil { xlog.Fatal(err.Error()) } go func() { // Suppress output of new items for 15 minutes after startup // in order to prevent spam. time.Sleep(15 * time.Minute) hideOutput = false }() } func rssHandleMessage(m *Message) { } func rssPollFeed(uri string, timeout int, cr xmlx.CharsetFunc) { feed := gorss.New(timeout, true, rssChanHandler, rssItemHandler) for { xlog.Info("Polling feed: %s", uri) if err := feed.Fetch(uri, cr); err != nil { xlog.Error("Feed error: %s: %s", "*", uri, err) } xlog.Info("Polled %s, next poll in %d seconds", uri, feed.SecondsTillUpdate()) <-time.After(time.Duration(feed.SecondsTillUpdate() * 1e9)) } } func rssChanHandler(feed *gorss.Feed, newchannels []*gorss.Channel) { //SayCh <- fmt.Sprintf("%s\n[RSS] %d new channel(s) in %s", "*", len(newchannels), feed.Url) } func rssItemHandler(feed *gorss.Feed, ch *gorss.Channel, newitems []*gorss.Item) { if hideOutput { return } for _, ni := range newitems { ti := ni.Title short := "" if len(ti) > 80 { runes := []rune(ti) short = string(runes[0:80]) + " [...]" } else { short = ti } SayCh <- fmt.Sprintf("%s\n[RSS] %v - %v", *rssChannel, short, ni.Links[0].Href) } } func rssCharsetReader(charset string, r io.Reader) (io.Reader, error) { if charset == "ISO-8859-1" || charset == "iso-8859-1" { return r, nil } return nil, errors.New("Unsupported character set encoding: " + charset) }