require "http/client" require "json" class RedditWrapper(T) JSON.mapping( kind: String, data: T) end class RedditChild JSON.mapping( url: String, name: String, title: String) end class RedditResponse JSON.mapping( modhash: String, dist: Int32, children: Array(RedditWrapper(RedditChild))) def self.from_subreddits(subreddits : Array(String)) request_url = URI.new scheme: "https", host: "www.reddit.com", path: "/r/#{subreddits.join "+"}/hot.json", query: "limit=30" response = HTTP::Client.get(request_url, headers: HTTP::Headers { "User-agent" => "Joann-Pupper-Bot" }) return nil unless body = response.body? begin RedditWrapper(RedditResponse).from_json body rescue e nil end end def self.from_subreddit(subreddit) from_subreddits [subreddit] end def posts_matching(&block) children .map(&.data) .select { |it| yield it } end end