steam-condenser 0.10.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,19 +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/packets/steam_packet'
|
7
7
|
|
8
8
|
# The A2A_ACK_Packet class represents the response to a A2A_PING
|
9
9
|
# request send to the server.
|
10
10
|
class A2A_ACK_Packet < SteamPacket
|
11
|
-
|
11
|
+
|
12
12
|
# Creates a A2A_ACK response object based on the data received.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
def initialize(data)
|
14
|
+
if data != "\0" && data != "00000000000000\0"
|
15
|
+
raise Exception.new('Wrong formatted A2A_ACK packet.')
|
16
|
+
end
|
17
|
+
|
18
|
+
super SteamPacket::A2A_ACK_HEADER, data
|
19
|
+
end
|
20
|
+
|
19
21
|
end
|
@@ -1,16 +1,17 @@
|
|
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/packets/steam_packet'
|
7
7
|
|
8
8
|
# The A2A_PING_Packet class represents a A2A_PING request send to the
|
9
9
|
# server.
|
10
10
|
class A2A_PING_Packet < SteamPacket
|
11
|
-
|
11
|
+
|
12
12
|
# Creates a new A2A_PING request object
|
13
13
|
def initialize
|
14
14
|
super SteamPacket::A2A_PING_HEADER
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
|
+
end
|
@@ -1,23 +1,24 @@
|
|
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 'steam/packets/steam_packet'
|
7
|
+
require 'steam/servers/master_server'
|
8
8
|
|
9
9
|
class A2M_GET_SERVERS_BATCH2_Packet < SteamPacket
|
10
|
-
|
10
|
+
|
11
11
|
# Creates a master server request, filtering by the given paramters.
|
12
|
-
def initialize(region_code = MasterServer::REGION_ALL, start_ip =
|
12
|
+
def initialize(region_code = MasterServer::REGION_ALL, start_ip = '0.0.0.0:0', filter = '')
|
13
13
|
super SteamPacket::A2M_GET_SERVERS_BATCH2_HEADER
|
14
|
-
|
15
|
-
@filter = filter
|
16
|
-
@region_code = region_code
|
17
|
-
@start_ip = start_ip
|
14
|
+
|
15
|
+
@filter = filter
|
16
|
+
@region_code = region_code
|
17
|
+
@start_ip = start_ip
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def to_s
|
21
|
-
|
21
|
+
[@header_data, @region_code, @start_ip, @filter].pack('c2Z*Z*')
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
|
+
end
|
@@ -1,16 +1,17 @@
|
|
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/packets/steam_packet'
|
7
7
|
|
8
8
|
# The A2S_INFO_Packet class represents a A2S_INFO request send to the
|
9
9
|
# server.
|
10
10
|
class A2S_INFO_Packet < SteamPacket
|
11
|
-
|
11
|
+
|
12
12
|
# Creates a new A2S_INFO request object
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def initialize
|
14
|
+
super SteamPacket::A2S_INFO_HEADER, "Source Engine Query\0"
|
15
|
+
end
|
16
|
+
|
17
|
+
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
|
7
|
-
require
|
6
|
+
require 'steam/packets/request_with_challenge'
|
7
|
+
require 'steam/packets/steam_packet'
|
8
8
|
|
9
9
|
# The A2S_PLAYER_Packet class represents a A2S_PLAYER request send to the
|
10
10
|
# server.
|
11
11
|
class A2S_PLAYER_Packet < SteamPacket
|
12
|
-
|
12
|
+
|
13
13
|
include RequestWithChallenge
|
14
|
-
|
14
|
+
|
15
15
|
# Creates a new A2S_PLAYER request object including the challenge_number
|
16
16
|
def initialize(challenge_number = -1)
|
17
17
|
super SteamPacket::A2S_PLAYER_HEADER, challenge_number
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
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
|
7
|
-
require
|
6
|
+
require 'steam/packets/request_with_challenge'
|
7
|
+
require 'steam/packets/steam_packet'
|
8
8
|
|
9
9
|
# Creates a new A2A_RULES request object including the challenge_number
|
10
10
|
class A2S_RULES_Packet < SteamPacket
|
11
|
-
|
11
|
+
|
12
12
|
include RequestWithChallenge
|
13
|
-
|
13
|
+
|
14
14
|
# Creates a new A2S_RULES request object including the challenge_number
|
15
15
|
def initialize(challenge_number = -1)
|
16
16
|
super SteamPacket::A2S_RULES_HEADER, challenge_number
|
@@ -1,16 +1,17 @@
|
|
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/packets/steam_packet'
|
7
7
|
|
8
8
|
# The A2S_SERVERQUERY_GETCHALLENGE_Packet class represents a
|
9
9
|
# A2S_SERVERQUERY_GETCHALLENGE request send to the server.
|
10
10
|
class A2S_SERVERQUERY_GETCHALLENGE_Packet < SteamPacket
|
11
|
-
|
11
|
+
|
12
12
|
# Creates a new A2S_SERVERQUERY_GETCHALLENGE request object
|
13
13
|
def initialize
|
14
14
|
super SteamPacket::A2S_SERVERQUERY_GETCHALLENGE_HEADER
|
15
15
|
end
|
16
|
+
|
16
17
|
end
|
@@ -1,35 +1,33 @@
|
|
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/packets/steam_packet'
|
7
7
|
|
8
8
|
class M2A_SERVER_BATCH_Packet < SteamPacket
|
9
|
-
|
9
|
+
|
10
|
+
attr_reader :servers
|
11
|
+
|
10
12
|
def initialize(data)
|
11
13
|
super SteamPacket::M2A_SERVER_BATCH_HEADER, data
|
12
|
-
|
13
|
-
|
14
|
-
raise PacketFormatException.new(
|
14
|
+
|
15
|
+
unless @content_data.byte == 0x0A
|
16
|
+
raise PacketFormatException.new('Master query response is missing additional 0x0A byte.')
|
15
17
|
end
|
16
|
-
|
17
|
-
@
|
18
|
-
|
18
|
+
|
19
|
+
@servers = []
|
20
|
+
|
19
21
|
begin
|
20
|
-
first_octet = @content_data.
|
21
|
-
second_octet = @content_data.
|
22
|
-
third_octet = @content_data.
|
23
|
-
fourth_octet = @content_data.
|
24
|
-
port_number = @content_data.
|
22
|
+
first_octet = @content_data.byte
|
23
|
+
second_octet = @content_data.byte
|
24
|
+
third_octet = @content_data.byte
|
25
|
+
fourth_octet = @content_data.byte
|
26
|
+
port_number = @content_data.short
|
25
27
|
port_number = ((port_number & 0xFF) << 8) + (port_number >> 8)
|
26
|
-
|
27
|
-
@
|
28
|
+
|
29
|
+
@servers << "#{first_octet}.#{second_octet}.#{third_octet}.#{fourth_octet}:#{port_number}"
|
28
30
|
end while @content_data.remaining > 0
|
29
31
|
end
|
30
|
-
|
31
|
-
|
32
|
-
return @server_array
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
32
|
+
|
33
|
+
end
|
@@ -1,14 +1,14 @@
|
|
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/packets/rcon/rcon_packet'
|
7
7
|
|
8
8
|
class RCONAuthRequest < RCONPacket
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(request_id, rcon_password)
|
11
11
|
super request_id, RCONPacket::SERVERDATA_AUTH, rcon_password
|
12
12
|
end
|
13
|
-
|
14
|
-
end
|
13
|
+
|
14
|
+
end
|
@@ -1,14 +1,14 @@
|
|
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/packets/rcon/rcon_packet'
|
7
7
|
|
8
8
|
class RCONAuthResponse < RCONPacket
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(request_id)
|
11
|
-
super request_id, RCONPacket::SERVERDATA_AUTH_RESPONSE,
|
11
|
+
super request_id, RCONPacket::SERVERDATA_AUTH_RESPONSE, ''
|
12
12
|
end
|
13
|
-
|
14
|
-
end
|
13
|
+
|
14
|
+
end
|
@@ -1,14 +1,14 @@
|
|
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/packets/rcon/rcon_packet'
|
7
7
|
|
8
8
|
class RCONExecRequest < RCONPacket
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(request_id, rcon_command)
|
11
11
|
super request_id, RCONPacket::SERVERDATA_EXECCOMMAND, rcon_command
|
12
12
|
end
|
13
|
-
|
14
|
-
end
|
13
|
+
|
14
|
+
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/packets/steam_packet'
|
7
7
|
|
8
8
|
class RCONGoldSrcRequest < SteamPacket
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(request)
|
11
11
|
super 0x00, request
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def to_s
|
15
|
-
|
15
|
+
[0xFFFFFFFF, @content_data.data].pack('Va*')
|
16
16
|
end
|
17
|
-
|
18
|
-
end
|
17
|
+
|
18
|
+
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/packets/steam_packet'
|
7
7
|
|
8
8
|
class RCONGoldSrcResponse < SteamPacket
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(command_response)
|
11
11
|
super SteamPacket::RCON_GOLDSRC_RESPONSE_HEADER, command_response
|
12
12
|
end
|
13
|
-
|
14
|
-
def
|
15
|
-
|
13
|
+
|
14
|
+
def response
|
15
|
+
@content_data.data[0..-3]
|
16
16
|
end
|
17
|
-
|
18
|
-
end
|
17
|
+
|
18
|
+
end
|
@@ -1,34 +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
|
-
require
|
7
|
-
require
|
6
|
+
require 'abstract_class'
|
7
|
+
require 'steam/packets/steam_packet'
|
8
8
|
|
9
9
|
class RCONPacket < SteamPacket
|
10
10
|
|
11
11
|
include AbstractClass
|
12
|
-
|
12
|
+
|
13
13
|
SERVERDATA_AUTH = 3
|
14
14
|
SERVERDATA_AUTH_RESPONSE = 2
|
15
15
|
SERVERDATA_EXECCOMMAND = 2
|
16
16
|
SERVERDATA_RESPONSE_VALUE = 0
|
17
|
-
|
17
|
+
|
18
18
|
attr_reader :request_id
|
19
|
-
|
19
|
+
|
20
20
|
def initialize(request_id, rcon_header, rcon_data)
|
21
21
|
super rcon_header, "#{rcon_data}\0\0"
|
22
|
-
|
22
|
+
|
23
23
|
@request_id = request_id
|
24
24
|
end
|
25
|
-
|
26
|
-
def
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def get_request_id
|
31
|
-
return @request_id
|
25
|
+
|
26
|
+
def bytes
|
27
|
+
[@content_data.length + 8, @request_id, @header_data, @content_data.data].pack('V3a*')
|
32
28
|
end
|
33
|
-
|
34
|
-
end
|
29
|
+
|
30
|
+
end
|
@@ -1,27 +1,27 @@
|
|
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 'stringio_additions'
|
8
|
+
require 'exceptions/packet_format_exception'
|
9
|
+
require 'steam/packets/steam_packet_factory'
|
10
|
+
require 'steam/packets/rcon/rcon_auth_response'
|
11
|
+
require 'steam/packets/rcon/rcon_exec_response'
|
12
12
|
|
13
13
|
class RCONPacketFactory < SteamPacketFactory
|
14
|
-
|
14
|
+
|
15
15
|
include AbstractClass
|
16
|
-
|
17
|
-
def self.
|
18
|
-
byte_buffer =
|
19
|
-
|
20
|
-
|
21
|
-
request_id = byte_buffer.
|
22
|
-
header = byte_buffer.
|
23
|
-
data = byte_buffer.
|
24
|
-
|
16
|
+
|
17
|
+
def self.packet_from_data(raw_data)
|
18
|
+
byte_buffer = StringIO.new raw_data
|
19
|
+
|
20
|
+
byte_buffer.long
|
21
|
+
request_id = byte_buffer.long
|
22
|
+
header = byte_buffer.long
|
23
|
+
data = byte_buffer.string
|
24
|
+
|
25
25
|
case header
|
26
26
|
when RCONPacket::SERVERDATA_AUTH_RESPONSE then
|
27
27
|
return RCONAuthResponse.new(request_id)
|
@@ -31,5 +31,5 @@ class RCONPacketFactory < SteamPacketFactory
|
|
31
31
|
raise PacketFormatException.new("Unknown packet with header #{header.to_s(16)} received.")
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
end
|
34
|
+
|
35
|
+
end
|