# frozen_string_literal: true require "net/http" require "json" module GetXkcd # Class that exposes methods for fetching XKCD comic data class Comic # Get the json for the most recent xkcd comic def self.fetch_latest_issue_data uri = URI("https://xkcd.com/info.0.json") req = Net::HTTP::Get.new(uri) req["Accept"] = "application/json" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(req) end JSON.parse(res.body) end # Get the json for the xkcd comic of a specific issue def self.fetch_specific_issue_data(issue_number) uri = URI("https://xkcd.com/#{issue_number}/info.0.json") req = Net::HTTP::Get.new(uri) req["Accept"] = "application/json" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(req) end JSON.parse(res.body) end # Get the json for the xkcd comic of a random issue def self.fetch_random_issue_data fetch_specific_issue_data(generate_random_issue_number) end # Generate a random number up to the latest issue number (excluding 404) def self.generate_random_issue_number latest_issue_number = fetch_latest_issue_data["num"] generate_random_number_excluding_404(latest_issue_number) end # Generate a random number from 1 up to input argument (excluding 404) def self.generate_random_number_excluding_404(max) number = rand(max) + 1 return number unless number == 404 generate_random_number_excluding_404(max) end private_class_method :generate_random_issue_number, :generate_random_number_excluding_404 end end