package main import ( "fmt" "log" "time" "dim13.org/rss" irc "github.com/fluffle/goirc/client" ) type Feed struct { Name string URL string Every time.Duration } var Feeds = []Feed{ { Name: "LOR News", URL: `https://www.linux.org.ru/section-rss.jsp?section=1`, Every: time.Hour, }, { Name: "LOR Forum", URL: `https://www.linux.org.ru/section-rss.jsp?section=2&filter=tech`, Every: 5 * time.Minute, }, { Name: "LOR Gallery", URL: `https://www.linux.org.ru/section-rss.jsp?section=3`, Every: 2 * time.Hour, }, { Name: "LOR Polls", URL: `https://www.linux.org.ru/section-rss.jsp?section=5`, Every: 2 * time.Hour, }, { Name: "OpenNET", URL: `http://www.opennet.ru/opennews/opennews_all_noadv.rss`, Every: 4 * time.Hour, }, } type News struct { Feed rss.Item } func (n News) String() string { s := fmt.Sprintf("%v: %v", n.Name, n.Title) if n.Author != "" { s += fmt.Sprintf(" (%v) ", n.Author) } else { s += " - " } s += fmt.Sprintf("%v", n.Link) return s } func ShowNews(conn *irc.Conn, room string) { news := make(chan News) for _, f := range Feeds { go func(f Feed) { ticker := time.NewTicker(f.Every) defer ticker.Stop() for t := range ticker.C { r, err := rss.Fetch(f.URL) if err != nil { log.Println(f.Name, err) return } to := t.Add(-f.Every) for _, i := range r.Channel.Items { if i.PubDate.After(to) { news <- News{f, i} } } } }(f) } go func() { for n := range news { conn.Notice(room, n.String()) } }() }