steam-condenser 0.8.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.
Files changed (72) hide show
  1. data/LICENSE +25 -0
  2. data/README.md +30 -0
  3. data/Rakefile +42 -0
  4. data/lib/abstract_class.rb +40 -0
  5. data/lib/byte_buffer.rb +126 -0
  6. data/lib/datagram_channel.rb +70 -0
  7. data/lib/exceptions/buffer_underflow_exception.rb +10 -0
  8. data/lib/exceptions/packet_format_exception.rb +12 -0
  9. data/lib/exceptions/rcon_no_auth_exception.rb +14 -0
  10. data/lib/exceptions/steam_condenser_exception.rb +8 -0
  11. data/lib/exceptions/timeout_exception.rb +10 -0
  12. data/lib/socket_channel.rb +54 -0
  13. data/lib/steam-condenser.rb +3 -0
  14. data/lib/steam/community/dods/dods_class.rb +32 -0
  15. data/lib/steam/community/dods/dods_stats.rb +47 -0
  16. data/lib/steam/community/dods/dods_weapon.rb +54 -0
  17. data/lib/steam/community/game_achievement.rb +26 -0
  18. data/lib/steam/community/game_class.rb +15 -0
  19. data/lib/steam/community/game_stats.rb +92 -0
  20. data/lib/steam/community/game_weapon.rb +29 -0
  21. data/lib/steam/community/l4d/l4d_explosive.rb +23 -0
  22. data/lib/steam/community/l4d/l4d_map.rb +34 -0
  23. data/lib/steam/community/l4d/l4d_stats.rb +166 -0
  24. data/lib/steam/community/l4d/l4d_weapon.rb +23 -0
  25. data/lib/steam/community/steam_group.rb +16 -0
  26. data/lib/steam/community/steam_id.rb +212 -0
  27. data/lib/steam/community/tf2/tf2_class.rb +31 -0
  28. data/lib/steam/community/tf2/tf2_class_factory.rb +38 -0
  29. data/lib/steam/community/tf2/tf2_engineer.rb +25 -0
  30. data/lib/steam/community/tf2/tf2_medic.rb +22 -0
  31. data/lib/steam/community/tf2/tf2_sniper.rb +20 -0
  32. data/lib/steam/community/tf2/tf2_spy.rb +23 -0
  33. data/lib/steam/community/tf2/tf2_stats.rb +39 -0
  34. data/lib/steam/packets/a2a_ack_packet.rb +21 -0
  35. data/lib/steam/packets/a2a_ping_packet.rb +18 -0
  36. data/lib/steam/packets/a2m_get_servers_batch2_packet.rb +25 -0
  37. data/lib/steam/packets/a2s_info_packet.rb +18 -0
  38. data/lib/steam/packets/a2s_player_packet.rb +22 -0
  39. data/lib/steam/packets/a2s_rules_packet.rb +21 -0
  40. data/lib/steam/packets/a2s_serverquery_getchallenge_packet.rb +18 -0
  41. data/lib/steam/packets/m2a_server_batch_packet.rb +37 -0
  42. data/lib/steam/packets/rcon/rcon_auth_request.rb +16 -0
  43. data/lib/steam/packets/rcon/rcon_auth_response.rb +16 -0
  44. data/lib/steam/packets/rcon/rcon_exec_request.rb +16 -0
  45. data/lib/steam/packets/rcon/rcon_exec_response.rb +20 -0
  46. data/lib/steam/packets/rcon/rcon_goldsrc_request.rb +20 -0
  47. data/lib/steam/packets/rcon/rcon_goldsrc_response.rb +20 -0
  48. data/lib/steam/packets/rcon/rcon_packet.rb +36 -0
  49. data/lib/steam/packets/rcon/rcon_packet_factory.rb +37 -0
  50. data/lib/steam/packets/request_with_challenge.rb +16 -0
  51. data/lib/steam/packets/s2a_info2_packet.rb +48 -0
  52. data/lib/steam/packets/s2a_info_base_packet.rb +29 -0
  53. data/lib/steam/packets/s2a_info_detailed_packet.rb +50 -0
  54. data/lib/steam/packets/s2a_player_packet.rb +32 -0
  55. data/lib/steam/packets/s2a_rules_packet.rb +33 -0
  56. data/lib/steam/packets/s2c_challenge_packet.rb +23 -0
  57. data/lib/steam/packets/steam_packet.rb +48 -0
  58. data/lib/steam/packets/steam_packet_factory.rb +90 -0
  59. data/lib/steam/servers/game_server.rb +222 -0
  60. data/lib/steam/servers/goldsrc_server.rb +36 -0
  61. data/lib/steam/servers/master_server.rb +60 -0
  62. data/lib/steam/servers/source_server.rb +65 -0
  63. data/lib/steam/sockets/goldsrc_socket.rb +108 -0
  64. data/lib/steam/sockets/master_server_socket.rb +20 -0
  65. data/lib/steam/sockets/rcon_socket.rb +50 -0
  66. data/lib/steam/sockets/source_socket.rb +72 -0
  67. data/lib/steam/sockets/steam_socket.rb +63 -0
  68. data/lib/steam/steam_player.rb +51 -0
  69. data/test/query_tests.rb +71 -0
  70. data/test/rcon_tests.rb +79 -0
  71. data/test/steam_community_tests.rb +36 -0
  72. metadata +132 -0
