steam-condenser 0.10.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION.yml +2 -2
- data/lib/datagram_channel.rb +30 -33
- data/lib/exceptions/packet_format_exception.rb +7 -3
- data/lib/exceptions/rcon_ban_exception.rb +7 -5
- data/lib/exceptions/rcon_no_auth_exception.rb +8 -6
- data/lib/exceptions/timeout_exception.rb +10 -4
- data/lib/socket_channel.rb +11 -17
- data/lib/steam/community/cacheable.rb +5 -7
- data/lib/steam/community/css/css_map.rb +31 -0
- data/lib/steam/community/css/css_stats.rb +116 -0
- data/lib/steam/community/css/css_weapon.rb +33 -0
- data/lib/steam/community/dods/dods_stats.rb +3 -3
- data/lib/steam/community/game_stats.rb +14 -13
- data/lib/steam/community/game_weapon.rb +3 -5
- data/lib/steam/community/l4d/abstract_l4d_stats.rb +4 -2
- data/lib/steam/community/l4d/l4d_explosive.rb +2 -2
- data/lib/steam/community/l4d/l4d_map.rb +3 -3
- data/lib/steam/community/steam_group.rb +2 -4
- data/lib/steam/community/steam_id.rb +2 -2
- data/lib/steam/community/tf2/tf2_class.rb +17 -17
- data/lib/steam/community/tf2/tf2_class_factory.rb +17 -17
- data/lib/steam/community/tf2/tf2_engineer.rb +9 -9
- data/lib/steam/community/tf2/tf2_medic.rb +9 -9
- data/lib/steam/community/tf2/tf2_sniper.rb +7 -7
- data/lib/steam/community/tf2/tf2_spy.rb +9 -9
- data/lib/steam/community/tf2/tf2_stats.rb +9 -9
- data/lib/steam/packets/a2a_ack_packet.rb +11 -9
- data/lib/steam/packets/a2a_ping_packet.rb +5 -4
- data/lib/steam/packets/a2m_get_servers_batch2_packet.rb +13 -12
- data/lib/steam/packets/a2s_info_packet.rb +8 -7
- data/lib/steam/packets/a2s_player_packet.rb +6 -6
- data/lib/steam/packets/a2s_rules_packet.rb +5 -5
- data/lib/steam/packets/a2s_serverquery_getchallenge_packet.rb +4 -3
- data/lib/steam/packets/m2a_server_batch_packet.rb +20 -22
- data/lib/steam/packets/rcon/rcon_auth_request.rb +5 -5
- data/lib/steam/packets/rcon/rcon_auth_response.rb +6 -6
- data/lib/steam/packets/rcon/rcon_exec_request.rb +5 -5
- data/lib/steam/packets/rcon/rcon_exec_response.rb +2 -2
- data/lib/steam/packets/rcon/rcon_goldsrc_request.rb +7 -7
- data/lib/steam/packets/rcon/rcon_goldsrc_response.rb +8 -8
- data/lib/steam/packets/rcon/rcon_packet.rb +12 -16
- data/lib/steam/packets/rcon/rcon_packet_factory.rb +19 -19
- data/lib/steam/packets/request_with_challenge.rb +5 -5
- data/lib/steam/packets/s2a_info2_packet.rb +28 -30
- data/lib/steam/packets/s2a_info_base_packet.rb +11 -16
- data/lib/steam/packets/s2a_info_detailed_packet.rb +30 -28
- data/lib/steam/packets/s2a_player_packet.rb +7 -9
- data/lib/steam/packets/s2a_rules_packet.rb +8 -12
- data/lib/steam/packets/s2c_challenge_packet.rb +7 -6
- data/lib/steam/packets/steam_packet.rb +7 -6
- data/lib/steam/packets/steam_packet_factory.rb +37 -38
- data/lib/steam/servers/game_server.rb +76 -86
- data/lib/steam/servers/goldsrc_server.rb +5 -5
- data/lib/steam/servers/master_server.rb +24 -24
- data/lib/steam/servers/source_server.rb +17 -19
- data/lib/steam/sockets/goldsrc_socket.rb +43 -46
- data/lib/steam/sockets/master_server_socket.rb +11 -13
- data/lib/steam/sockets/rcon_socket.rb +15 -17
- data/lib/steam/sockets/source_socket.rb +21 -21
- data/lib/steam/sockets/steam_socket.rb +25 -28
- data/lib/steam/steam_player.rb +3 -1
- data/lib/stringio_additions.rb +48 -0
- data/test/datagram_channel_tests.rb +8 -8
- data/test/query_tests.rb +15 -14
- data/test/rcon_tests.rb +32 -31
- data/test/socket_channel_tests.rb +7 -7
- data/test/steam/communtiy/steam_community_test_suite.rb +5 -2
- data/test/steam_community_tests.rb +4 -3
- data/test/stringio_additions_tests.rb +77 -0
- metadata +15 -8
- data/lib/byte_buffer.rb +0 -126
- data/lib/exceptions/buffer_underflow_exception.rb +0 -8
- data/test/byte_buffer_tests.rb +0 -76
@@ -1,7 +1,7 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2009, Sebastian Staudt
|
4
|
+
# Copyright (c) 2009-2010, Sebastian Staudt
|
5
5
|
|
6
6
|
require 'steam/community/dods/dods_weapon'
|
7
7
|
require 'steam/community/game_stats'
|
@@ -22,7 +22,7 @@ class DoDSStats < GameStats
|
|
22
22
|
if @class_stats.nil?
|
23
23
|
@class_stats = {}
|
24
24
|
@xml_data.elements.each('stats/classes/class') do |class_data|
|
25
|
-
@class_stats[class_data.attributes[
|
25
|
+
@class_stats[class_data.attributes['key']] = DoDSClass.new class_data
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -43,5 +43,5 @@ class DoDSStats < GameStats
|
|
43
43
|
|
44
44
|
@weapon_stats
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
end
|
@@ -1,21 +1,12 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
6
|
+
require 'open-uri'
|
7
|
+
require 'rexml/document'
|
8
8
|
|
9
|
-
require
|
10
|
-
|
11
|
-
class GameStats
|
12
|
-
end
|
13
|
-
|
14
|
-
require 'steam/community/defense_grid/defense_grid_stats'
|
15
|
-
require "steam/community/dods/dods_stats"
|
16
|
-
require "steam/community/l4d/l4d_stats"
|
17
|
-
require "steam/community/l4d/l4d2_stats"
|
18
|
-
require "steam/community/tf2/tf2_stats"
|
9
|
+
require 'steam/community/game_achievement'
|
19
10
|
|
20
11
|
# The GameStats class represents the game statistics for a single user and a
|
21
12
|
# specific game
|
@@ -30,15 +21,23 @@ class GameStats
|
|
30
21
|
# depending on the game selected
|
31
22
|
def self.create_game_stats(steam_id, game_name)
|
32
23
|
case game_name
|
24
|
+
when 'cs:s'
|
25
|
+
require 'steam/community/css/css_stats'
|
26
|
+
CSSStats.new(steam_id)
|
33
27
|
when 'defensegrid:awakening'
|
28
|
+
require 'steam/community/defense_grid/defense_grid_stats'
|
34
29
|
DefenseGridStats.new(steam_id)
|
35
30
|
when 'dod:s'
|
31
|
+
require 'steam/community/dods/dods_stats'
|
36
32
|
DoDSStats.new(steam_id)
|
37
33
|
when 'l4d'
|
34
|
+
require 'steam/community/l4d/l4d_stats'
|
38
35
|
L4DStats.new(steam_id)
|
39
36
|
when 'l4d2'
|
37
|
+
require 'steam/community/l4d/l4d2_stats'
|
40
38
|
L4D2Stats.new(steam_id)
|
41
39
|
when 'tf2'
|
40
|
+
require 'steam/community/tf2/tf2_stats'
|
42
41
|
TF2Stats.new(steam_id)
|
43
42
|
else
|
44
43
|
new(steam_id, game_name)
|
@@ -61,8 +60,10 @@ class GameStats
|
|
61
60
|
@privacy_state = @xml_data.elements['privacyState'].text
|
62
61
|
if public?
|
63
62
|
@app_id = @xml_data.elements['game/gameLink'].text.match(/http:\/\/store.steampowered.com\/app\/([1-9][0-9]+)/)[1]
|
63
|
+
@custom_url = @xml_data.elements['player/customURL'].text if @custom_url.nil?
|
64
64
|
@game_name = @xml_data.elements['game/gameName'].text
|
65
65
|
@hours_played = @xml_data.elements['stats/hoursPlayed'].text
|
66
|
+
@steam_id64 = @xml_data.elements['player/steamID64'].text.to_i if @steam_id64.nil?
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2009, Sebastian Staudt
|
4
|
+
# Copyright (c) 2009-2010, Sebastian Staudt
|
5
5
|
|
6
6
|
require 'abstract_class'
|
7
7
|
|
8
8
|
# Super class for classes representing game weapons
|
9
9
|
class GameWeapon
|
10
|
-
|
10
|
+
|
11
11
|
include AbstractClass
|
12
12
|
|
13
13
|
attr_reader :kills, :id, :shots
|
@@ -19,9 +19,7 @@ class GameWeapon
|
|
19
19
|
# Returns the average number of shots needed for a kill with this weapon.
|
20
20
|
# Calculates the value if needed.
|
21
21
|
def avg_shots_per_kill
|
22
|
-
if @avg_shots_per_kill.nil?
|
23
|
-
@avg_shots_per_kill = @shots.to_f / @kills
|
24
|
-
end
|
22
|
+
@avg_shots_per_kill = @shots.to_f / @kills if @avg_shots_per_kill.nil?
|
25
23
|
|
26
24
|
@avg_shots_per_kill
|
27
25
|
end
|
@@ -58,7 +58,6 @@ class AbstractL4DStats < GameStats
|
|
58
58
|
@lifetime_stats = {}
|
59
59
|
@lifetime_stats['finales_survived'] = @xml_data.elements['stats/lifetime/finales'].text.to_i
|
60
60
|
@lifetime_stats['games_played'] = @xml_data.elements['stats/lifetime/gamesplayed'].text.to_i
|
61
|
-
@lifetime_stats['finales_survived_percentage'] = @lifetime_stats['finales_survived'].to_f / @lifetime_stats['games_played']
|
62
61
|
@lifetime_stats['infected_killed'] = @xml_data.elements['stats/lifetime/infectedkilled'].text.to_i
|
63
62
|
@lifetime_stats['kills_per_hour'] = @xml_data.elements['stats/lifetime/killsperhour'].text.to_f
|
64
63
|
@lifetime_stats['avg_kits_shared'] = @xml_data.elements['stats/lifetime/kitsshared'].text.to_f
|
@@ -66,6 +65,8 @@ class AbstractL4DStats < GameStats
|
|
66
65
|
@lifetime_stats['avg_pills_shared'] = @xml_data.elements['stats/lifetime/pillsshared'].text.to_f
|
67
66
|
@lifetime_stats['avg_pills_used'] = @xml_data.elements['stats/lifetime/pillsused'].text.to_f
|
68
67
|
@lifetime_stats['time_played'] = @xml_data.elements['stats/lifetime/timeplayed'].text
|
68
|
+
|
69
|
+
@lifetime_stats['finales_survived_percentage'] = @lifetime_stats['finales_survived'].to_f / @lifetime_stats['games_played']
|
69
70
|
end
|
70
71
|
|
71
72
|
@lifetime_stats
|
@@ -122,13 +123,14 @@ class AbstractL4DStats < GameStats
|
|
122
123
|
@versus_stats['games_played'] = @xml_data.elements['stats/versus/gamesplayed'].text.to_i
|
123
124
|
@versus_stats['games_completed'] = @xml_data.elements['stats/versus/gamescompleted'].text.to_i
|
124
125
|
@versus_stats['finales_survived'] = @xml_data.elements['stats/versus/finales'].text.to_i
|
125
|
-
@versus_stats['finales_survived_percentage'] = @versus_stats['finales_survived'].to_f / @versus_stats['games_played']
|
126
126
|
@versus_stats['points'] = @xml_data.elements['stats/versus/points'].text.to_i
|
127
127
|
@versus_stats['most_points_infected'] = @xml_data.elements['stats/versus/pointsas'].text
|
128
128
|
@versus_stats['games_won'] = @xml_data.elements['stats/versus/gameswon'].text.to_i
|
129
129
|
@versus_stats['games_lost'] = @xml_data.elements['stats/versus/gameslost'].text.to_i
|
130
130
|
@versus_stats['highest_survivor_score'] = @xml_data.elements['stats/versus/survivorscore'].text.to_i
|
131
131
|
|
132
|
+
@versus_stats['finales_survived_percentage'] = @versus_stats['finales_survived'].to_f / @versus_stats['games_played']
|
133
|
+
|
132
134
|
self.class.const_get(:SPECIAL_INFECTED).each do |infected|
|
133
135
|
@versus_stats[infected] = {}
|
134
136
|
@versus_stats[infected]['special_attacks'] = @xml_data.elements["stats/versus/#{infected}special"].text.to_i
|
@@ -11,8 +11,8 @@ class L4DExplosive < GameWeapon
|
|
11
11
|
def initialize(weapon_data)
|
12
12
|
super weapon_data
|
13
13
|
|
14
|
-
@id
|
15
|
-
@shots
|
14
|
+
@id = weapon_data.name
|
15
|
+
@shots = weapon_data.elements['thrown'].text.to_i
|
16
16
|
end
|
17
17
|
|
18
18
|
# Returns the average number of kills for one shot of this explosive.
|
@@ -16,9 +16,9 @@ class L4DMap
|
|
16
16
|
|
17
17
|
# Creates a new instance of L4DMap based on the assigned XML data
|
18
18
|
def initialize(map_data)
|
19
|
-
@best_time
|
20
|
-
@id
|
21
|
-
@name
|
19
|
+
@best_time = map_data.elements['besttimeseconds'].text.to_f
|
20
|
+
@id = map_data.name
|
21
|
+
@name = map_data.elements['name'].text
|
22
22
|
@times_played = map_data.elements['timesplayed'].text.to_i
|
23
23
|
|
24
24
|
case map_data.elements['medal'].text
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
6
|
require 'open-uri'
|
7
7
|
require 'rexml/document'
|
@@ -51,9 +51,7 @@ class SteamGroup
|
|
51
51
|
url = open("#{base_url}/memberslistxml?p=#{page}", {:proxy => true})
|
52
52
|
member_data = REXML::Document.new(url.read).root
|
53
53
|
|
54
|
-
if page == 1
|
55
|
-
@group_id64 = member_data.elements['groupID64'].text.to_i
|
56
|
-
end
|
54
|
+
@group_id64 = member_data.elements['groupID64'].text.to_i if page == 1
|
57
55
|
total_pages = member_data.elements['totalPages'].text.to_i
|
58
56
|
|
59
57
|
member_data.elements['members'].elements.each do |member|
|
@@ -54,8 +54,8 @@ class SteamId
|
|
54
54
|
|
55
55
|
# Creates a new SteamId object using the SteamID64 converted from a server
|
56
56
|
# SteamID given by +steam_id+
|
57
|
-
def self.
|
58
|
-
|
57
|
+
def self.from_steam_id(steam_id)
|
58
|
+
new(convert_steam_id_to_community_id(steam_id))
|
59
59
|
end
|
60
60
|
|
61
61
|
# Creates a new SteamId object for the given SteamID +id+, either numeric or
|
@@ -1,31 +1,31 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
6
|
require 'steam/community/game_class'
|
7
7
|
|
8
8
|
# Represents the stats for a Team Fortress 2 class for a specific user
|
9
9
|
class TF2Class < GameClass
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :max_buildings_destroyed, :max_captures, :max_damage,
|
12
12
|
:max_defenses, :max_dominations, :max_kill_assists, :max_kills,
|
13
13
|
:max_revenges, :max_score, :max_time_alive
|
14
|
-
|
14
|
+
|
15
15
|
# Creates a new instance of TF2Class based on the assigned XML data
|
16
16
|
def initialize(class_data)
|
17
|
-
@name = class_data.elements[
|
18
|
-
@max_buildings_destroyed = class_data.elements[
|
19
|
-
@max_captures = class_data.elements[
|
20
|
-
@max_damage = class_data.elements[
|
21
|
-
@max_defenses = class_data.elements[
|
22
|
-
@max_dominations = class_data.elements[
|
23
|
-
@max_kill_assists = class_data.elements[
|
24
|
-
@max_kills = class_data.elements[
|
25
|
-
@max_revenges = class_data.elements[
|
26
|
-
@max_score = class_data.elements[
|
27
|
-
@max_time_alive = class_data.elements[
|
28
|
-
@play_time = class_data.elements[
|
17
|
+
@name = class_data.elements['className'].text
|
18
|
+
@max_buildings_destroyed = class_data.elements['ibuildingsdestroyed'].text.to_i
|
19
|
+
@max_captures = class_data.elements['ipointcaptures'].text.to_i
|
20
|
+
@max_damage = class_data.elements['idamagedealt'].text.to_i
|
21
|
+
@max_defenses = class_data.elements['ipointdefenses'].text.to_i
|
22
|
+
@max_dominations = class_data.elements['idominations'].text.to_i
|
23
|
+
@max_kill_assists = class_data.elements['ikillassists'].text.to_i
|
24
|
+
@max_kills = class_data.elements['inumberofkills'].text.to_i
|
25
|
+
@max_revenges = class_data.elements['irevenge'].text.to_i
|
26
|
+
@max_score = class_data.elements['ipointsscored'].text.to_i
|
27
|
+
@max_time_alive = class_data.elements['iplaytime'].text.to_i
|
28
|
+
@play_time = class_data.elements['playtimeSeconds'].text.to_i
|
29
29
|
end
|
30
|
-
|
31
|
-
end
|
30
|
+
|
31
|
+
end
|
@@ -1,36 +1,36 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
6
|
+
require 'abstract_class'
|
7
|
+
require 'steam/community/tf2/tf2_class'
|
8
|
+
require 'steam/community/tf2/tf2_engineer'
|
9
|
+
require 'steam/community/tf2/tf2_medic'
|
10
|
+
require 'steam/community/tf2/tf2_sniper'
|
11
|
+
require 'steam/community/tf2/tf2_spy'
|
12
12
|
|
13
13
|
# The TF2ClassFactory is used to created instances of TF2Class based on the XML
|
14
14
|
# input data
|
15
15
|
class TF2ClassFactory
|
16
|
-
|
16
|
+
|
17
17
|
include AbstractClass
|
18
|
-
|
18
|
+
|
19
19
|
# Creates a new instance of TF2Class storing the statistics for a Team
|
20
20
|
# Fortress 2 class with the assigned XML data
|
21
|
-
def self.
|
22
|
-
case class_data.elements
|
23
|
-
when
|
21
|
+
def self.tf2_class(class_data)
|
22
|
+
case class_data.elements['className'].text
|
23
|
+
when 'Engineer' then
|
24
24
|
return TF2Engineer.new(class_data)
|
25
|
-
when
|
25
|
+
when 'Medic' then
|
26
26
|
return TF2Medic.new(class_data)
|
27
|
-
when
|
27
|
+
when 'Sniper' then
|
28
28
|
return TF2Sniper.new(class_data)
|
29
|
-
when
|
29
|
+
when 'Spy' then
|
30
30
|
return TF2Spy.new(class_data)
|
31
31
|
else
|
32
32
|
return TF2Class.new(class_data)
|
33
33
|
end
|
34
34
|
end
|
35
|
-
|
36
|
-
end
|
35
|
+
|
36
|
+
end
|
@@ -1,23 +1,23 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'steam/community/tf2/tf2_class'
|
7
7
|
|
8
8
|
# Represents the stats for the Team Fortress 2 engineer class for a specific
|
9
9
|
# user
|
10
10
|
class TF2Engineer < TF2Class
|
11
11
|
|
12
12
|
attr_reader :max_buildings_built, :max_teleports, :max_sentry_kills
|
13
|
-
|
13
|
+
|
14
14
|
# Creates a new instance of TF2Engineer based on the assigned XML data
|
15
15
|
def initialize(class_data)
|
16
16
|
super class_data
|
17
|
-
|
18
|
-
@max_buildings_built = class_data.elements[
|
19
|
-
@max_teleports = class_data.elements[
|
20
|
-
@max_sentry_kills = class_data.elements[
|
17
|
+
|
18
|
+
@max_buildings_built = class_data.elements['ibuildingsbuilt'].text.to_i
|
19
|
+
@max_teleports = class_data.elements['inumteleports'].text.to_i
|
20
|
+
@max_sentry_kills = class_data.elements['isentrykills'].text.to_i
|
21
21
|
end
|
22
|
-
|
23
|
-
end
|
22
|
+
|
23
|
+
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'steam/community/tf2/tf2_class'
|
7
7
|
|
8
8
|
# Represents the stats for the Team Fortress 2 medic class for a specific user
|
9
9
|
class TF2Medic < TF2Class
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :max_health_healed, :max_ubercharges
|
12
|
-
|
12
|
+
|
13
13
|
def initialize(class_data)
|
14
14
|
super class_data
|
15
|
-
|
16
|
-
@max_health_healed = class_data.elements[
|
17
|
-
@max_ubercharges = class_data.elements[
|
15
|
+
|
16
|
+
@max_health_healed = class_data.elements['ihealthpointshealed'].text.to_i
|
17
|
+
@max_ubercharges = class_data.elements['inuminvulnerable'].text.to_i
|
18
18
|
end
|
19
|
-
|
20
|
-
end
|
19
|
+
|
20
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'steam/community/tf2/tf2_class'
|
7
7
|
|
8
8
|
# Represents the stats for the Team Fortress 2 sniper class for a specific user
|
9
9
|
class TF2Sniper < TF2Class
|
10
|
-
|
10
|
+
|
11
11
|
# Creates a new instance of TF2Sniper based on the assigned XML data
|
12
12
|
def initialize(class_data)
|
13
13
|
super class_data
|
14
|
-
|
15
|
-
@max_headshots = class_data.elements[
|
14
|
+
|
15
|
+
@max_headshots = class_data.elements['iheadshots'].text.to_i
|
16
16
|
end
|
17
|
-
|
18
|
-
end
|
17
|
+
|
18
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'steam/community/tf2/tf2_class'
|
7
7
|
|
8
8
|
# Represents the stats for the Team Fortress 2 spy class for a specific user
|
9
9
|
class TF2Spy < TF2Class
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :max_backstabs, :max_health_leeched
|
12
|
-
|
12
|
+
|
13
13
|
# Creates a new instance of TF2Spy based on the assigned XML data
|
14
14
|
def initialize(class_data)
|
15
15
|
super class_data
|
16
|
-
|
17
|
-
@max_backstabs = class_data.elements[
|
18
|
-
@max_health_leeched = class_data.elements[
|
16
|
+
|
17
|
+
@max_backstabs = class_data.elements['ibackstabs'].text.to_i
|
18
|
+
@max_health_leeched = class_data.elements['ihealthpointsleached'].text.to_i
|
19
19
|
end
|
20
|
-
|
21
|
-
end
|
20
|
+
|
21
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# This code is free software; you can redistribute it and/or modify it under the
|
2
2
|
# terms of the new BSD License.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2008-
|
4
|
+
# Copyright (c) 2008-2010, Sebastian Staudt
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'steam/community/tf2/tf2_class_factory'
|
7
7
|
|
8
8
|
# The TF2Stats class represents the game statistics for a single user in Team
|
9
9
|
# Fortress 2
|
10
10
|
class TF2Stats < GameStats
|
11
11
|
|
12
12
|
attr_reader :accumulated_points
|
13
|
-
|
13
|
+
|
14
14
|
# Creates a TF2Stats object by calling the super constructor with the game
|
15
15
|
# name "tf2"
|
16
16
|
def initialize(steam_id)
|
@@ -20,7 +20,7 @@ class TF2Stats < GameStats
|
|
20
20
|
@accumulated_points = @xml_data.elements['stats/accumulatedPoints'].text.to_i
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
# Returns a Hash of TF2Class for this user containing all Team Fortress 2
|
25
25
|
# classes. If the classes haven't been parsed already, parsing is done now.
|
26
26
|
def class_stats
|
@@ -29,11 +29,11 @@ class TF2Stats < GameStats
|
|
29
29
|
if @class_stats.nil?
|
30
30
|
@class_stats = Hash.new
|
31
31
|
@xml_data.elements.each('stats/classData') do |class_data|
|
32
|
-
@class_stats[class_data.elements['className'].text] =
|
32
|
+
@class_stats[class_data.elements['className'].text] = TF2ClassFactory.tf2_class(class_data)
|
33
33
|
end
|
34
34
|
end
|
35
|
-
|
36
|
-
|
35
|
+
|
36
|
+
@class_stats
|
37
37
|
end
|
38
|
-
|
39
|
-
end
|
38
|
+
|
39
|
+
end
|