package main import ( "fmt" "log" "time" "dim13.org/rss" ) 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: 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, }, { Name: "Undeadly", URL: `http://undeadly.org/cgi?action=rss`, Every: 2 * time.Hour, }, { Name: "Kernel", URL: `https://www.kernel.org/feeds/kdist.xml`, Every: 6 * time.Hour, }, { Name: "Ted Unangst", URL: `http://www.tedunangst.com/flak/rss`, Every: 6 * time.Hour, }, { Name: "Calomel", URL: `https://calomel.org/calomel_rss.xml`, Every: 6 * time.Hour, }, { Name: "Golang News", URL: `https://golangnews.com/index.xml`, Every: 6 * time.Hour, }, { Name: "Golang Weekly", URL: `http://golangweekly.com/rss/1fg21ahk`, Every: 6 * 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 (f Feed) Watch(news chan News) { 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 } last := t.Add(-f.Every) for _, i := range r.Channel.Items { if i.PubDate.After(last) { news <- News{f, i} } } } } func watchNews(msg chan string) { news := make(chan News) for _, feed := range Feeds { go feed.Watch(news) } for n := range news { msg <- fmt.Sprint(n) } }