From 2e107bbb808898460e29bd975d5ba4cf8fcc1179 Mon Sep 17 00:00:00 2001 From: AKP Date: Tue, 5 Apr 2022 13:25:05 +0100 Subject: Use scheduled feed processing Signed-off-by: AKP --- walrss/internal/rss/processor.go | 76 ++++++++++++++++++++++------------------ walrss/internal/rss/watcher.go | 15 ++++---- walrss/main.go | 5 +-- 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/walrss/internal/rss/processor.go b/walrss/internal/rss/processor.go index 0c721d5..9db14ab 100644 --- a/walrss/internal/rss/processor.go +++ b/walrss/internal/rss/processor.go @@ -13,6 +13,7 @@ import ( "github.com/matcornic/hermes" "github.com/mmcdole/gofeed" "github.com/patrickmn/go-cache" + "github.com/rs/zerolog/log" "net/smtp" "sort" "strings" @@ -36,53 +37,58 @@ func ProcessFeeds(st *state.State, day db.SendDay, hour int) error { if err != nil { return err } + for _, ur := range u { - userFeeds, err := core.GetFeedsForUser(st, ur.ID) - if err != nil { - return err + if err := ProcessUserFeed(st, ur); err != nil { + log.Warn().Err(err).Str("user", ur.ID).Msg("could not process feeds for user") } + } - var interval time.Duration - if ur.Schedule.Day == db.SendDaily { - interval = time.Hour * 24 - } else { - interval = time.Hour * 24 * 7 - } + return nil +} + +func ProcessUserFeed(st *state.State, user *db.User) error { + userFeeds, err := core.GetFeedsForUser(st, user.ID) + if err != nil { + return err + } - var processedFeeds []*processedFeed + var interval time.Duration + if user.Schedule.Day == db.SendDaily { + interval = time.Hour * 24 + } else { + interval = time.Hour * 24 * 7 + } - startTime := time.Now().UTC() + var processedFeeds []*processedFeed - for _, f := range userFeeds { - pf := new(processedFeed) - pf.Name = f.Name + startTime := time.Now().UTC() - rawFeed, err := getFeedContent(f.URL) - if err != nil { - pf.Error = err - } else { - pf.Items = filterFeedContent(rawFeed, time.Now().UTC().Add(-interval)) - } - processedFeeds = append(processedFeeds, pf) - } + for _, f := range userFeeds { + pf := new(processedFeed) + pf.Name = f.Name - plainContent, htmlContent, err := generateEmail(st, processedFeeds, interval, time.Now().UTC().Sub(startTime)) + rawFeed, err := getFeedContent(f.URL) if err != nil { - return err + pf.Error = err + } else { + pf.Items = filterFeedContent(rawFeed, time.Now().UTC().Add(-interval)) } + processedFeeds = append(processedFeeds, pf) + } - if err := sendEmail( - st, - plainContent, - htmlContent, - ur.Email, - "RSS digest for "+time.Now().UTC().Format(dateFormat), - ); err != nil { - return err - } + plainContent, htmlContent, err := generateEmail(st, processedFeeds, interval, time.Now().UTC().Sub(startTime)) + if err != nil { + return err } - return nil + return sendEmail( + st, + plainContent, + htmlContent, + user.Email, + "RSS digest for "+time.Now().UTC().Format(dateFormat), + ) } var ( @@ -212,7 +218,7 @@ func generateEmail(st *state.State, processedItems []*processedFeed, interval, t Product: hermes.Product{ Name: "Walrss", Link: st.Config.Server.ExternalURL, - Copyright: fmt.Sprintf("This email was generated in %.2f seconds by Walrss v%s.\nhttps://github.com/codemicro/walrss", timeToGenerate.Seconds(), state.Version), + Copyright: fmt.Sprintf("This email was generated in %.2f seconds by Walrss %s.", timeToGenerate.Seconds(), state.Version), }, Theme: new(hermes.Flat), } diff --git a/walrss/internal/rss/watcher.go b/walrss/internal/rss/watcher.go index e7036c1..5a000cb 100644 --- a/walrss/internal/rss/watcher.go +++ b/walrss/internal/rss/watcher.go @@ -12,15 +12,18 @@ func StartWatcher(st *state.State) { currentTime := time.Now().UTC() time.Sleep(time.Minute * time.Duration(60-currentTime.Minute())) - if err := ProcessFeeds(st, db.SendDayFromWeekday(currentTime.Weekday()), currentTime.Hour()+1); err != nil { - log.Error().Err(err).Str("location", "feed watcher").Send() - } + runFeedProcessor(st, currentTime) ticker := time.NewTicker(time.Hour) for currentTime := range ticker.C { - if err := ProcessFeeds(st, db.SendDayFromWeekday(currentTime.Weekday()), currentTime.Hour()); err != nil { - log.Error().Err(err).Str("location", "feed watcher").Send() - } + runFeedProcessor(st, currentTime) } }() } + +func runFeedProcessor(st *state.State, currentTime time.Time) { + log.Info().Str("location", "feed watcher").Msg("running hourly job") + if err := ProcessFeeds(st, db.SendDayFromWeekday(currentTime.Weekday()), currentTime.Hour()+1); err != nil { + log.Error().Err(err).Str("location", "feed watcher").Send() + } +} diff --git a/walrss/main.go b/walrss/main.go index 1c11913..d3e5ef7 100644 --- a/walrss/main.go +++ b/walrss/main.go @@ -39,10 +39,7 @@ func run() error { return err } - err = rss.ProcessFeeds(st, db.SendOnSunday, 21) - if err != nil { - return err - } + rss.StartWatcher(st) return server.Run() } -- cgit v1.2.3-70-g09d2