reddit.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package widget
  2. import (
  3. "context"
  4. "errors"
  5. "html/template"
  6. "time"
  7. "github.com/glanceapp/glance/internal/assets"
  8. "github.com/glanceapp/glance/internal/feed"
  9. )
  10. type Reddit struct {
  11. widgetBase `yaml:",inline"`
  12. Posts feed.ForumPosts `yaml:"-"`
  13. Subreddit string `yaml:"subreddit"`
  14. Style string `yaml:"style"`
  15. CommentsUrlTemplate string `yaml:"comments-url-template"`
  16. Limit int `yaml:"limit"`
  17. CollapseAfter int `yaml:"collapse-after"`
  18. }
  19. func (widget *Reddit) Initialize() error {
  20. if widget.Subreddit == "" {
  21. return errors.New("no subreddit specified")
  22. }
  23. if widget.Limit <= 0 {
  24. widget.Limit = 15
  25. }
  26. if widget.CollapseAfter == 0 || widget.CollapseAfter < -1 {
  27. widget.CollapseAfter = 5
  28. }
  29. widget.withTitle("/r/" + widget.Subreddit).withCacheDuration(30 * time.Minute)
  30. return nil
  31. }
  32. func (widget *Reddit) Update(ctx context.Context) {
  33. posts, err := feed.FetchSubredditPosts(widget.Subreddit, widget.CommentsUrlTemplate)
  34. if !widget.canContinueUpdateAfterHandlingErr(err) {
  35. return
  36. }
  37. if len(posts) > widget.Limit {
  38. posts = posts[:widget.Limit]
  39. }
  40. posts.SortByEngagement()
  41. widget.Posts = posts
  42. }
  43. func (widget *Reddit) Render() template.HTML {
  44. if widget.Style == "horizontal-cards" {
  45. return widget.render(widget, assets.RedditCardsHorizontalTemplate)
  46. }
  47. if widget.Style == "vertical-cards" {
  48. return widget.render(widget, assets.RedditCardsVerticalTemplate)
  49. }
  50. return widget.render(widget, assets.ForumPostsTemplate)
  51. }