lobsters.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package feed
  2. import (
  3. "net/http"
  4. "strings"
  5. "time"
  6. )
  7. type lobstersPostResponseJson struct {
  8. CreatedAt string `json:"created_at"`
  9. Title string `json:"title"`
  10. URL string `json:"url"`
  11. Score int `json:"score"`
  12. CommentCount int `json:"comment_count"`
  13. CommentsURL string `json:"comments_url"`
  14. Tags []string `json:"tags"`
  15. }
  16. type lobstersFeedResponseJson []lobstersPostResponseJson
  17. func getLobstersPostsFromFeed(feedUrl string) (ForumPosts, error) {
  18. request, err := http.NewRequest("GET", feedUrl, nil)
  19. if err != nil {
  20. return nil, err
  21. }
  22. feed, err := decodeJsonFromRequest[lobstersFeedResponseJson](defaultClient, request)
  23. if err != nil {
  24. return nil, err
  25. }
  26. posts := make(ForumPosts, 0, len(feed))
  27. for i := range feed {
  28. createdAt, _ := time.Parse(time.RFC3339, feed[i].CreatedAt)
  29. posts = append(posts, ForumPost{
  30. Title: feed[i].Title,
  31. DiscussionUrl: feed[i].CommentsURL,
  32. TargetUrl: feed[i].URL,
  33. TargetUrlDomain: extractDomainFromUrl(feed[i].URL),
  34. CommentCount: feed[i].CommentCount,
  35. Score: feed[i].Score,
  36. TimePosted: createdAt,
  37. Tags: feed[i].Tags,
  38. })
  39. }
  40. if len(posts) == 0 {
  41. return nil, ErrNoContent
  42. }
  43. return posts, nil
  44. }
  45. func FetchLobstersPosts(customURL string, instanceURL string, sortBy string, tags []string) (ForumPosts, error) {
  46. var feedUrl string
  47. if customURL != "" {
  48. feedUrl = customURL
  49. } else {
  50. if instanceURL != "" {
  51. instanceURL = strings.TrimRight(instanceURL, "/") + "/"
  52. } else {
  53. instanceURL = "https://lobste.rs/"
  54. }
  55. if sortBy == "hot" {
  56. sortBy = "hottest"
  57. } else if sortBy == "new" {
  58. sortBy = "newest"
  59. }
  60. if len(tags) == 0 {
  61. feedUrl = instanceURL + sortBy + ".json"
  62. } else {
  63. tags := strings.Join(tags, ",")
  64. feedUrl = instanceURL + "t/" + tags + ".json"
  65. }
  66. }
  67. posts, err := getLobstersPostsFromFeed(feedUrl)
  68. if err != nil {
  69. return nil, err
  70. }
  71. return posts, nil
  72. }