steam-condenser 1.3.5 → 1.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +228 -0
  3. data/CONTRIBUTING.md +59 -0
  4. data/Gemfile.lock +12 -13
  5. data/README.md +9 -4
  6. data/lib/steam-condenser/version.rb +1 -1
  7. data/lib/steam/community/alien_swarm/alien_swarm_mission.rb +10 -9
  8. data/lib/steam/community/alien_swarm/alien_swarm_stats.rb +74 -72
  9. data/lib/steam/community/css/css_map.rb +2 -2
  10. data/lib/steam/community/css/css_stats.rb +54 -56
  11. data/lib/steam/community/css/css_weapon.rb +4 -4
  12. data/lib/steam/community/game_item.rb +2 -3
  13. data/lib/steam/community/game_leaderboard.rb +22 -15
  14. data/lib/steam/community/l4d/abstract_l4d_stats.rb +64 -61
  15. data/lib/steam/community/l4d/l4d2_stats.rb +26 -21
  16. data/lib/steam/community/steam_id.rb +8 -11
  17. data/lib/steam/community/web_api.rb +19 -14
  18. data/lib/steam/packets/s2a_info2_packet.rb +16 -14
  19. data/lib/steam/packets/s2a_info_detailed_packet.rb +24 -19
  20. data/lib/steam/packets/steam_packet_factory.rb +7 -2
  21. data/lib/steam/servers/game_server.rb +3 -2
  22. data/lib/steam/servers/master_server.rb +1 -1
  23. data/lib/steam/sockets/source_socket.rb +4 -9
  24. data/pkg/steam-condenser-1.3.5.gem +0 -0
  25. data/pkg/steam-condenser-1.3.5/Gemfile +7 -0
  26. data/pkg/steam-condenser-1.3.5/Gemfile.lock +45 -0
  27. data/pkg/steam-condenser-1.3.5/LICENSE +25 -0
  28. data/pkg/steam-condenser-1.3.5/README.md +70 -0
  29. data/pkg/steam-condenser-1.3.5/Rakefile +46 -0
  30. data/pkg/steam-condenser-1.3.5/lib/core_ext/stringio.rb +91 -0
  31. data/pkg/steam-condenser-1.3.5/lib/errors/packet_format_error.rb +13 -0
  32. data/pkg/steam-condenser-1.3.5/lib/errors/rcon_ban_error.rb +22 -0
  33. data/pkg/steam-condenser-1.3.5/lib/errors/rcon_no_auth_error.rb +21 -0
  34. data/pkg/steam-condenser-1.3.5/lib/errors/steam_condenser_error.rb +26 -0
  35. data/pkg/steam-condenser-1.3.5/lib/errors/timeout_error.rb +28 -0
  36. data/pkg/steam-condenser-1.3.5/lib/errors/web_api_error.rb +57 -0
  37. data/pkg/steam-condenser-1.3.5/lib/steam-condenser.rb +18 -0
  38. data/pkg/steam-condenser-1.3.5/lib/steam-condenser/community.rb +24 -0
  39. data/pkg/steam-condenser-1.3.5/lib/steam-condenser/servers.rb +24 -0
  40. data/pkg/steam-condenser-1.3.5/lib/steam-condenser/version.rb +11 -0
  41. data/pkg/steam-condenser-1.3.5/lib/steam/community/alien_swarm/alien_swarm_mission.rb +119 -0
  42. data/pkg/steam-condenser-1.3.5/lib/steam/community/alien_swarm/alien_swarm_stats.rb +186 -0
  43. data/pkg/steam-condenser-1.3.5/lib/steam/community/alien_swarm/alien_swarm_weapon.rb +49 -0
  44. data/pkg/steam-condenser-1.3.5/lib/steam/community/app_news.rb +133 -0
  45. data/pkg/steam-condenser-1.3.5/lib/steam/community/cacheable.rb +199 -0
  46. data/pkg/steam-condenser-1.3.5/lib/steam/community/css/css_map.rb +61 -0
  47. data/pkg/steam-condenser-1.3.5/lib/steam/community/css/css_stats.rb +142 -0
  48. data/pkg/steam-condenser-1.3.5/lib/steam/community/css/css_weapon.rb +69 -0
  49. data/pkg/steam-condenser-1.3.5/lib/steam/community/defense_grid/defense_grid_stats.rb +238 -0
  50. data/pkg/steam-condenser-1.3.5/lib/steam/community/dods/dods_class.rb +90 -0
  51. data/pkg/steam-condenser-1.3.5/lib/steam/community/dods/dods_stats.rb +62 -0
  52. data/pkg/steam-condenser-1.3.5/lib/steam/community/dods/dods_weapon.rb +67 -0
  53. data/pkg/steam-condenser-1.3.5/lib/steam/community/dota2/dota2_beta_inventory.rb +30 -0
  54. data/pkg/steam-condenser-1.3.5/lib/steam/community/dota2/dota2_inventory.rb +30 -0
  55. data/pkg/steam-condenser-1.3.5/lib/steam/community/dota2/dota2_item.rb +33 -0
  56. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_achievement.rb +109 -0
  57. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_class.rb +22 -0
  58. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_inventory.rb +171 -0
  59. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_item.rb +156 -0
  60. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_item_schema.rb +131 -0
  61. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_leaderboard.rb +205 -0
  62. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_leaderboard_entry.rb +43 -0
  63. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_stats.rb +175 -0
  64. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_weapon.rb +41 -0
  65. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/abstract_l4d_stats.rb +185 -0
  66. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/abstract_l4d_weapon.rb +56 -0
  67. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d2_map.rb +90 -0
  68. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d2_stats.rb +174 -0
  69. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d2_weapon.rb +38 -0
  70. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_explosive.rb +34 -0
  71. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_map.rb +65 -0
  72. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_stats.rb +73 -0
  73. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_weapon.rb +26 -0
  74. data/pkg/steam-condenser-1.3.5/lib/steam/community/portal2/portal2_inventory.rb +30 -0
  75. data/pkg/steam-condenser-1.3.5/lib/steam/community/portal2/portal2_item.rb +55 -0
  76. data/pkg/steam-condenser-1.3.5/lib/steam/community/portal2/portal2_stats.rb +33 -0
  77. data/pkg/steam-condenser-1.3.5/lib/steam/community/steam_game.rb +193 -0
  78. data/pkg/steam-condenser-1.3.5/lib/steam/community/steam_group.rb +129 -0
  79. data/pkg/steam-condenser-1.3.5/lib/steam/community/steam_id.rb +498 -0
  80. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_beta_inventory.rb +28 -0
  81. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_class.rb +92 -0
  82. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_class_factory.rb +40 -0
  83. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_engineer.rb +43 -0
  84. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_golden_wrench.rb +70 -0
  85. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_inventory.rb +30 -0
  86. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_item.rb +55 -0
  87. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_medic.rb +35 -0
  88. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_sniper.rb +28 -0
  89. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_spy.rb +41 -0
  90. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_stats.rb +77 -0
  91. data/pkg/steam-condenser-1.3.5/lib/steam/community/web_api.rb +130 -0
  92. data/pkg/steam-condenser-1.3.5/lib/steam/community/xml_data.rb +27 -0
  93. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2m_get_servers_batch2_packet.rb +59 -0
  94. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_info_packet.rb +24 -0
  95. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_player_packet.rb +31 -0
  96. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_rules_packet.rb +32 -0
  97. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_serverquery_getchallenge_packet.rb +25 -0
  98. data/pkg/steam-condenser-1.3.5/lib/steam/packets/c2m_checkmd5_packet.rb +31 -0
  99. data/pkg/steam-condenser-1.3.5/lib/steam/packets/m2a_server_batch_packet.rb +52 -0
  100. data/pkg/steam-condenser-1.3.5/lib/steam/packets/m2c_isvalidmd5_packet.rb +34 -0
  101. data/pkg/steam-condenser-1.3.5/lib/steam/packets/m2s_requestrestart_packet.rb +34 -0
  102. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_auth_request.rb +28 -0
  103. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_auth_response.rb +30 -0
  104. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_exec_request.rb +28 -0
  105. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_exec_response.rb +37 -0
  106. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_goldsrc_request.rb +35 -0
  107. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_goldsrc_response.rb +34 -0
  108. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_packet.rb +57 -0
  109. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_packet_factory.rb +43 -0
  110. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_terminator.rb +29 -0
  111. data/pkg/steam-condenser-1.3.5/lib/steam/packets/request_with_challenge.rb +19 -0
  112. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_info2_packet.rb +74 -0
  113. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_info_base_packet.rb +25 -0
  114. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_info_detailed_packet.rb +59 -0
  115. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_logstring_packet.rb +30 -0
  116. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_player_packet.rb +44 -0
  117. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_rules_packet.rb +48 -0
  118. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2c_challenge_packet.rb +35 -0
  119. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2m_heartbeat2_packet.rb +72 -0
  120. data/pkg/steam-condenser-1.3.5/lib/steam/packets/steam_packet.rb +52 -0
  121. data/pkg/steam-condenser-1.3.5/lib/steam/packets/steam_packet_factory.rb +108 -0
  122. data/pkg/steam-condenser-1.3.5/lib/steam/servers/game_server.rb +392 -0
  123. data/pkg/steam-condenser-1.3.5/lib/steam/servers/goldsrc_server.rb +74 -0
  124. data/pkg/steam-condenser-1.3.5/lib/steam/servers/master_server.rb +188 -0
  125. data/pkg/steam-condenser-1.3.5/lib/steam/servers/server.rb +115 -0
  126. data/pkg/steam-condenser-1.3.5/lib/steam/servers/source_server.rb +117 -0
  127. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/goldsrc_socket.rb +142 -0
  128. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/master_server_socket.rb +34 -0
  129. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/rcon_socket.rb +103 -0
  130. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/source_socket.rb +78 -0
  131. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/steam_socket.rb +91 -0
  132. data/pkg/steam-condenser-1.3.5/lib/steam/steam_player.rb +143 -0
  133. data/pkg/steam-condenser-1.3.5/steam-condenser.gemspec +26 -0
  134. data/pkg/steam-condenser-1.3.5/test/core_ext/test_stringio.rb +59 -0
  135. data/pkg/steam-condenser-1.3.5/test/fixtures/invalid.xml +2 -0
  136. data/pkg/steam-condenser-1.3.5/test/fixtures/sonofthor.xml +882 -0
  137. data/pkg/steam-condenser-1.3.5/test/fixtures/status_goldsrc +3 -0
  138. data/pkg/steam-condenser-1.3.5/test/fixtures/status_source +3 -0
  139. data/pkg/steam-condenser-1.3.5/test/fixtures/valve-members.xml +231 -0
  140. data/pkg/steam-condenser-1.3.5/test/helper.rb +48 -0
  141. data/pkg/steam-condenser-1.3.5/test/steam/community/test_cacheable.rb +100 -0
  142. data/pkg/steam-condenser-1.3.5/test/steam/community/test_steam_group.rb +83 -0
  143. data/pkg/steam-condenser-1.3.5/test/steam/community/test_steam_id.rb +144 -0
  144. data/pkg/steam-condenser-1.3.5/test/steam/community/test_web_api.rb +98 -0
  145. data/pkg/steam-condenser-1.3.5/test/steam/packets/test_steam_packet.rb +37 -0
  146. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_game_server.rb +296 -0
  147. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_goldsrc_server.rb +59 -0
  148. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_master_server.rb +131 -0
  149. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_server.rb +72 -0
  150. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_source_server.rb +134 -0
  151. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_goldsrc_socket.rb +127 -0
  152. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_master_server_socket.rb +42 -0
  153. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_rcon_socket.rb +118 -0
  154. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_source_socket.rb +77 -0
  155. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_steam_socket.rb +97 -0
  156. data/steam-condenser.gemspec +2 -3
  157. data/test/steam/community/test_cacheable.rb +3 -0
  158. data/test/steam/community/test_web_api.rb +15 -2
  159. data/test/steam/packets/test_steam_packet.rb +1 -1
  160. data/test/steam/sockets/test_source_socket.rb +1 -1
  161. metadata +151 -27
