steam-condenser 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +30 -0
- data/LICENSE +1 -1
- data/README.md +4 -3
- data/lib/steam-condenser/version.rb +2 -2
- data/lib/steam/community/alien_swarm/alien_swarm_mission.rb +24 -22
- data/lib/steam/community/alien_swarm/alien_swarm_stats.rb +66 -65
- data/lib/steam/community/alien_swarm/alien_swarm_weapon.rb +6 -6
- data/lib/steam/community/app_news.rb +2 -2
- data/lib/steam/community/css/css_map.rb +4 -4
- data/lib/steam/community/css/css_stats.rb +43 -43
- data/lib/steam/community/css/css_weapon.rb +5 -5
- data/lib/steam/community/defense_grid/defense_grid_stats.rb +36 -35
- data/lib/steam/community/dods/dods_class.rb +14 -14
- data/lib/steam/community/dods/dods_stats.rb +5 -4
- data/lib/steam/community/dods/dods_weapon.rb +6 -6
- data/lib/steam/community/game_achievement.rb +38 -31
- data/lib/steam/community/game_inventory.rb +6 -6
- data/lib/steam/community/game_leaderboard.rb +34 -32
- data/lib/steam/community/game_leaderboard_entry.rb +6 -6
- data/lib/steam/community/game_stats.rb +39 -65
- data/lib/steam/community/game_weapon.rb +2 -2
- data/lib/steam/community/l4d/abstract_l4d_stats.rb +54 -49
- data/lib/steam/community/l4d/abstract_l4d_weapon.rb +7 -6
- data/lib/steam/community/l4d/l4d2_map.rb +10 -10
- data/lib/steam/community/l4d/l4d2_stats.rb +33 -33
- data/lib/steam/community/l4d/l4d2_weapon.rb +8 -7
- data/lib/steam/community/l4d/l4d_explosive.rb +5 -4
- data/lib/steam/community/l4d/l4d_map.rb +8 -7
- data/lib/steam/community/l4d/l4d_stats.rb +7 -7
- data/lib/steam/community/l4d/l4d_weapon.rb +5 -4
- data/lib/steam/community/portal2/portal2_stats.rb +3 -3
- data/lib/steam/community/steam_game.rb +106 -16
- data/lib/steam/community/steam_group.rb +51 -40
- data/lib/steam/community/steam_id.rb +119 -87
- data/lib/steam/community/tf2/tf2_class.rb +14 -14
- data/lib/steam/community/tf2/tf2_class_factory.rb +2 -2
- data/lib/steam/community/tf2/tf2_engineer.rb +5 -7
- data/lib/steam/community/tf2/tf2_golden_wrench.rb +1 -1
- data/lib/steam/community/tf2/tf2_medic.rb +4 -6
- data/lib/steam/community/tf2/tf2_sniper.rb +3 -5
- data/lib/steam/community/tf2/tf2_spy.rb +10 -6
- data/lib/steam/community/tf2/tf2_stats.rb +15 -7
- data/lib/steam/community/web_api.rb +15 -1
- data/lib/steam/community/xml_data.rb +17 -0
- data/lib/steam/servers/game_server.rb +4 -4
- data/lib/steam/servers/master_server.rb +2 -2
- data/lib/steam/servers/source_server.rb +0 -2
- data/lib/steam/sockets/goldsrc_socket.rb +2 -2
- data/lib/steam/steam_player.rb +2 -2
- data/steam-condenser.gemspec +3 -2
- data/test/helper.rb +10 -2
- data/test/steam/communtiy/test_steam_group.rb +4 -4
- data/test/steam/communtiy/test_steam_id.rb +28 -2
- data/test/steam/communtiy/test_web_api.rb +2 -2
- data/test/steam/packets/test_steam_packet.rb +37 -0
- data/test/steam/servers/test_game_server.rb +296 -308
- data/test/steam/servers/test_goldsrc_server.rb +59 -59
- data/test/steam/servers/test_master_server.rb +131 -131
- data/test/steam/servers/test_server.rb +72 -72
- data/test/steam/servers/test_source_server.rb +126 -140
- data/test/steam/sockets/test_master_server_socket.rb +1 -0
- metadata +39 -19
@@ -1,7 +1,7 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under
|
2
2
|
# the terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2011, Sebastian Staudt
|
4
|
+
# Copyright (c) 2011-2012, Sebastian Staudt
|
5
5
|
|
6
6
|
# The GameLeaderboard class represents a single entry in a leaderboard
|
7
7
|
#
|
@@ -30,13 +30,13 @@ class GameLeaderboardEntry
|
|
30
30
|
|
31
31
|
# Creates new entry instance for the given XML data and leaderboard
|
32
32
|
#
|
33
|
-
# @param [
|
34
|
-
# leaderboard entry
|
33
|
+
# @param [Hash<String, Object>] entry_data The XML data of the leaderboard of
|
34
|
+
# the leaderboard entry
|
35
35
|
# @param [GameLeaderboard] leaderboard The leaderboard this entry belongs to
|
36
36
|
def initialize(entry_data, leaderboard)
|
37
|
-
@steam_id = SteamId.new entry_data
|
38
|
-
@score = entry_data
|
39
|
-
@rank = entry_data
|
37
|
+
@steam_id = SteamId.new entry_data['steamid'].to_i, false
|
38
|
+
@score = entry_data['score'].to_i
|
39
|
+
@rank = entry_data['rank'].to_i
|
40
40
|
@leaderboard = leaderboard
|
41
41
|
end
|
42
42
|
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under
|
2
2
|
# the terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
5
|
-
|
6
|
-
require 'open-uri'
|
7
|
-
require 'rexml/document'
|
4
|
+
# Copyright (c) 2008-2012, Sebastian Staudt
|
8
5
|
|
9
6
|
require 'steam/community/game_achievement'
|
10
7
|
require 'steam/community/game_leaderboard'
|
8
|
+
require 'steam/community/xml_data'
|
11
9
|
|
12
10
|
# This class represents the game statistics for a single user and a specific
|
13
11
|
# game
|
@@ -18,25 +16,12 @@ require 'steam/community/game_leaderboard'
|
|
18
16
|
# @author Sebastian Staudt
|
19
17
|
class GameStats
|
20
18
|
|
21
|
-
|
22
|
-
#
|
23
|
-
# @return [Fixnum] The Steam application ID of the game
|
24
|
-
attr_reader :app_id
|
25
|
-
|
26
|
-
# Returns the custom URL of the player these stats belong to
|
27
|
-
#
|
28
|
-
# @return [String] The custom URL of the player
|
29
|
-
attr_reader :custom_url
|
30
|
-
|
31
|
-
# Returns the friendly name of the game these stats belong to
|
32
|
-
#
|
33
|
-
# @return [String ]The frienldy name of the game
|
34
|
-
attr_reader :game_friendly_name
|
19
|
+
include XMLData
|
35
20
|
|
36
|
-
# Returns the
|
21
|
+
# Returns the game these stats belong to
|
37
22
|
#
|
38
|
-
# @return [
|
39
|
-
attr_reader :
|
23
|
+
# @return [SteamGame] The game object
|
24
|
+
attr_reader :game
|
40
25
|
|
41
26
|
# Returns the number of hours this game has been played by the player
|
42
27
|
#
|
@@ -48,10 +33,26 @@ class GameStats
|
|
48
33
|
# @return [String] The privacy setting of the Steam ID
|
49
34
|
attr_reader :privacy_state
|
50
35
|
|
51
|
-
# Returns the
|
36
|
+
# Returns the Steam ID of the player these stats belong to
|
52
37
|
#
|
53
|
-
# @return [
|
54
|
-
attr_reader :
|
38
|
+
# @return [SteamId] The Steam ID instance of the player
|
39
|
+
attr_reader :user
|
40
|
+
|
41
|
+
# Returns the base Steam Communtiy URL for the given player and game IDs
|
42
|
+
#
|
43
|
+
# @param [Fixnum, String] user_id The 64bit SteamID or custom URL of the user
|
44
|
+
# @param [Fixnum, String] game_id The application ID or short name of the
|
45
|
+
# game
|
46
|
+
# @return The base URL used for the given stats IDs
|
47
|
+
def self.base_url(user_id, game_id)
|
48
|
+
game_url = game_id.is_a?(Fixnum) ? "appid/#{game_id}" : game_id
|
49
|
+
|
50
|
+
if user_id.is_a? Fixnum
|
51
|
+
"http://steamcommunity.com/profiles/#{user_id}/stats/#{game_url}"
|
52
|
+
else
|
53
|
+
"http://steamcommunity.com/id/#{user_id}/stats/#{game_url}"
|
54
|
+
end
|
55
|
+
end
|
55
56
|
|
56
57
|
# Creates a `GameStats` (or one of its subclasses) instance for the given
|
57
58
|
# user and game
|
@@ -94,31 +95,23 @@ class GameStats
|
|
94
95
|
# Creates a `GameStats` object and fetches data from the Steam Community for
|
95
96
|
# the given user and game
|
96
97
|
#
|
97
|
-
# @param [String, Fixnum]
|
98
|
+
# @param [String, Fixnum] user_id The custom URL or the 64bit Steam ID of the
|
98
99
|
# user
|
99
|
-
# @param [String]
|
100
|
+
# @param [String] game_id The application ID or friendly name of the game
|
100
101
|
# @raise [SteamCondenserError] if the stats cannot be fetched
|
101
|
-
def initialize(
|
102
|
-
|
103
|
-
@steam_id64 = id
|
104
|
-
else
|
105
|
-
@custom_url = id.downcase
|
106
|
-
end
|
107
|
-
@game_friendly_name = game_name
|
102
|
+
def initialize(user_id, game_id)
|
103
|
+
@xml_data = parse "#{self.class.base_url(user_id, game_id)}?xml=all"
|
108
104
|
|
109
|
-
|
110
|
-
@xml_data = REXML::Document.new(open(url, {:proxy => true}).read).root
|
105
|
+
@user = SteamId.new user_id, false
|
111
106
|
|
112
|
-
error = @xml_data
|
113
|
-
raise SteamCondenserError, error
|
107
|
+
error = @xml_data['error']
|
108
|
+
raise SteamCondenserError, error unless error.nil?
|
114
109
|
|
115
|
-
@privacy_state = @xml_data
|
110
|
+
@privacy_state = @xml_data['privacyState']
|
116
111
|
if public?
|
117
|
-
|
118
|
-
@
|
119
|
-
@
|
120
|
-
@hours_played = @xml_data.elements['stats/hoursPlayed'].text unless @xml_data.elements['stats/hoursPlayed'].nil?
|
121
|
-
@steam_id64 = @xml_data.elements['player/steamID64'].text.to_i if @steam_id64.nil?
|
112
|
+
app_id = @xml_data['game']['gameLink'].match(/http:\/\/store.steampowered.com\/app\/([1-9][0-9]+)/)[1].to_i
|
113
|
+
@game = SteamGame.new app_id, @xml_data['game']
|
114
|
+
@hours_played = @xml_data['stats']['hoursPlayed'] unless @xml_data['stats']['hoursPlayed'].nil?
|
122
115
|
end
|
123
116
|
end
|
124
117
|
|
@@ -132,8 +125,8 @@ class GameStats
|
|
132
125
|
|
133
126
|
if @achievements.nil?
|
134
127
|
@achievements = Array.new
|
135
|
-
@xml_data
|
136
|
-
@achievements << GameAchievement.new(@
|
128
|
+
@xml_data['achievements']['achievement'].each do |achievement|
|
129
|
+
@achievements << GameAchievement.new(@user, @game, achievement)
|
137
130
|
end
|
138
131
|
|
139
132
|
@achievements_done = @achievements.reject{ |a| !a.unlocked? }.size
|
@@ -169,26 +162,7 @@ class GameStats
|
|
169
162
|
#
|
170
163
|
# @return [String] The base URL used for queries on these stats
|
171
164
|
def base_url
|
172
|
-
|
173
|
-
"http://steamcommunity.com/profiles/#{@steam_id64}/stats/#{@game_friendly_name}"
|
174
|
-
else
|
175
|
-
"http://steamcommunity.com/id/#{@custom_url}/stats/#{@game_friendly_name}"
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
# Returns the leaderboard for this game and the given leaderboard ID or name
|
180
|
-
#
|
181
|
-
# @param [Fixnum, String] id The ID or name of the leaderboard to return
|
182
|
-
# @return [GameLeaderboard] The matching leaderboard if available
|
183
|
-
def leaderboard(id)
|
184
|
-
GameLeaderboard.leaderboard @game_friendly_name, id
|
185
|
-
end
|
186
|
-
|
187
|
-
# Returns an array containing all of this game's leaderboards
|
188
|
-
#
|
189
|
-
# @return [Array<GameLeaderboard>] The leaderboards for this game
|
190
|
-
def leaderboards
|
191
|
-
GameLeaderboard.leaderboards @game_friendly_name
|
165
|
+
self.class.base_url @user.id, @game.id
|
192
166
|
end
|
193
167
|
|
194
168
|
# Returns whether this Steam ID is publicly accessible
|
@@ -26,9 +26,9 @@ module GameWeapon
|
|
26
26
|
|
27
27
|
# Creates a new game weapon instance with the data provided
|
28
28
|
#
|
29
|
-
# @param [
|
29
|
+
# @param [Hash<String, Object>] weapon_data The data representing this weapon
|
30
30
|
def initialize(weapon_data)
|
31
|
-
@kills = weapon_data
|
31
|
+
@kills = weapon_data['kills'].to_i
|
32
32
|
end
|
33
33
|
|
34
34
|
# Returns the average number of shots needed for a kill with this weapon
|
@@ -15,6 +15,11 @@ module AbstractL4DStats
|
|
15
15
|
# The names of the special infected in Left4Dead
|
16
16
|
SPECIAL_INFECTED = %w(boomer hunter smoker tank)
|
17
17
|
|
18
|
+
# Returns a hash of statistics for this user's most recently played game
|
19
|
+
#
|
20
|
+
# @return [Hash<String, Object>] The most recent statistics for this user
|
21
|
+
attr_reader :most_recent_game
|
22
|
+
|
18
23
|
# Creates a new instance of statistics for both, Left4Dead and Left4Dead 2
|
19
24
|
# parsing basic common data
|
20
25
|
#
|
@@ -25,11 +30,11 @@ module AbstractL4DStats
|
|
25
30
|
|
26
31
|
if public?
|
27
32
|
@most_recent_game = {}
|
28
|
-
|
29
|
-
@most_recent_game[:difficulty] = @xml_data
|
30
|
-
@most_recent_game[:escaped] = (@xml_data
|
31
|
-
@most_recent_game[:movie] = @xml_data
|
32
|
-
@most_recent_game[:time_played] = @xml_data
|
33
|
+
unless @xml_data['stats']['mostrecentgame'].nil?
|
34
|
+
@most_recent_game[:difficulty] = @xml_data['stats']['mostrecentgame']['difficulty']
|
35
|
+
@most_recent_game[:escaped] = (@xml_data['stats']['mostrecentgame']['bEscaped'] == 1)
|
36
|
+
@most_recent_game[:movie] = @xml_data['stats']['mostrecentgame']['movie']
|
37
|
+
@most_recent_game[:time_played] = @xml_data['stats']['mostrecentgame']['time']
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
@@ -44,14 +49,14 @@ module AbstractL4DStats
|
|
44
49
|
|
45
50
|
if @favorites.nil?
|
46
51
|
@favorites = {}
|
47
|
-
@favorites[:campaign] = @xml_data
|
48
|
-
@favorites[:campaign_percentage] = @xml_data
|
49
|
-
@favorites[:character] = @xml_data
|
50
|
-
@favorites[:character_percentage] = @xml_data
|
51
|
-
@favorites[:level1_weapon] = @xml_data
|
52
|
-
@favorites[:level1_weapon_percentage] = @xml_data
|
53
|
-
@favorites[:level2_weapon] = @xml_data
|
54
|
-
@favorites[:level2_weapon_percentage] = @xml_data
|
52
|
+
@favorites[:campaign] = @xml_data['stats']['favorites']['campaign']
|
53
|
+
@favorites[:campaign_percentage] = @xml_data['stats']['favorites']['campaignpct'].to_i
|
54
|
+
@favorites[:character] = @xml_data['stats']['favorites']['character']
|
55
|
+
@favorites[:character_percentage] = @xml_data['stats']['favorites']['characterpct'].to_i
|
56
|
+
@favorites[:level1_weapon] = @xml_data['stats']['favorites']['weapon1']
|
57
|
+
@favorites[:level1_weapon_percentage] = @xml_data['stats']['favorites']['weapon1pct'].to_i
|
58
|
+
@favorites[:level2_weapon] = @xml_data['stats']['favorites']['weapon2']
|
59
|
+
@favorites[:level2_weapon_percentage] = @xml_data['stats']['favorites']['weapon2pct'].to_i
|
55
60
|
end
|
56
61
|
|
57
62
|
@favorites
|
@@ -68,15 +73,15 @@ module AbstractL4DStats
|
|
68
73
|
|
69
74
|
if @lifetime_stats.nil?
|
70
75
|
@lifetime_stats = {}
|
71
|
-
@lifetime_stats[:finales_survived] = @xml_data
|
72
|
-
@lifetime_stats[:games_played] = @xml_data
|
73
|
-
@lifetime_stats[:infected_killed] = @xml_data
|
74
|
-
@lifetime_stats[:kills_per_hour] = @xml_data
|
75
|
-
@lifetime_stats[:avg_kits_shared] = @xml_data
|
76
|
-
@lifetime_stats[:avg_kits_used] = @xml_data
|
77
|
-
@lifetime_stats[:avg_pills_shared] = @xml_data
|
78
|
-
@lifetime_stats[:avg_pills_used] = @xml_data
|
79
|
-
@lifetime_stats[:time_played] = @xml_data
|
76
|
+
@lifetime_stats[:finales_survived] = @xml_data['stats']['lifetime']['finales'].to_i
|
77
|
+
@lifetime_stats[:games_played] = @xml_data['stats']['lifetime']['gamesplayed'].to_i
|
78
|
+
@lifetime_stats[:infected_killed] = @xml_data['stats']['lifetime']['infectedkilled'].to_i
|
79
|
+
@lifetime_stats[:kills_per_hour] = @xml_data['stats']['lifetime']['killsperhour'].to_f
|
80
|
+
@lifetime_stats[:avg_kits_shared] = @xml_data['stats']['lifetime']['kitsshared'].to_f
|
81
|
+
@lifetime_stats[:avg_kits_used] = @xml_data['stats']['lifetime']['kitsused'].to_f
|
82
|
+
@lifetime_stats[:avg_pills_shared] = @xml_data['stats']['lifetime']['pillsshared'].to_f
|
83
|
+
@lifetime_stats[:avg_pills_used] = @xml_data['stats']['lifetime']['pillsused'].to_f
|
84
|
+
@lifetime_stats[:time_played] = @xml_data['stats']['lifetime']['timeplayed']
|
80
85
|
|
81
86
|
@lifetime_stats[:finales_survived_percentage] = @lifetime_stats[:finales_survived].to_f / @lifetime_stats[:games_played]
|
82
87
|
end
|
@@ -95,11 +100,11 @@ module AbstractL4DStats
|
|
95
100
|
|
96
101
|
if @survival_stats.nil?
|
97
102
|
@survival_stats = {}
|
98
|
-
@survival_stats[:gold_medals] = @xml_data
|
99
|
-
@survival_stats[:silver_medals] = @xml_data
|
100
|
-
@survival_stats[:bronze_medals] = @xml_data
|
101
|
-
@survival_stats[:rounds_played] = @xml_data
|
102
|
-
@survival_stats[:best_time] = @xml_data
|
103
|
+
@survival_stats[:gold_medals] = @xml_data['stats']['survival']['goldmedals'].to_i
|
104
|
+
@survival_stats[:silver_medals] = @xml_data['stats']['survival']['silvermedals'].to_i
|
105
|
+
@survival_stats[:bronze_medals] = @xml_data['stats']['survival']['bronzemedals'].to_i
|
106
|
+
@survival_stats[:rounds_played] = @xml_data['stats']['survival']['roundsplayed'].to_i
|
107
|
+
@survival_stats[:best_time] = @xml_data['stats']['survival']['besttime'].to_f
|
103
108
|
end
|
104
109
|
|
105
110
|
@survival_stats
|
@@ -116,17 +121,17 @@ module AbstractL4DStats
|
|
116
121
|
|
117
122
|
if @teamplay_stats.nil?
|
118
123
|
@teamplay_stats = {}
|
119
|
-
@teamplay_stats[:revived] = @xml_data
|
120
|
-
@teamplay_stats[:most_revived_difficulty] = @xml_data
|
121
|
-
@teamplay_stats[:avg_revived] = @xml_data
|
122
|
-
@teamplay_stats[:avg_was_revived] = @xml_data
|
123
|
-
@teamplay_stats[:protected] = @xml_data
|
124
|
-
@teamplay_stats[:most_protected_difficulty] = @xml_data
|
125
|
-
@teamplay_stats[:avg_protected] = @xml_data
|
126
|
-
@teamplay_stats[:avg_was_protected] = @xml_data
|
127
|
-
@teamplay_stats[:friendly_fire_damage] = @xml_data
|
128
|
-
@teamplay_stats[:most_friendly_fire_difficulty] = @xml_data
|
129
|
-
@teamplay_stats[:avg_friendly_fire_damage] = @xml_data
|
124
|
+
@teamplay_stats[:revived] = @xml_data['stats']['teamplay']['revived'].to_i
|
125
|
+
@teamplay_stats[:most_revived_difficulty] = @xml_data['stats']['teamplay']['reviveddiff']
|
126
|
+
@teamplay_stats[:avg_revived] = @xml_data['stats']['teamplay']['revivedavg'].to_f
|
127
|
+
@teamplay_stats[:avg_was_revived] = @xml_data['stats']['teamplay']['wasrevivedavg'].to_f
|
128
|
+
@teamplay_stats[:protected] = @xml_data['stats']['teamplay']['protected'].to_i
|
129
|
+
@teamplay_stats[:most_protected_difficulty] = @xml_data['stats']['teamplay']['protecteddiff']
|
130
|
+
@teamplay_stats[:avg_protected] = @xml_data['stats']['teamplay']['protectedavg'].to_f
|
131
|
+
@teamplay_stats[:avg_was_protected] = @xml_data['stats']['teamplay']['wasprotectedavg'].to_f
|
132
|
+
@teamplay_stats[:friendly_fire_damage] = @xml_data['stats']['teamplay']['ffdamage'].to_i
|
133
|
+
@teamplay_stats[:most_friendly_fire_difficulty] = @xml_data['stats']['teamplay']['ffdamagediff']
|
134
|
+
@teamplay_stats[:avg_friendly_fire_damage] = @xml_data['stats']['teamplay']['ffdamageavg'].to_f
|
130
135
|
end
|
131
136
|
|
132
137
|
@teamplay_stats
|
@@ -143,22 +148,22 @@ module AbstractL4DStats
|
|
143
148
|
|
144
149
|
if @versus_stats.nil?
|
145
150
|
@versus_stats = {}
|
146
|
-
@versus_stats[:games_played] = @xml_data
|
147
|
-
@versus_stats[:games_completed] = @xml_data
|
148
|
-
@versus_stats[:finales_survived] = @xml_data
|
149
|
-
@versus_stats[:points] = @xml_data
|
150
|
-
@versus_stats[:most_points_infected] = @xml_data
|
151
|
-
@versus_stats[:games_won] = @xml_data
|
152
|
-
@versus_stats[:games_lost] = @xml_data
|
153
|
-
@versus_stats[:highest_survivor_score] = @xml_data
|
151
|
+
@versus_stats[:games_played] = @xml_data['stats']['versus']['gamesplayed'].to_i
|
152
|
+
@versus_stats[:games_completed] = @xml_data['stats']['versus']['gamescompleted'].to_i
|
153
|
+
@versus_stats[:finales_survived] = @xml_data['stats']['versus']['finales'].to_i
|
154
|
+
@versus_stats[:points] = @xml_data['stats']['versus']['points'].to_i
|
155
|
+
@versus_stats[:most_points_infected] = @xml_data['stats']['versus']['pointsas']
|
156
|
+
@versus_stats[:games_won] = @xml_data['stats']['versus']['gameswon'].to_i
|
157
|
+
@versus_stats[:games_lost] = @xml_data['stats']['versus']['gameslost'].to_i
|
158
|
+
@versus_stats[:highest_survivor_score] = @xml_data['stats']['versus']['survivorscore'].to_i
|
154
159
|
|
155
160
|
@versus_stats[:finales_survived_percentage] = @versus_stats[:finales_survived].to_f / @versus_stats[:games_played]
|
156
161
|
|
157
162
|
self.class.const_get(:SPECIAL_INFECTED).each do |infected|
|
158
163
|
@versus_stats[infected] = {}
|
159
|
-
@versus_stats[infected][:special_attacks] = @xml_data
|
160
|
-
@versus_stats[infected][:most_damage] = @xml_data
|
161
|
-
@versus_stats[infected]['avg_lifespan'] = @xml_data
|
164
|
+
@versus_stats[infected][:special_attacks] = @xml_data['stats']['versus']["#{infected}special"].to_i
|
165
|
+
@versus_stats[infected][:most_damage] = @xml_data['stats']['versus']["#{infected}dmg"].to_i
|
166
|
+
@versus_stats[infected]['avg_lifespan'] = @xml_data['stats']['versus']["#{infected}lifespan"].to_i
|
162
167
|
end
|
163
168
|
end
|
164
169
|
|
@@ -42,14 +42,15 @@ module AbstractL4DWeapon
|
|
42
42
|
# Creates a new instance of weapon from the given XML data and parses common
|
43
43
|
# data for both, `L4DWeapon` and `L4D2Weapon`
|
44
44
|
#
|
45
|
-
# @param [
|
46
|
-
|
45
|
+
# @param [String] weapon_name The name of this weapon
|
46
|
+
# @param [Hash<String, Object>] weapon_data The XML data for this weapon
|
47
|
+
def initialize(weapon_name, weapon_data)
|
47
48
|
super weapon_data
|
48
49
|
|
49
|
-
@accuracy = weapon_data
|
50
|
-
@headshots_percentage = weapon_data
|
51
|
-
@id =
|
52
|
-
@shots = weapon_data
|
50
|
+
@accuracy = weapon_data['accuracy'].to_f * 0.01
|
51
|
+
@headshots_percentage = weapon_data['headshots'].to_f * 0.01
|
52
|
+
@id = weapon_name
|
53
|
+
@shots = weapon_data['shots'].to_i
|
53
54
|
end
|
54
55
|
|
55
56
|
end
|
@@ -43,31 +43,31 @@ class L4D2Map < L4DMap
|
|
43
43
|
# information than those for Left4Dead, e.g. the teammates and items are
|
44
44
|
# listed.
|
45
45
|
#
|
46
|
-
# @param [
|
46
|
+
# @param [Hash<String, Object>] map_data The XML data for this map
|
47
47
|
def initialize(map_data)
|
48
|
-
@id = map_data
|
49
|
-
@name = map_data
|
50
|
-
@played = (map_data
|
48
|
+
@id = map_data['img'].match(/http:\/\/cdn\.steamcommunity\.com\/public\/images\/gamestats\/550\/(.*).jpg/)[1]
|
49
|
+
@name = map_data['name']
|
50
|
+
@played = (map_data['hasPlayed'].to_i == 1)
|
51
51
|
|
52
52
|
if @played
|
53
|
-
@best_time = map_data
|
53
|
+
@best_time = map_data['besttimemilliseconds'].to_f / 1000
|
54
54
|
|
55
55
|
@teammates = []
|
56
|
-
map_data
|
57
|
-
@teammates << SteamId.new(teammate
|
56
|
+
map_data['teammates']['steamID64'].each do |teammate|
|
57
|
+
@teammates << SteamId.new(teammate, false)
|
58
58
|
end
|
59
59
|
|
60
60
|
@items = {}
|
61
61
|
ITEMS.each do |item|
|
62
|
-
@items[item] = map_data
|
62
|
+
@items[item] = map_data["items_#{item}"].to_i
|
63
63
|
end
|
64
64
|
|
65
65
|
@kills = {}
|
66
66
|
INFECTED.each do |infected|
|
67
|
-
@kills[infected] = map_data
|
67
|
+
@kills[infected] = map_data["kills_#{infected}"].to_i
|
68
68
|
end
|
69
69
|
|
70
|
-
case map_data
|
70
|
+
case map_data['medal']
|
71
71
|
when 'gold'
|
72
72
|
@medal = L4D2Map::GOLD
|
73
73
|
when 'silver'
|
@@ -33,10 +33,10 @@ class L4D2Stats < GameStats
|
|
33
33
|
super steam_id, 'l4d2'
|
34
34
|
|
35
35
|
@damage_percentages = {
|
36
|
-
:melee => @xml_data
|
37
|
-
:pistols => @xml_data
|
38
|
-
:rifles => @xml_data
|
39
|
-
:shotguns => @xml_data
|
36
|
+
:melee => @xml_data['stats']['weapons']['meleepctdmg'].to_f,
|
37
|
+
:pistols => @xml_data['stats']['weapons']['pistolspctdmg'].to_f,
|
38
|
+
:rifles => @xml_data['stats']['weapons']['bulletspctdmg'].to_f,
|
39
|
+
:shotguns => @xml_data['stats']['weapons']['shellspctdmg'].to_f
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
@@ -56,9 +56,9 @@ class L4D2Stats < GameStats
|
|
56
56
|
|
57
57
|
if @lifetime_stats.nil?
|
58
58
|
super
|
59
|
-
@lifetime_stats[:avg_adrenaline_shared] = @xml_data
|
60
|
-
@lifetime_stats[:avg_adrenaline_used] = @xml_data
|
61
|
-
@lifetime_stats[:avg_defibrillators_used] = @xml_data
|
59
|
+
@lifetime_stats[:avg_adrenaline_shared] = @xml_data['stats']['lifetime']['adrenalineshared'].to_f
|
60
|
+
@lifetime_stats[:avg_adrenaline_used] = @xml_data['stats']['lifetime']['adrenalineused'].to_f
|
61
|
+
@lifetime_stats[:avg_defibrillators_used] = @xml_data['stats']['lifetime']['defibrillatorsused'].to_f
|
62
62
|
end
|
63
63
|
|
64
64
|
@lifetime_stats
|
@@ -76,32 +76,32 @@ class L4D2Stats < GameStats
|
|
76
76
|
|
77
77
|
if @scavenge_stats.nil?
|
78
78
|
@scavenge_stats = {}
|
79
|
-
@scavenge_stats[:avg_cans_per_round] = @xml_data
|
80
|
-
@scavenge_stats[:perfect_rounds] = @xml_data
|
81
|
-
@scavenge_stats[:rounds_lost] = @xml_data
|
82
|
-
@scavenge_stats[:rounds_played] = @xml_data
|
83
|
-
@scavenge_stats[:rounds_won] = @xml_data
|
84
|
-
@scavenge_stats[:total_cans] = @xml_data
|
79
|
+
@scavenge_stats[:avg_cans_per_round] = @xml_data['stats']['scavenge']['avgcansperround'].to_f
|
80
|
+
@scavenge_stats[:perfect_rounds] = @xml_data['stats']['scavenge']['perfect16canrounds'].to_i
|
81
|
+
@scavenge_stats[:rounds_lost] = @xml_data['stats']['scavenge']['roundslost'].to_i
|
82
|
+
@scavenge_stats[:rounds_played] = @xml_data['stats']['scavenge']['roundsplayed'].to_i
|
83
|
+
@scavenge_stats[:rounds_won] = @xml_data['stats']['scavenge']['roundswon'].to_i
|
84
|
+
@scavenge_stats[:total_cans] = @xml_data['stats']['scavenge']['totalcans'].to_i
|
85
85
|
|
86
86
|
@scavenge_stats[:maps] = {}
|
87
|
-
@xml_data
|
88
|
-
map_id = map_data
|
87
|
+
@xml_data['stats']['scavenge']['mapstats']['map'].each do |map_data|
|
88
|
+
map_id = map_data['name']
|
89
89
|
@scavenge_stats[:maps][map_id] = {}
|
90
|
-
@scavenge_stats[:maps][map_id]['avg_round_score'] = map_data
|
91
|
-
@scavenge_stats[:maps][map_id]['highest_game_score'] = map_data
|
92
|
-
@scavenge_stats[:maps][map_id]['highest_round_score'] = map_data
|
93
|
-
@scavenge_stats[:maps][map_id]['name'] = map_data
|
94
|
-
@scavenge_stats[:maps][map_id]['rounds_played'] = map_data
|
95
|
-
@scavenge_stats[:maps][map_id]['rounds_won'] = map_data
|
90
|
+
@scavenge_stats[:maps][map_id]['avg_round_score'] = map_data['avgscoreperround'].to_i
|
91
|
+
@scavenge_stats[:maps][map_id]['highest_game_score'] = map_data['highgamescore'].to_i
|
92
|
+
@scavenge_stats[:maps][map_id]['highest_round_score'] = map_data['highroundscore'].to_i
|
93
|
+
@scavenge_stats[:maps][map_id]['name'] = map_data['fullname']
|
94
|
+
@scavenge_stats[:maps][map_id]['rounds_played'] = map_data['roundsplayed'].to_i
|
95
|
+
@scavenge_stats[:maps][map_id]['rounds_won'] = map_data['roundswon'].to_i
|
96
96
|
end
|
97
97
|
|
98
98
|
@scavenge_stats[:infected] = {}
|
99
|
-
@xml_data
|
100
|
-
infected_id = infected_data
|
99
|
+
@xml_data['stats']['scavenge']['infectedstats']['special'].each do |infected_data|
|
100
|
+
infected_id = infected_data['name']
|
101
101
|
@scavenge_stats[:infected][infected_id] = {}
|
102
|
-
@scavenge_stats[:infected][infected_id]['max_damage_per_life'] = infected_data
|
103
|
-
@scavenge_stats[:infected][infected_id]['max_pours_interrupted'] = infected_data
|
104
|
-
@scavenge_stats[:infected][infected_id]['special_attacks'] = infected_data
|
102
|
+
@scavenge_stats[:infected][infected_id]['max_damage_per_life'] = infected_data['maxdmg1life'].to_i
|
103
|
+
@scavenge_stats[:infected][infected_id]['max_pours_interrupted'] = infected_data['maxpoursinterrupted'].to_i
|
104
|
+
@scavenge_stats[:infected][infected_id]['special_attacks'] = infected_data['specialattacks'].to_i
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -126,7 +126,7 @@ class L4D2Stats < GameStats
|
|
126
126
|
if @survival_stats.nil?
|
127
127
|
super
|
128
128
|
@survival_stats[:maps] = {}
|
129
|
-
@xml_data
|
129
|
+
@xml_data['stats']['survival']['maps']['map'].each do |map_data|
|
130
130
|
map = L4D2Map.new(map_data)
|
131
131
|
@survival_stats[:maps][map.id] = map
|
132
132
|
end
|
@@ -146,16 +146,16 @@ class L4D2Stats < GameStats
|
|
146
146
|
|
147
147
|
if @weapon_stats.nil?
|
148
148
|
@weapon_stats = {}
|
149
|
-
@xml_data
|
150
|
-
next
|
149
|
+
@xml_data['stats']['weapons'].each do |weapon_data|
|
150
|
+
next if weapon_data.nil?
|
151
151
|
|
152
|
-
unless %w{bilejars molotov pipes}.include? weapon_data
|
153
|
-
weapon = L4D2Weapon.new
|
152
|
+
unless %w{bilejars molotov pipes}.include? weapon_data[0]
|
153
|
+
weapon = L4D2Weapon.new *weapon_data
|
154
154
|
else
|
155
|
-
weapon = L4DExplosive.new
|
155
|
+
weapon = L4DExplosive.new *weapon_data
|
156
156
|
end
|
157
157
|
|
158
|
-
@weapon_stats[weapon_data
|
158
|
+
@weapon_stats[weapon_data[0]] = weapon
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|