func (task *SchedulableRSS) Run(scheduler *scheduler.Scheduler) { err := scraper.UpdateRSS(task.rss) if err != nil { log.Error("error updating rss stories:", err) // requeue task.start = time.Now() task.rss.GetChannel().ClearArticles() go scheduler.Add(task) return } // mark all articles as not in list for key := range task.oldArticles { task.oldArticles[key] = false } // schedule any new articles // an article is new if it wasn't in the last RSS ping delay := 60 // TODO: create legitimate task delays for i := 0; i < task.rss.GetChannel().GetNumArticles(); i++ { article := task.rss.GetChannel().GetArticle(i) if _, inOld := task.oldArticles[article.GetLink()]; !inOld { toSchedule := CreateSchedulableArticle(article, delay, task.j) delay += 600 go scheduler.Add(toSchedule) } // add or update what we found task.oldArticles[article.GetLink()] = true } // remove any articles not in the set for key, inList := range task.oldArticles { if !inList { delete(task.oldArticles, key) } } // reschedule this task if task.IsLoopable() && scheduler.IsRunning() { task.start = time.Now() task.rss.GetChannel().ClearArticles() go scheduler.Add(task) } }
func (task rssMonitor) didChange() (bool, error) { err := scraper.UpdateRSS(task.rss) if err != nil { log.Error("error reading rss:", err) return false, err } // mark all articles as not in list for key := range task.oldArticles { task.oldArticles[key] = false } // an article is new if it wasn't in the last RSS ping found := false for i := 0; i < task.rss.GetChannel().GetNumArticles(); i++ { article := task.rss.GetChannel().GetArticle(i) if _, inOld := task.oldArticles[article.GetLink()]; !inOld { found = true } // add or update what we found task.oldArticles[article.GetLink()] = true } // remove any articles not in the set for key, inList := range task.oldArticles { if !inList { delete(task.oldArticles, key) } } if found { log.Info("found new article") } task.rss.GetChannel().ClearArticles() return found, nil }