48 lines
958 B
Crystal
48 lines
958 B
Crystal
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
|