steam-condenser 0.11.1 → 0.11.2
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/README.md +7 -4
- data/Rakefile +4 -2
- data/VERSION.yml +1 -1
- data/lib/steam-condenser.rb +4 -8
- data/lib/steam-condenser/community.rb +16 -0
- data/lib/steam-condenser/servers.rb +18 -0
- data/lib/steam-condenser/version.rb +13 -0
- data/lib/steam/community/game_achievement.rb +19 -15
- data/lib/steam/community/game_stats.rb +9 -9
- data/lib/steam/packets/rcon/rcon_exec_response.rb +1 -1
- data/lib/steam/packets/rcon/rcon_goldsrc_request.rb +1 -1
- data/lib/steam/packets/rcon/rcon_goldsrc_response.rb +1 -1
- data/lib/steam/packets/rcon/rcon_packet.rb +1 -1
- data/lib/steam/packets/rcon/rcon_packet_factory.rb +1 -1
- data/lib/steam/packets/request_with_challenge.rb +1 -1
- data/lib/steam/packets/s2a_info2_packet.rb +7 -7
- data/lib/steam/packets/s2a_info_detailed_packet.rb +7 -7
- data/lib/steam/packets/s2a_player_packet.rb +1 -1
- data/lib/steam/packets/s2a_rules_packet.rb +2 -2
- data/lib/steam/packets/steam_packet.rb +1 -1
- data/lib/steam/servers/master_server.rb +1 -1
- data/lib/stringio_additions.rb +1 -3
- data/test/datagram_channel_tests.rb +1 -1
- data/test/socket_channel_tests.rb +1 -1
- data/test/stringio_additions_tests.rb +5 -5
- metadata +23 -6
data/README.md
CHANGED
@@ -9,13 +9,15 @@ Currently it is implemented in Java, PHP and Ruby.
|
|
9
9
|
|
10
10
|
* Linux, MacOS X or Windows
|
11
11
|
* Ruby 1.8.6 or newer
|
12
|
-
|
12
|
+
|
13
|
+
The following gems are required:
|
14
|
+
* `bzip2-ruby` (for Source servers sending compressed responses)
|
13
15
|
|
14
16
|
## License
|
15
17
|
|
16
18
|
This code is free software; you can redistribute it and/or modify it under the
|
17
|
-
terms of the new BSD License. A copy of this license can be found in the
|
18
|
-
file.
|
19
|
+
terms of the new BSD License. A copy of this license can be found in the
|
20
|
+
included LICENSE file.
|
19
21
|
|
20
22
|
## Credits
|
21
23
|
|
@@ -29,4 +31,5 @@ file.
|
|
29
31
|
* [Google group](http://groups.google.com/group/steam-condenser)
|
30
32
|
* [Ohloh profile](http://www.ohloh.net/projects/steam-condenser)
|
31
33
|
|
32
|
-
Follow Steam Condenser on Twitter
|
34
|
+
Follow Steam Condenser on Twitter
|
35
|
+
[@steamcondenser](http://twitter.com/steamcondenser).
|
data/Rakefile
CHANGED
@@ -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 'rake/rdoctask'
|
7
7
|
require 'rake/gempackagetask'
|
@@ -23,13 +23,15 @@ Jeweler::Tasks.new do |s|
|
|
23
23
|
|
24
24
|
s.files = %w(README.md Rakefile LICENSE VERSION.yml) + src_files + test_files
|
25
25
|
s.rdoc_options = ["--all", "--inline-source", "--line-numbers", "--charset=utf-8", "--webcvs=http://github.com/koraktor/steam-condenser/source/blob/master/ruby/%s"]
|
26
|
+
|
27
|
+
s.add_dependency('bzip2-ruby', '>= 0.2')
|
26
28
|
end
|
27
29
|
|
28
30
|
# Create a rake task +:rdoc+ to build the documentation
|
29
31
|
desc "Building docs"
|
30
32
|
Rake::RDocTask.new do |rdoc|
|
31
33
|
rdoc.title = "Steam Condenser documentation"
|
32
|
-
rdoc.rdoc_files.include ["lib/**/*.rb", "
|
34
|
+
rdoc.rdoc_files.include ["lib/**/*.rb", "LICENSE", "README.md"]
|
33
35
|
rdoc.main = "README.md"
|
34
36
|
rdoc.rdoc_dir = "rdoc"
|
35
37
|
rdoc.options = ["--all", "--inline-source", "--line-numbers", "--charset=utf-8", "--webcvs=http://github.com/koraktor/steam-condenser/blob/master/ruby/%s"]
|
data/VERSION.yml
CHANGED
data/lib/steam-condenser.rb
CHANGED
@@ -1,16 +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) 2009, Sebastian Staudt
|
5
|
-
|
6
|
-
require 'yaml'
|
7
|
-
|
8
|
-
libdir = File.dirname(__FILE__)
|
9
|
-
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
4
|
+
# Copyright (c) 2009-2010, Sebastian Staudt
|
10
5
|
|
11
6
|
module SteamCondenser
|
12
7
|
|
13
|
-
|
14
|
-
|
8
|
+
require 'steam-condenser/community'
|
9
|
+
require 'steam-condenser/servers'
|
10
|
+
require 'steam-condenser/version'
|
15
11
|
|
16
12
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is free software; you can redistribute it and/or modify it under the
|
2
|
+
# terms of the new BSD License.
|
3
|
+
#
|
4
|
+
# Copyright (c) 2010, Sebastian Staudt
|
5
|
+
|
6
|
+
module SteamCondenser
|
7
|
+
|
8
|
+
require 'steam-condenser/version'
|
9
|
+
|
10
|
+
module Community
|
11
|
+
|
12
|
+
require 'steam/community/steam_id'
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# This code is free software; you can redistribute it and/or modify it under the
|
2
|
+
# terms of the new BSD License.
|
3
|
+
#
|
4
|
+
# Copyright (c) 2010, Sebastian Staudt
|
5
|
+
|
6
|
+
module SteamCondenser
|
7
|
+
|
8
|
+
require 'steam-condenser/version'
|
9
|
+
|
10
|
+
module Servers
|
11
|
+
|
12
|
+
require 'steam/servers/goldsrc_server'
|
13
|
+
require 'steam/servers/master_server'
|
14
|
+
require 'steam/servers/source_server'
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# This code is free software; you can redistribute it and/or modify it under the
|
2
|
+
# terms of the new BSD License.
|
3
|
+
#
|
4
|
+
# Copyright (c) 2010, Sebastian Staudt
|
5
|
+
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
module SteamCondenser
|
9
|
+
|
10
|
+
version = YAML.load_file(File.join(File.dirname(__FILE__), '..', '..', 'VERSION.yml'))
|
11
|
+
VERSION = "#{version[:major]}.#{version[:minor]}.#{version[:patch]}"
|
12
|
+
|
13
|
+
end
|
@@ -1,26 +1,30 @@
|
|
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
|
# The GameAchievement class represents a specific achievement for a single game
|
7
7
|
# and for a single user
|
8
8
|
class GameAchievement
|
9
9
|
|
10
|
-
attr_reader :app_id, :name, :
|
11
|
-
|
12
|
-
# Creates the achievement with the given name for the given user and game
|
13
|
-
#
|
14
|
-
def initialize(
|
15
|
-
@app_id
|
16
|
-
@
|
17
|
-
@
|
18
|
-
@
|
10
|
+
attr_reader :app_id, :name, :steam_id64, :timestamp
|
11
|
+
|
12
|
+
# Creates the achievement with the given name for the given user and game
|
13
|
+
# and achievement data
|
14
|
+
def initialize(steam_id64, app_id, achievement_data)
|
15
|
+
@app_id = app_id
|
16
|
+
@name = achievement_data.elements['name'].text
|
17
|
+
@steam_id64 = steam_id64
|
18
|
+
@unlocked = (achievement_data.attributes['closed'].to_i == 1)
|
19
|
+
|
20
|
+
if @unlocked && !achievement_data.elements['unlockTimestamp'].nil?
|
21
|
+
@timestamp = Time.at(achievement_data.elements['unlockTimestamp'].text.to_i)
|
22
|
+
end
|
19
23
|
end
|
20
|
-
|
21
|
-
# Returns whether this achievement has been
|
22
|
-
def
|
23
|
-
@
|
24
|
+
|
25
|
+
# Returns whether this achievement has been unlocked by its owner
|
26
|
+
def unlocked?
|
27
|
+
@unlocked
|
24
28
|
end
|
25
|
-
|
29
|
+
|
26
30
|
end
|
@@ -59,11 +59,11 @@ class GameStats
|
|
59
59
|
|
60
60
|
@privacy_state = @xml_data.elements['privacyState'].text
|
61
61
|
if public?
|
62
|
-
@app_id
|
63
|
-
@custom_url
|
64
|
-
@game_name
|
65
|
-
@hours_played
|
66
|
-
@steam_id64
|
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
|
+
@game_name = @xml_data.elements['game/gameName'].text
|
65
|
+
@hours_played = @xml_data.elements['stats/hoursPlayed'].text
|
66
|
+
@steam_id64 = @xml_data.elements['player/steamID64'].text.to_i if @steam_id64.nil?
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -74,11 +74,11 @@ class GameStats
|
|
74
74
|
|
75
75
|
if @achievements.nil?
|
76
76
|
@achievements = Array.new
|
77
|
-
@xml_data.elements.each('achievements/achievement') do |
|
78
|
-
@achievements << GameAchievement.new(@
|
77
|
+
@xml_data.elements.each('achievements/achievement') do |achievement_data|
|
78
|
+
@achievements << GameAchievement.new(@steam_id64, @app_id, achievement_data)
|
79
79
|
end
|
80
80
|
|
81
|
-
@achievements_done = @achievements.reject{ |a| !a.
|
81
|
+
@achievements_done = @achievements.reject{ |a| !a.unlocked? }.size
|
82
82
|
end
|
83
83
|
|
84
84
|
@achievements
|
@@ -92,7 +92,7 @@ class GameStats
|
|
92
92
|
end
|
93
93
|
|
94
94
|
# Returns a float value representing the percentage of achievements done by
|
95
|
-
# this player.
|
95
|
+
# this player. If achievements haven't been parsed yet, parsing is done now.
|
96
96
|
def achievements_percentage
|
97
97
|
achievements_done.to_f / @achievements.size
|
98
98
|
end
|
@@ -14,10 +14,10 @@ class S2A_INFO2_Packet < S2A_INFO_BasePacket
|
|
14
14
|
super SteamPacket::S2A_INFO2_HEADER, data
|
15
15
|
|
16
16
|
@protocol_version = @content_data.byte
|
17
|
-
@server_name = @content_data.
|
18
|
-
@map_name = @content_data.
|
19
|
-
@game_directory = @content_data.
|
20
|
-
@game_description = @content_data.
|
17
|
+
@server_name = @content_data.cstring
|
18
|
+
@map_name = @content_data.cstring
|
19
|
+
@game_directory = @content_data.cstring
|
20
|
+
@game_description = @content_data.cstring
|
21
21
|
@app_id = @content_data.short
|
22
22
|
@number_of_players = @content_data.byte
|
23
23
|
@max_players = @content_data.byte
|
@@ -26,7 +26,7 @@ class S2A_INFO2_Packet < S2A_INFO_BasePacket
|
|
26
26
|
@operating_system = @content_data.byte.chr
|
27
27
|
@password_needed = @content_data.byte == 1
|
28
28
|
@secure = @content_data.byte == 1
|
29
|
-
@game_version = @content_data.
|
29
|
+
@game_version = @content_data.cstring
|
30
30
|
extra_data_flag = @content_data.byte
|
31
31
|
|
32
32
|
@server_port = @content_data.short unless extra_data_flag & 0x80 == 0
|
@@ -37,10 +37,10 @@ class S2A_INFO2_Packet < S2A_INFO_BasePacket
|
|
37
37
|
|
38
38
|
unless extra_data_flag & 0x40 == 0
|
39
39
|
@tv_port = @content_data.short
|
40
|
-
@tv_name = @content_data.
|
40
|
+
@tv_name = @content_data.cstring
|
41
41
|
end
|
42
42
|
|
43
|
-
@server_tags = @content_data.
|
43
|
+
@server_tags = @content_data.cstring unless extra_data_flag & 0x20 == 0
|
44
44
|
|
45
45
|
generate_info_hash
|
46
46
|
end
|
@@ -15,11 +15,11 @@ class S2A_INFO_DETAILED_Packet < S2A_INFO_BasePacket
|
|
15
15
|
def initialize(data)
|
16
16
|
super SteamPacket::S2A_INFO_DETAILED_HEADER, data
|
17
17
|
|
18
|
-
@game_ip = @content_data.
|
19
|
-
@server_name = @content_data.
|
20
|
-
@map_name = @content_data.
|
21
|
-
@game_directory = @content_data.
|
22
|
-
@game_description = @content_data.
|
18
|
+
@game_ip = @content_data.cstring
|
19
|
+
@server_name = @content_data.cstring
|
20
|
+
@map_name = @content_data.cstring
|
21
|
+
@game_directory = @content_data.cstring
|
22
|
+
@game_description = @content_data.cstring
|
23
23
|
@number_of_players = @content_data.byte
|
24
24
|
@max_players = @content_data.byte
|
25
25
|
@network_version = @content_data.byte
|
@@ -30,8 +30,8 @@ class S2A_INFO_DETAILED_Packet < S2A_INFO_BasePacket
|
|
30
30
|
|
31
31
|
if @is_mod
|
32
32
|
@mod_info = {}
|
33
|
-
@mod_info['url_info'] = @content_data.
|
34
|
-
@mod_info['url_dl'] = @content_data.
|
33
|
+
@mod_info['url_info'] = @content_data.cstring
|
34
|
+
@mod_info['url_dl'] = @content_data.cstring
|
35
35
|
@content_data.byte
|
36
36
|
if @content_data.remaining == 12
|
37
37
|
@mod_info['mod_version'] = @content_data.long
|
@@ -22,7 +22,7 @@ class S2A_PLAYER_Packet < SteamPacket
|
|
22
22
|
@player_hash = {}
|
23
23
|
|
24
24
|
while @content_data.remaining > 0
|
25
|
-
player_data = @content_data.byte, @content_data.
|
25
|
+
player_data = @content_data.byte, @content_data.cstring, @content_data.signed_long, @content_data.float
|
26
26
|
@player_hash[player_data[1]] = SteamPlayer.new(*player_data[0..3])
|
27
27
|
end
|
28
28
|
end
|
@@ -22,8 +22,8 @@ class S2A_RULES_Packet < SteamPacket
|
|
22
22
|
@rules_hash = {}
|
23
23
|
|
24
24
|
rules_count.times do
|
25
|
-
rule = @content_data.
|
26
|
-
value = @content_data.
|
25
|
+
rule = @content_data.cstring
|
26
|
+
value = @content_data.cstring
|
27
27
|
|
28
28
|
# This is a workaround for servers sending corrupt replies
|
29
29
|
break if rule.empty? or value.empty?
|
@@ -34,7 +34,7 @@ class SteamPacket
|
|
34
34
|
|
35
35
|
# Returns a packed string representing the packet's data
|
36
36
|
def to_s
|
37
|
-
[0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.
|
37
|
+
[0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.string].pack('c5a*')
|
38
38
|
end
|
39
39
|
|
40
40
|
end
|
@@ -8,7 +8,7 @@ require 'steam/sockets/master_server_socket'
|
|
8
8
|
|
9
9
|
class MasterServer
|
10
10
|
|
11
|
-
GOLDSRC_MASTER_SERVER = 'hl1master.steampowered.com',
|
11
|
+
GOLDSRC_MASTER_SERVER = 'hl1master.steampowered.com', 27010
|
12
12
|
SOURCE_MASTER_SERVER = 'hl2master.steampowered.com', 27011
|
13
13
|
|
14
14
|
REGION_US_EAST_COAST = 0x00
|
data/lib/stringio_additions.rb
CHANGED
@@ -7,8 +7,6 @@ require 'stringio'
|
|
7
7
|
|
8
8
|
class StringIO
|
9
9
|
|
10
|
-
alias_method :data, :string
|
11
|
-
|
12
10
|
def self.allocate(size)
|
13
11
|
new "\0" * size
|
14
12
|
end
|
@@ -41,7 +39,7 @@ class StringIO
|
|
41
39
|
read(4).unpack('l')[0]
|
42
40
|
end
|
43
41
|
|
44
|
-
def
|
42
|
+
def cstring
|
45
43
|
gets("\0")[0..-2]
|
46
44
|
end
|
47
45
|
|
@@ -13,7 +13,7 @@ class StringIOAdditionsTests < Test::Unit::TestCase
|
|
13
13
|
|
14
14
|
def test_allocate
|
15
15
|
buffer = StringIO.allocate(10)
|
16
|
-
assert_equal("\0" * 10, buffer.
|
16
|
+
assert_equal("\0" * 10, buffer.string)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_byte
|
@@ -48,17 +48,17 @@ class StringIOAdditionsTests < Test::Unit::TestCase
|
|
48
48
|
|
49
49
|
def test_string
|
50
50
|
buffer = StringIO.new("test\0test")
|
51
|
-
assert_equal('test', buffer.
|
51
|
+
assert_equal('test', buffer.cstring)
|
52
52
|
assert_equal(4, buffer.remaining)
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_put
|
56
56
|
buffer = StringIO.new('te')
|
57
57
|
buffer.write('st')
|
58
|
-
assert_equal('st', buffer.
|
58
|
+
assert_equal('st', buffer.string)
|
59
59
|
buffer = StringIO.allocate(4)
|
60
60
|
buffer.write('test')
|
61
|
-
assert_equal('test', buffer.
|
61
|
+
assert_equal('test', buffer.string)
|
62
62
|
end
|
63
63
|
|
64
64
|
def test_rewind
|
@@ -71,7 +71,7 @@ class StringIOAdditionsTests < Test::Unit::TestCase
|
|
71
71
|
def test_wrap
|
72
72
|
string = 'test'
|
73
73
|
buffer = StringIO.new(string)
|
74
|
-
assert_equal(string, buffer.
|
74
|
+
assert_equal(string, buffer.string)
|
75
75
|
end
|
76
76
|
|
77
77
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steam-condenser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 55
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 11
|
9
|
-
-
|
10
|
-
version: 0.11.
|
9
|
+
- 2
|
10
|
+
version: 0.11.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sebastian Staudt
|
@@ -15,10 +15,24 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-09-08 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: bzip2-ruby
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 2
|
33
|
+
version: "0.2"
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
22
36
|
description: A multi-language library for querying the Steam Community, Source, GoldSrc servers and Steam master servers
|
23
37
|
email: koraktor@gmail.com
|
24
38
|
executables: []
|
@@ -41,6 +55,9 @@ files:
|
|
41
55
|
- lib/exceptions/timeout_exception.rb
|
42
56
|
- lib/socket_channel.rb
|
43
57
|
- lib/steam-condenser.rb
|
58
|
+
- lib/steam-condenser/community.rb
|
59
|
+
- lib/steam-condenser/servers.rb
|
60
|
+
- lib/steam-condenser/version.rb
|
44
61
|
- lib/steam/community/cacheable.rb
|
45
62
|
- lib/steam/community/css/css_map.rb
|
46
63
|
- lib/steam/community/css/css_stats.rb
|