package feed import ( "net/http" "strings" "time" ) type lobstersPostResponseJson struct { CreatedAt string `json:"created_at"` Title string `json:"title"` URL string `json:"url"` Score int `json:"score"` CommentCount int `json:"comment_count"` CommentsURL string `json:"comments_url"` Tags []string `json:"tags"` } type lobstersFeedResponseJson []lobstersPostResponseJson func getLobstersPostsFromFeed(feedUrl string) (ForumPosts, error) { request, err := http.NewRequest("GET", feedUrl, nil) if err != nil { return nil, err } feed, err := decodeJsonFromRequest[lobstersFeedResponseJson](defaultClient, request) if err != nil { return nil, err } posts := make(ForumPosts, 0, len(feed)) for i := range feed { createdAt, _ := time.Parse(time.RFC3339, feed[i].CreatedAt) posts = append(posts, ForumPost{ Title: feed[i].Title, DiscussionUrl: feed[i].CommentsURL, TargetUrl: feed[i].URL, TargetUrlDomain: extractDomainFromUrl(feed[i].URL), CommentCount: feed[i].CommentCount, Score: feed[i].Score, TimePosted: createdAt, Tags: feed[i].Tags, }) } if len(posts) == 0 { return nil, ErrNoContent } return posts, nil } func FetchLobstersPosts(customURL string, instanceURL string, sortBy string, tags []string) (ForumPosts, error) { var feedUrl string if customURL != "" { feedUrl = customURL } else { if instanceURL != "" { instanceURL = strings.TrimRight(instanceURL, "/") + "/" } else { instanceURL = "https://lobste.rs/" } if sortBy == "hot" { sortBy = "hottest" } else if sortBy == "new" { sortBy = "newest" } if len(tags) == 0 { feedUrl = instanceURL + sortBy + ".json" } else { tags := strings.Join(tags, ",") feedUrl = instanceURL + "t/" + tags + ".json" } } posts, err := getLobstersPostsFromFeed(feedUrl) if err != nil { return nil, err } return posts, nil }