lib/halo-reach-api.rb in halo-reach-api-1.0.4 vs lib/halo-reach-api.rb in halo-reach-api-1.0.5

- old
+ new

@@ -1,15 +1,15 @@ require 'httparty' require 'json' require 'cgi' +require 'version' + module Halo module Reach class API include HTTParty - - VERSION = '1.0.4'.freeze API_URL = 'http://www.bungie.net/api/reach/reachapijson.svc/' DEFAULT_HEADERS = { 'User-Agent' => "Halo:Reach API gem #{VERSION}" } @@ -19,99 +19,154 @@ format(:json) attr_accessor :api_url attr_accessor :token + # Create a new Halo::Reach::API class with your token def initialize(token, api_url = API_URL) @token = token @api_url = api_url end + # Set a new location for debug output def debug(location = $stderr) self.class.debug_output(location) end + # Set new HTTP headers def set_http_headers(http_headers = {}) http_headers.merge!(DEFAULT_HEADERS) headers(http_headers) end + # Set a new default HTTP timeout def set_timeout(timeout) default_timeout(timeout) end + # The "GetGameMetadata" method returns several dictionaries so that resource ids can be translated into their more detailed versions. + # For example, this method can be used to associate a medal resource id with its representative medal (say, a killing spree). + # + # http://www.haloreachapi.net/wiki/GetGameMetadata def get_game_metadata game_metadata_uri = "game/metadata/#{@token}" self.class.get(@api_url + game_metadata_uri) end - + + # The "GetCurrentChallenges" method returns the currently active weekly and daily challenges. + # + # http://www.haloreachapi.net/wiki/GetCurrentChallenges def get_current_challenges current_challenges_uri = "game/challenges/#{@token}" self.class.get(@api_url + current_challenges_uri) end + # The "GetGameDetails" method returns detailed information for a given game ID. + # + # http://www.haloreachapi.net/wiki/GetGameDetails def get_game_details(game_id) get_game_details_uri = "game/details/#{@token}/#{game_id}" self.class.get(@api_url + get_game_details_uri) end + # The "GetGameHistory" method returns a players list of games, in chronological reverse over. Returned games is paginated, + # and you can specific which game variant, (Invasion, Campaign, for example), or Unknown for all games. + # + # http://www.haloreachapi.net/wiki/GetGameHistory def get_game_history(gamertag, variant_class = 'Unknown', page = 0) - get_game_history_uri = "player/gamehistory/#{@token}/#{CGI.escape(gamertag)}/#{variant_class}/#{page}" + get_game_history_uri = "player/gamehistory/#{@token}/#{msftize(gamertag)}/#{variant_class}/#{page}" self.class.get(@api_url + get_game_history_uri) end + # Undocumented + # + # http://www.haloreachapi.net/wiki/GetPlayerDetailsWithStatsByMap def get_player_details_with_stats_by_map(gamertag) - get_player_details_with_stats_by_map_uri = "player/details/bymap/#{@token}/#{CGI.escape(gamertag)}" + get_player_details_with_stats_by_map_uri = "player/details/bymap/#{@token}/#{msftize(gamertag)}" self.class.get(@api_url + get_player_details_with_stats_by_map_uri) end + # The "GetPlayerDetailsWithStatsByPlaylist" method Returns detailed aggregate information on a player, including arena information. + # + # http://www.haloreachapi.net/wiki/GetPlayerDetailsWithStatsByPlaylist def get_player_details_with_stats_by_playlist(gamertag) - get_player_details_with_stats_by_playlist_uri = "player/details/byplaylist/#{@token}/#{CGI.escape(gamertag)}" + get_player_details_with_stats_by_playlist_uri = "player/details/byplaylist/#{@token}/#{msftize(gamertag)}" self.class.get(@api_url + get_player_details_with_stats_by_playlist_uri) end + # The "GetPlayerDetailsWithNoStats" method returns basic information about a player. + # + # http://www.haloreachapi.net/wiki/GetPlayerDetailsWithNoStats def get_player_details_with_no_stats(gamertag) - get_player_details_with_no_stats_uri = "player/details/nostats/#{@token}/#{CGI.escape(gamertag)}" + get_player_details_with_no_stats_uri = "player/details/nostats/#{@token}/#{msftize(gamertag)}" self.class.get(@api_url + get_player_details_with_no_stats_uri) end + # The "GetPlayerFileShare" method returns a listing of files in a player's file share. + # + # http://www.haloreachapi.net/wiki/GetPlayerFileShare def get_player_file_share(gamertag) - get_player_file_share_uri = "file/share/#{@token}/#{CGI.escape(gamertag)}" + get_player_file_share_uri = "file/share/#{@token}/#{msftize(gamertag)}" self.class.get(@api_url + get_player_file_share_uri) end + # The "GetFileDetails" method returns the file details for a single file. + # + # http://www.haloreachapi.net/wiki/GetFileDetails def get_file_details(file_id) get_file_details_uri = "file/details/#{@token}/#{file_id}" self.class.get(@api_url + get_file_details_uri) end + # The "GetPlayerRecentScreenshots" method returns a list of the player's recent screenshots. + # + # http://www.haloreachapi.net/wiki/GetPlayerRecentScreenshots def get_player_recent_screenshots(gamertag) - get_player_recent_screenshots_uri = "file/screenshots/#{@token}/#{CGI.escape(gamertag)}" + get_player_recent_screenshots_uri = "file/screenshots/#{@token}/#{msftize(gamertag)}" self.class.get(@api_url + get_player_recent_screenshots_uri) end + # The "GetPlayerFileSets" method returns a listing of file sets created by the player. + # + # http://www.haloreachapi.net/wiki/GetPlayerFileSets def get_player_file_sets(gamertag) - get_player_file_sets_uri = "file/sets/#{@token}/#{CGI.escape(gamertag)}" + get_player_file_sets_uri = "file/sets/#{@token}/#{msftize(gamertag)}" self.class.get(@api_url + get_player_file_sets_uri) end + # The "GetPlayerFileSetFiles" method returns a listing of files in the specified file set. + # + # http://www.haloreachapi.net/wiki/GetPlayerFileSetFiles def get_player_file_set_files(gamertag, file_set_id) - get_player_file_set_files_uri = "file/sets/files/#{@token}/#{CGI.escape(gamertag)}/#{file_set_id}" + get_player_file_set_files_uri = "file/sets/files/#{@token}/#{msftize(gamertag)}/#{file_set_id}" self.class.get(@api_url + get_player_file_set_files_uri) end - + + # The "GetPlayerRenderedVideos" method returns a listing of rendered videos created by a player. + # + # http://www.haloreachapi.net/wiki/GetPlayerRenderedVideos def get_player_rendered_videos(gamertag, page = 0) - get_player_rendered_videos_uri = "file/videos/#{@token}/#{CGI.escape(gamertag)}/#{page}" + get_player_rendered_videos_uri = "file/videos/#{@token}/#{msftize(gamertag)}/#{page}" self.class.get(@api_url + get_player_rendered_videos_uri) end - + + # The "ReachFileSearch" method returns a listing of files matching the specified criteria. + # + # http://www.haloreachapi.net/wiki/ReachFileSearch def reach_file_search(file_category, map_filter, engine_filter, date_filter, sort_filter, tags, page = 0) reach_file_search_uri = "file/search/#{@token}/#{file_category}/#{map_filter}/#{engine_filter}/#{date_filter}/#{sort_filter}/#{page}" unless tags.nil? reach_file_search_uri += "?tags=#{CGI.escape(tags)}" end self.class.get(@api_url + reach_file_search_uri) + end + + private + + # MSFT servers are not able to parse the '+' if doing a straight CGI.escape + def msftize(gamertag) + gamertag.gsub(' ', '%20') end end end end