Refactor some reddit polling code
This commit is contained in:
		
							parent
							
								
									92cdd200ba
								
							
						
					
					
						commit
						3f1039e5dc
					
				@ -1,27 +1,59 @@
 | 
				
			|||||||
require "http/client"
 | 
					require "http/client"
 | 
				
			||||||
require "json" 
 | 
					require "json" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_reddit_json(subreddit)
 | 
					class RedditWrapper(T)
 | 
				
			||||||
    request_url = "https://www.reddit.com/r/#{subreddit}/hot.json?limit=30"
 | 
					  JSON.mapping(
 | 
				
			||||||
    response = HTTP::Client.get(request_url, headers: HTTP::Headers {
 | 
					    kind: String,
 | 
				
			||||||
        "User-agent" => "Joann-Pupper-Bot"
 | 
					    data: T)
 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    response.body?.try { |body| JSON.parse(body) }
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def filter_reddit_json(json, completed)
 | 
					class RedditChild
 | 
				
			||||||
    json["data"]["children"]
 | 
					  JSON.mapping(
 | 
				
			||||||
        .as_a
 | 
					    url: String,
 | 
				
			||||||
        .map(&.["data"])
 | 
					    name: String,
 | 
				
			||||||
        .select do |it| 
 | 
					    title: String)
 | 
				
			||||||
            url = it["url"].as_s
 | 
					end
 | 
				
			||||||
            name = it["name"].as_s
 | 
					
 | 
				
			||||||
            !completed.includes?(name) && (url.ends_with?(".png") || url.ends_with?(".jpg"))
 | 
					class RedditResponse
 | 
				
			||||||
        end
 | 
					  JSON.mapping(
 | 
				
			||||||
 | 
					    modhash: String,
 | 
				
			||||||
 | 
					    dist: Int32,
 | 
				
			||||||
 | 
					    children: Array(RedditWrapper(RedditChild)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def self.from_subreddits(subreddits : Array(String))
 | 
				
			||||||
 | 
					    request_url = "https://www.reddit.com/r/#{subreddits.join "+" }/hot.json?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
 | 
				
			||||||
 | 
					      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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def filter_reddit_json(json, completed, extensions = ["png", "json"])
 | 
				
			||||||
 | 
					  json.data.posts_matching do |post|
 | 
				
			||||||
 | 
					    extensions.any? { |it| post.url.ends_with? it } && !completed.includes? post.url
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_reddit_post(subreddit, completed)
 | 
					def get_reddit_post(subreddit, completed)
 | 
				
			||||||
    json = get_reddit_json(subreddit)
 | 
					    json = RedditResponse.from_subreddit subreddit
 | 
				
			||||||
    post = json.try { |json| filter_reddit_json(json, completed).first? }
 | 
					    post = json.try { |json| filter_reddit_json(json, completed).first? }
 | 
				
			||||||
    post.try { |post| completed.push(post["name"].as_s); { post["url"].as_s, post["title"].as_s } }
 | 
					    post.try { |post| completed.push(post.name); { post.url, post.title } }
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user