aboutsummaryrefslogtreecommitdiffstats
path: root/walrss/internal
diff options
context:
space:
mode:
Diffstat (limited to 'walrss/internal')
-rw-r--r--walrss/internal/rss/processor.go76
-rw-r--r--walrss/internal/rss/watcher.go15
2 files changed, 50 insertions, 41 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()
+ }
+}