@@ -0,0 +1,77 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2008-2012, Sebastian Staudt
5
+
6
+ require 'steam/community/game_stats'
7
+ require 'steam/community/tf2/tf2_beta_inventory'
8
+ require 'steam/community/tf2/tf2_class_factory'
9
+ require 'steam/community/tf2/tf2_inventory'
10
+
11
+ # This class represents the game statistics for a single user in Team Fortress
12
+ # 2
13
+ #
14
+ # @author Sebastian Staudt
15
+ class TF2Stats < GameStats
16
+
17
+ # Returns the total points this player has achieved in his career
18
+ #
19
+ # @return [Fixnum] This player's accumulated points
20
+ attr_reader :accumulated_points
21
+
22
+ # Returns the accumulated number of seconds this player has spent playing as a TF2 class
23
+ #
24
+ # @return [Fixnum] total seconds played as a TF2 class
25
+ attr_reader :total_playtime
26
+
27
+ # Creates a `TF2Stats` instance by calling the super constructor with the
28
+ # game name `'tf2'`
29
+ #
30
+ # @param [String, Fixnum] steam_id The custom URL or 64bit Steam ID of the
31
+ # user
32
+ # @param [Boolean] beta If `true, creates stats for the public TF2 beta
33
+ # @macro cacheable
34
+ def initialize(steam_id, beta = false)
35
+ super steam_id, (beta ? '520' : 'tf2')
36
+
37
+ if public? && !@xml_data['stats']['accumulatedPoints'].nil?
38
+ @accumulated_points = @xml_data['stats']['accumulatedPoints'].to_i
39
+ end
40
+ if public? && !@xml_data['stats']['secondsPlayedAllClassesLifetime'].nil?
41
+ @total_playtime = @xml_data['stats']['secondsPlayedAllClassesLifetime']
42
+ end
43
+ end
44
+
45
+ # Returns the statistics for all Team Fortress 2 classes for this user
46
+ #
47
+ # If the classes haven't been parsed already, parsing is done now.
48
+ #
49
+ # @return [Hash<String, TF2Class>] A hash storing individual stats for each
50
+ # Team Fortress 2 class
51
+ def class_stats
52
+ return unless public?
53
+
54
+ if @class_stats.nil?
55
+ @class_stats = Hash.new
56
+ @xml_data['stats']['classData'].each do |class_data|
57
+ @class_stats[class_data['className']] = TF2ClassFactory.tf2_class(class_data)
58
+ end
59
+ end
60
+
61
+ @class_stats
62
+ end
63
+
64
+ # Returns the current Team Fortress 2 inventory (a.k.a. backpack) of this
65
+ # player
66
+ #
67
+ # @return [TF2Inventory] This player's TF2 backpack
68
+ def inventory
69
+ if @inventory.nil?
70
+ inventory_class = (game.short_name == 'tf2') ? TF2Inventory : TF2BetaInventory
71
+ @inventory = inventory_class.new(user.steam_id64) if @inventory.nil?
72
+ end
73
+
74
+ @inventory
75
+ end
76
+
77
+ end
@@ -0,0 +1,130 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2010-2012, Sebastian Staudt
5
+
6
+ require 'multi_json'
7
+ require 'open-uri'
8
+
9
+ require 'errors/web_api_error'
10
+
11
+ # This module provides functionality for accessing Steam's Web API
12
+ #
13
+ # The Web API requires you to register a domain with your Steam account to
14
+ # acquire an API key. See http://steamcommunity.com/dev for further details.
15
+ #
16
+ # @author Sebastian
17
+ module WebApi
18
+
19
+ @@api_key = nil
20
+
21
+ # Returns the Steam Web API key currently used by Steam Condenser
22
+ #
23
+ # @return [String] The currently active Steam Web API key
24
+ def self.api_key
25
+ @@api_key
26
+ end
27
+
28
+ # Sets the Steam Web API key
29
+ #
30
+ # @param [String] api_key The 128bit API key as a hexadecimal string that has
31
+ # to be requested from http://steamcommunity.com/dev
32
+ # @raise [WebApiError] if the given API key is not a valid 128bit hexadecimal
33
+ # string
34
+ def self.api_key=(api_key)
35
+ unless api_key.nil? || api_key.match(/^[0-9A-F]{32}$/)
36
+ raise WebApiError, :invalid_key
37
+ end
38
+
39
+ @@api_key = api_key
40
+ end
41
+
42
+ # Returns a raw list of interfaces and their methods that are available in
43
+ # Steam's Web API
44
+ #
45
+ # This can be used for reference when accessing interfaces and methods that
46
+ # have not yet been implemented by Steam Condenser.
47
+ #
48
+ # @return [Array<Hash>] The list of interfaces and methods
49
+ def self.interfaces
50
+ data = json 'ISteamWebAPIUtil', 'GetSupportedAPIList'
51
+ MultiJson.load(data, { :symbolize_keys => true })[:apilist][:interfaces]
52
+ end
53
+
54
+ # Fetches JSON data from Steam Web API using the specified interface, method
55
+ # and version. Additional parameters are supplied via HTTP GET.
56
+ # Data is returned as a JSON-encoded string.
57
+ #
58
+ # @param [String] interface The Web API interface to call, e.g. `ISteamUser`
59
+ # @param [String] method The Web API method to call, e.g.
60
+ # `GetPlayerSummaries`
61
+ # @param [Fixnum] version The API method version to use
62
+ # @param [Hash<Symbol, Object>] params Additional parameters to supply via
63
+ # HTTP GET
64
+ # @raise [WebApiError] if the request to Steam's Web API fails
65
+ # @return [String] The raw JSON data replied to the request
66
+ def self.json(interface, method, version = 1, params = nil)
67
+ get(:json, interface, method, version, params)
68
+ end
69
+
70
+ # Fetches JSON data from Steam Web API using the specified interface, method
71
+ # and version. Additional parameters are supplied via HTTP GET.
72
+ # Data is returned as a Hash containing the JSON data.
73
+ #
74
+ # @param [String] interface The Web API interface to call, e.g. `ISteamUser`
75
+ # @param [String] method The Web API method to call, e.g.
76
+ # `GetPlayerSummaries`
77
+ # @param [Fixnum] version The API method version to use
78
+ # @param [Hash<Symbol, Object>] params Additional parameters to supply via
79
+ # HTTP GET
80
+ # @raise [WebApiError] if the request to Steam's Web API fails
81
+ # @return [Hash<Symbol, Object>] The JSON data replied to the request
82
+ def self.json!(interface, method, version = 1, params = nil)
83
+ data = json(interface, method, version, params)
84
+ result = MultiJson.load(data, { :symbolize_keys => true })[:result]
85
+
86
+ status = result[:status]
87
+ if status != 1
88
+ raise WebApiError.new :status_bad, status, result[:statusDetail]
89
+ end
90
+
91
+ result
92
+ end
93
+
94
+ # Fetches data from Steam Web API using the specified interface, method and
95
+ # version. Additional parameters are supplied via HTTP GET. Data is returned
96
+ # as a string in the given format.
97
+ #
98
+ # @param [Symbol] format The format to load from the API (`:json`, `:vdf`, or
99
+ # `:xml`)
100
+ # @param [String] interface The Web API interface to call, e.g. `ISteamUser`
101
+ # @param [String] method The Web API method to call, e.g.
102
+ # `GetPlayerSummaries`
103
+ # @param [Fixnum] version The API method version to use
104
+ # @param [Hash<Symbol, Object>] params Additional parameters to supply via
105
+ # HTTP GET
106
+ # @raise [WebApiError] if the request to Steam's Web API fails
107
+ # @return [String] The data as replied by the Web API in the desired format
108
+ def self.get(format, interface, method, version = 1, params = nil)
109
+ version = version.to_s.rjust(4, '0')
110
+ url = "http://api.steampowered.com/#{interface}/#{method}/v#{version}/"
111
+ params = {} unless params.is_a?(Hash)
112
+ params[:format] = format
113
+ params[:key] = WebApi.api_key
114
+
115
+ unless params.nil? && params.empty?
116
+ url += '?' + params.map { |k,v| "#{k}=#{v}" }.join('&')
117
+ end
118
+
119
+ begin
120
+ puts "Querying Steam Web API: #{url.gsub(@@api_key, 'SECRET')}" if $DEBUG
121
+ open(url, { :proxy => true }).read
122
+ rescue OpenURI::HTTPError
123
+ status = $!.io.status[0]
124
+ status = [status, ''] unless status.is_a? Array
125
+ raise WebApiError, :unauthorized if status[0].to_i == 401
126
+ raise WebApiError.new :http_error, status[0].to_i, status[1]
127
+ end
128
+ end
129
+
130
+ end
@@ -0,0 +1,27 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2011-2012, Sebastian Staudt
5
+
6
+ require 'open-uri'
7
+
8
+ require 'multi_xml'
9
+
10
+ # This class provides basic functionality to parse XML data
11
+ #
12
+ # @author Sebastian Staudt
13
+ module XMLData
14
+
15
+ # Parse the given URL as XML data using `multi_xml`
16
+ #
17
+ # @param [String] url The URL to parse
18
+ # @return [Hash<String, Object>] The data parsed from the XML document
19
+ # @raise [SteamCondenserError] if an error occurs while parsing the XML data
20
+ def parse(url)
21
+ data = open(url, { :proxy => true })
22
+ @xml_data = MultiXml.parse(data).values.first
23
+ rescue
24
+ raise SteamCondenserError.new "XML data could not be parsed: #{$!.message}", $!
25
+ end
26
+
27
+ end
@@ -0,0 +1,59 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2008-2011, Sebastian Staudt
5
+
6
+ require 'steam/packets/steam_packet'
7
+ require 'steam/servers/master_server'
8
+
9
+ # This packet class represents a A2M_GET_SERVERS_BATCH2 request sent to a
10
+ # master server
11
+ #
12
+ # It is used to receive a list of game servers matching the specified filters.
13
+ #
14
+ # Filtering:
15
+ # Instead of filtering the results sent by the master server locally, you
16
+ # should at least use the following filters to narrow down the results sent by
17
+ # the master server. Receiving all servers from the master server is taking
18
+ # quite some time.
19
+ #
20
+ # Available filters:
21
+ #
22
+ # * `\type\d`: Request only dedicated servers
23
+ # * `\secure\1`: Request only secure servers
24
+ # * `\gamedir\[mod]`: Request only servers of a specific mod
25
+ # * `\map\[mapname]`: Request only servers running a specific map
26
+ # * `\linux\1`: Request only linux servers
27
+ # * `\emtpy\1`: Request only **non**-empty servers
28
+ # * `\full\`: Request only servers **not** full
29
+ # * `\proxy\1`: Request only spectator proxy servers
30
+ #
31
+ # @author Sebastian Staudt
32
+ # @see MasterServer#servers
33
+ class A2M_GET_SERVERS_BATCH2_Packet
34
+
35
+ include SteamPacket
36
+
37
+ # Creates a master server request, filtering by the given paramters
38
+ #
39
+ # @param [Numeric] region_code The region code to filter servers by region
40
+ # @param [String] start_ip This should be the last IP received from the
41
+ # master server or 0.0.0.0
42
+ # @param [String] filter The filters to apply in the form
43
+ # "\filtername\value..."
44
+ def initialize(region_code = MasterServer::REGION_ALL, start_ip = '0.0.0.0:0', filter = '')
45
+ super A2M_GET_SERVERS_BATCH2_HEADER
46
+
47
+ @filter = filter
48
+ @region_code = region_code
49
+ @start_ip = start_ip
50
+ end
51
+
52
+ # Returns the raw data representing this packet
53
+ #
54
+ # @return [String] A string containing the raw data of this request packet
55
+ def to_s
56
+ [@header_data, @region_code, @start_ip, @filter].pack('c2Z*Z*')
57
+ end
58
+
59
+ end
@@ -0,0 +1,24 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2008-2011, Sebastian Staudt
5
+
6
+ require 'steam/packets/steam_packet'
7
+
8
+ # This packet class class represents a A2S_INFO request send to a game server
9
+ #
10
+ # It will cause the server to send some basic information about itself, e.g.
11
+ # the running game, map and the number of players.
12
+ #
13
+ # @author Sebastian Staudt
14
+ # @see GameServer#update_server_info
15
+ class A2S_INFO_Packet
16
+
17
+ include SteamPacket
18
+
19
+ # Creates a new A2S_INFO request object
20
+ def initialize
21
+ super A2S_INFO_HEADER, "Source Engine Query\0"
22
+ end
23
+
24
+ end
@@ -0,0 +1,31 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2008-2011, Sebastian Staudt
5
+
6
+ require 'steam/packets/request_with_challenge'
7
+ require 'steam/packets/steam_packet'
8
+
9
+ # This packet class represents a A2S_PLAYER request send to a game server
10
+ #
11
+ # It is used to request the list of players currently playing on the server.
12
+ #
13
+ # This packet type requires the client to challenge the server in advance,
14
+ # which is done automatically if required.
15
+ #
16
+ # @author Sebastian Staudt
17
+ # @see GameServer#update_player_info
18
+ class A2S_PLAYER_Packet
19
+
20
+ include SteamPacket
21
+ include RequestWithChallenge
22
+
23
+ # Creates a new A2S_PLAYER request object including the challenge number
24
+ #
25
+ # @param [Numeric] challenge_number The challenge number received from the
26
+ # server
27
+ def initialize(challenge_number = -1)
28
+ super A2S_PLAYER_HEADER, challenge_number
29
+ end
30
+
31
+ end
@@ -0,0 +1,32 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2008-2011, Sebastian Staudt
5
+
6
+ require 'steam/packets/request_with_challenge'
7
+ require 'steam/packets/steam_packet'
8
+
9
+ # This packet class represents a A2S_RULES request send to a game server
10
+ #
11
+ # The game server will return a list of currently active game rules, e.g.
12
+ # `mp_friendlyfire = 1`.
13
+ #
14
+ # This packet type requires the client to challenge the server in advance,
15
+ # which is done automatically if required.
16
+ #
17
+ # @author Sebastian Staudt
18
+ # @see GameServer#update_rules_info
19
+ class A2S_RULES_Packet
20
+
21
+ include SteamPacket
22
+ include RequestWithChallenge
23
+
24
+ # Creates a new A2S_RULES request object including the challenge number
25
+ #
26
+ # @param [Numeric] challenge_number The challenge number received from the
27
+ # server
28
+ def initialize(challenge_number = -1)
29
+ super A2S_RULES_HEADER, challenge_number
30
+ end
31
+
32
+ end
@@ -0,0 +1,25 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2008-2011, Sebastian Staudt
5
+
6
+ require 'steam/packets/steam_packet'
7
+
8
+ # This packet class represents a A2S_SERVERQUERY_GETCHALLENGE request send to
9
+ # a game server
10
+ #
11
+ # It is used to retrieve a challenge number from the game server, which helps
12
+ # to identify the requesting client.
13
+ #
14
+ # @author Sebastian Staudt
15
+ # @see GameServer#update_challenge_number
16
+ class A2S_SERVERQUERY_GETCHALLENGE_Packet
17
+
18
+ include SteamPacket
19
+
20
+ # Creates a new A2S_SERVERQUERY_GETCHALLENGE request object
21
+ def initialize
22
+ super A2S_SERVERQUERY_GETCHALLENGE_HEADER
23
+ end
24
+
25
+ end
@@ -0,0 +1,31 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2010-2011, Sebastian Staudt
5
+
6
+ require 'steam/packets/steam_packet'
7
+
8
+ # This packet class represents a C2M_CHECKMD5 request sent to a master server
9
+ #
10
+ # It is used to initialize (challenge) master server communication.
11
+ #
12
+ # @author Sebastian Staudt
13
+ # @deprecated
14
+ # @see MasterServer#challenge
15
+ class C2M_CHECKMD5_Packet
16
+
17
+ include SteamPacket
18
+
19
+ # Creates a new C2M_CHECKMD5 request object
20
+ def initialize
21
+ super C2M_CHECKMD5_HEADER
22
+ end
23
+
24
+ # Returns the raw data representing this packet
25
+ #
26
+ # @return [String] A string containing the raw data of this request packet
27
+ def to_s
28
+ [@header_data, 0xFF].pack('c2')
29
+ end
30
+
31
+ end