@@ -0,0 +1,21 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ # The A2A_ACK_Packet class represents the response to a A2A_PING
11
+ # request send to the server.
12
+ class A2A_ACK_Packet < SteamPacket
13
+
14
+ # Creates a A2A_ACK response object based on the data received.
15
+ def initialize(data)
16
+ if data != "\0" && data != "00000000000000\0"
17
+ raise Exception.new("Wrong formatted A2A_ACK packet.")
18
+ end
19
+ super SteamPacket::A2A_ACK_HEADER, data
20
+ end
21
+ 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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ # The A2A_PING_Packet class represents a A2A_PING request send to the
11
+ # server.
12
+ class A2A_PING_Packet < SteamPacket
13
+
14
+ # Creates a new A2A_PING request object
15
+ def initialize
16
+ super SteamPacket::A2A_PING_HEADER
17
+ end
18
+ end
@@ -0,0 +1,25 @@
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) 2008-2009, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+ require "steam/servers/master_server"
10
+
11
+ class A2M_GET_SERVERS_BATCH2_Packet < SteamPacket
12
+
13
+ # Creates a master server request, filtering by the given paramters.
14
+ def initialize(region_code = MasterServer::REGION_ALL, start_ip = "0.0.0.0:0", filter = "")
15
+ super SteamPacket::A2M_GET_SERVERS_BATCH2_HEADER
16
+
17
+ @filter = filter;
18
+ @region_code = region_code;
19
+ @start_ip = start_ip;
20
+ end
21
+
22
+ def to_s
23
+ return [@header_data, @region_code, @start_ip, @filter].pack("c2Z*Z*")
24
+ end
25
+ 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) 2008-2009, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ # The A2S_INFO_Packet class represents a A2S_INFO request send to the
11
+ # server.
12
+ class A2S_INFO_Packet < SteamPacket
13
+
14
+ # Creates a new A2S_INFO request object
15
+ def initialize
16
+ super SteamPacket::A2S_INFO_HEADER, "Source Engine Query\0"
17
+ end
18
+ end
@@ -0,0 +1,22 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/request_with_challenge"
9
+ require "steam/packets/steam_packet"
10
+
11
+ # The A2S_PLAYER_Packet class represents a A2S_PLAYER request send to the
12
+ # server.
13
+ class A2S_PLAYER_Packet < SteamPacket
14
+
15
+ include RequestWithChallenge
16
+
17
+ # Creates a new A2S_PLAYER request object including the challenge_number
18
+ def initialize(challenge_number = -1)
19
+ super SteamPacket::A2S_PLAYER_HEADER, challenge_number
20
+ end
21
+
22
+ end
@@ -0,0 +1,21 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/request_with_challenge"
9
+ require "steam/packets/steam_packet"
10
+
11
+ # Creates a new A2A_RULES request object including the challenge_number
12
+ class A2S_RULES_Packet < SteamPacket
13
+
14
+ include RequestWithChallenge
15
+
16
+ # Creates a new A2S_RULES request object including the challenge_number
17
+ def initialize(challenge_number = -1)
18
+ super SteamPacket::A2S_RULES_HEADER, challenge_number
19
+ end
20
+
21
+ 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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ # The A2S_SERVERQUERY_GETCHALLENGE_Packet class represents a
11
+ # A2S_SERVERQUERY_GETCHALLENGE request send to the server.
12
+ class A2S_SERVERQUERY_GETCHALLENGE_Packet < SteamPacket
13
+
14
+ # Creates a new A2S_SERVERQUERY_GETCHALLENGE request object
15
+ def initialize
16
+ super SteamPacket::A2S_SERVERQUERY_GETCHALLENGE_HEADER
17
+ end
18
+ end
@@ -0,0 +1,37 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ class M2A_SERVER_BATCH_Packet < SteamPacket
11
+
12
+ def initialize(data)
13
+ super SteamPacket::M2A_SERVER_BATCH_HEADER, data
14
+
15
+ if(@content_data.get_byte != 0x0A)
16
+ raise PacketFormatException.new("Master query response is missing additional 0x0A byte.")
17
+ end
18
+
19
+ @server_array = Array.new
20
+
21
+ begin
22
+ first_octet = @content_data.get_byte
23
+ second_octet = @content_data.get_byte
24
+ third_octet = @content_data.get_byte
25
+ fourth_octet = @content_data.get_byte
26
+ port_number = @content_data.get_short
27
+ port_number = ((port_number & 0xFF) << 8) + (port_number >> 8)
28
+
29
+ @server_array << "#{first_octet}.#{second_octet}.#{third_octet}.#{fourth_octet}:#{port_number}"
30
+ end while @content_data.remaining > 0
31
+ end
32
+
33
+ def get_servers
34
+ return @server_array
35
+ end
36
+
37
+ 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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/rcon/rcon_packet"
9
+
10
+ class RCONAuthRequest < RCONPacket
11
+
12
+ def initialize(request_id, rcon_password)
13
+ super request_id, RCONPacket::SERVERDATA_AUTH, rcon_password
14
+ end
15
+
16
+ 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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/rcon/rcon_packet"
9
+
10
+ class RCONAuthResponse < RCONPacket
11
+
12
+ def initialize(request_id)
13
+ super request_id, RCONPacket::SERVERDATA_AUTH_RESPONSE, ""
14
+ end
15
+
16
+ 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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/rcon/rcon_packet"
9
+
10
+ class RCONExecRequest < RCONPacket
11
+
12
+ def initialize(request_id, rcon_command)
13
+ super request_id, RCONPacket::SERVERDATA_EXECCOMMAND, rcon_command
14
+ end
15
+
16
+ end
@@ -0,0 +1,20 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/rcon/rcon_packet"
9
+
10
+ class RCONExecResponse < RCONPacket
11
+
12
+ def initialize(request_id, command_response)
13
+ super request_id, RCONPacket::SERVERDATA_RESPONSE_VALUE, command_response
14
+ end
15
+
16
+ def get_response
17
+ return @content_data.array
18
+ end
19
+
20
+ end
@@ -0,0 +1,20 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ class RCONGoldSrcRequest < SteamPacket
11
+
12
+ def initialize(request)
13
+ super 0x00, request
14
+ end
15
+
16
+ def to_s
17
+ return [0xFFFFFFFF, @content_data.array].pack("Va*")
18
+ end
19
+
20
+ end
@@ -0,0 +1,20 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/steam_packet"
9
+
10
+ class RCONGoldSrcResponse < SteamPacket
11
+
12
+ def initialize(command_response)
13
+ super SteamPacket::RCON_GOLDSRC_RESPONSE_HEADER, command_response
14
+ end
15
+
16
+ def get_response
17
+ return @content_data.array[0..-3]
18
+ end
19
+
20
+ end
@@ -0,0 +1,36 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "abstract_class"
9
+ require "steam/packets/steam_packet"
10
+
11
+ class RCONPacket < SteamPacket
12
+
13
+ include AbstractClass
14
+
15
+ SERVERDATA_AUTH = 3
16
+ SERVERDATA_AUTH_RESPONSE = 2
17
+ SERVERDATA_EXECCOMMAND = 2
18
+ SERVERDATA_RESPONSE_VALUE = 0
19
+
20
+ attr_reader :request_id
21
+
22
+ def initialize(request_id, rcon_header, rcon_data)
23
+ super rcon_header, "#{rcon_data}\0\0"
24
+
25
+ @request_id = request_id
26
+ end
27
+
28
+ def get_bytes
29
+ return [@content_data.length + 8, @request_id, @header_data, @content_data.array].pack("V3a*")
30
+ end
31
+
32
+ def get_request_id
33
+ return @request_id
34
+ end
35
+
36
+ end
@@ -0,0 +1,37 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "abstract_class"
9
+ require "byte_buffer"
10
+ require "exceptions/packet_format_exception"
11
+ require "steam/packets/steam_packet_factory"
12
+ require "steam/packets/rcon/rcon_auth_response"
13
+ require "steam/packets/rcon/rcon_exec_response"
14
+
15
+ class RCONPacketFactory < SteamPacketFactory
16
+
17
+ include AbstractClass
18
+
19
+ def self.get_packet_from_data(raw_data)
20
+ byte_buffer = ByteBuffer.new raw_data
21
+
22
+ packet_size = byte_buffer.get_long
23
+ request_id = byte_buffer.get_long
24
+ header = byte_buffer.get_long
25
+ data = byte_buffer.get_string
26
+
27
+ case header
28
+ when RCONPacket::SERVERDATA_AUTH_RESPONSE then
29
+ return RCONAuthResponse.new(request_id)
30
+ when RCONPacket::SERVERDATA_RESPONSE_VALUE then
31
+ return RCONExecResponse.new(request_id, data)
32
+ else
33
+ raise PacketFormatException.new("Unknown packet with header #{header.to_s(16)} received.")
34
+ end
35
+ end
36
+
37
+ 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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ # This module implements a to_s method for request packets which send a challenge number
9
+ module RequestWithChallenge
10
+
11
+ # Returns a packed version of the request
12
+ def to_s
13
+ return [0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.array.to_i].pack("c5l")
14
+ end
15
+
16
+ end
@@ -0,0 +1,48 @@
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) 2008, Sebastian Staudt
5
+ #
6
+ # $Id$
7
+
8
+ require "steam/packets/s2a_info_base_packet"
9
+
10
+ # The S2A_INFO2_Packet class represents the response to a A2A_INFO
11
+ # request send to a Source server.
12
+ class S2A_INFO2_Packet < S2A_INFO_BasePacket
13
+
14
+ # Creates a S2A_INFO2 response object based on the data received.
15
+ def initialize(data)
16
+ super SteamPacket::S2A_INFO2_HEADER, data
17
+
18
+ @protocol_version = @content_data.get_byte
19
+ @server_name = @content_data.get_string
20
+ @map_name = @content_data.get_string
21
+ @game_directory = @content_data.get_string
22
+ @game_description = @content_data.get_string
23
+ @app_id = @content_data.get_short
24
+ @number_of_players = @content_data.get_byte
25
+ @max_players = @content_data.get_byte
26
+ @number_of_bots = @content_data.get_byte
27
+ @dedicated = @content_data.get_byte.chr
28
+ @operating_system = @content_data.get_byte.chr
29
+ @password_needed = @content_data.get_byte == 1
30
+ @secure = @content_data.get_byte == 1
31
+ @game_version = @content_data.get_string
32
+ extra_data_flag = @content_data.get_byte
33
+
34
+ if extra_data_flag & 0x80
35
+ @server_port = @content_data.get_short
36
+ end
37
+
38
+ if extra_data_flag & 0x40
39
+ @tv_port = @content_data.get_short
40
+ @tv_name = @content_data.get_string
41
+ end
42
+
43
+ if extra_data_flag & 0x20
44
+ @server_tags = @content_data.get_string
45
+ end
46
+ end
47
+
48
+ end