hacker-news.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. ShowThumbnails bool `yaml:"-"`
  16. }
  17. func (widget *HackerNews) Initialize() error {
  18. widget.withTitle("Hacker News").withCacheDuration(30 * time.Minute)
  19. if widget.Limit <= 0 {
  20. widget.Limit = 15
  21. }
  22. if widget.CollapseAfter == 0 || widget.CollapseAfter < -1 {
  23. widget.CollapseAfter = 5
  24. }
  25. return nil
  26. }
  27. func (widget *HackerNews) Update(ctx context.Context) {
  28. posts, err := feed.FetchHackerNewsTopPosts(40, widget.CommentsUrlTemplate)
  29. if !widget.canContinueUpdateAfterHandlingErr(err) {
  30. return
  31. }
  32. posts.CalculateEngagement()
  33. posts.SortByEngagement()
  34. if widget.Limit < len(posts) {
  35. posts = posts[:widget.Limit]
  36. }
  37. widget.Posts = posts
  38. }
  39. func (widget *HackerNews) Render() template.HTML {
  40. return widget.render(widget, assets.ForumPostsTemplate)
  41. }