hacker-news.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package widget
  2. import (
  3. "context"
  4. "html/template"
  5. "time"
  6. "github.com/glanceapp/glance/internal/assets"
  7. "github.com/glanceapp/glance/internal/feed"
  8. )
  9. type HackerNews struct {
  10. widgetBase `yaml:",inline"`
  11. Posts feed.ForumPosts `yaml:"-"`
  12. Limit int `yaml:"limit"`
  13. CollapseAfter int `yaml:"collapse-after"`
  14. CommentsUrlTemplate string `yaml:"comments-url-template"`
  15. }
  16. func (widget *HackerNews) Initialize() error {
  17. widget.withTitle("Hacker News").withCacheDuration(30 * time.Minute)
  18. if widget.Limit <= 0 {
  19. widget.Limit = 15
  20. }
  21. if widget.CollapseAfter == 0 || widget.CollapseAfter < -1 {
  22. widget.CollapseAfter = 5
  23. }
  24. return nil
  25. }
  26. func (widget *HackerNews) Update(ctx context.Context) {
  27. posts, err := feed.FetchHackerNewsTopPosts(40, widget.CommentsUrlTemplate)
  28. if !widget.canContinueUpdateAfterHandlingErr(err) {
  29. return
  30. }
  31. posts.CalculateEngagement()
  32. posts.SortByEngagement()
  33. if widget.Limit < len(posts) {
  34. posts = posts[:widget.Limit]
  35. }
  36. widget.Posts = posts
  37. }
  38. func (widget *HackerNews) Render() template.HTML {
  39. return widget.render(widget, assets.ForumPostsTemplate)
  40. }