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.
Files changed (73) hide show
  1. data/VERSION.yml +2 -2
  2. data/lib/datagram_channel.rb +30 -33
  3. data/lib/exceptions/packet_format_exception.rb +7 -3
  4. data/lib/exceptions/rcon_ban_exception.rb +7 -5
  5. data/lib/exceptions/rcon_no_auth_exception.rb +8 -6
  6. data/lib/exceptions/timeout_exception.rb +10 -4
  7. data/lib/socket_channel.rb +11 -17
  8. data/lib/steam/community/cacheable.rb +5 -7
  9. data/lib/steam/community/css/css_map.rb +31 -0
  10. data/lib/steam/community/css/css_stats.rb +116 -0
  11. data/lib/steam/community/css/css_weapon.rb +33 -0
  12. data/lib/steam/community/dods/dods_stats.rb +3 -3
  13. data/lib/steam/community/game_stats.rb +14 -13
  14. data/lib/steam/community/game_weapon.rb +3 -5
  15. data/lib/steam/community/l4d/abstract_l4d_stats.rb +4 -2
  16. data/lib/steam/community/l4d/l4d_explosive.rb +2 -2
  17. data/lib/steam/community/l4d/l4d_map.rb +3 -3
  18. data/lib/steam/community/steam_group.rb +2 -4
  19. data/lib/steam/community/steam_id.rb +2 -2
  20. data/lib/steam/community/tf2/tf2_class.rb +17 -17
  21. data/lib/steam/community/tf2/tf2_class_factory.rb +17 -17
  22. data/lib/steam/community/tf2/tf2_engineer.rb +9 -9
  23. data/lib/steam/community/tf2/tf2_medic.rb +9 -9
  24. data/lib/steam/community/tf2/tf2_sniper.rb +7 -7
  25. data/lib/steam/community/tf2/tf2_spy.rb +9 -9
  26. data/lib/steam/community/tf2/tf2_stats.rb +9 -9
  27. data/lib/steam/packets/a2a_ack_packet.rb +11 -9
  28. data/lib/steam/packets/a2a_ping_packet.rb +5 -4
  29. data/lib/steam/packets/a2m_get_servers_batch2_packet.rb +13 -12
  30. data/lib/steam/packets/a2s_info_packet.rb +8 -7
  31. data/lib/steam/packets/a2s_player_packet.rb +6 -6
  32. data/lib/steam/packets/a2s_rules_packet.rb +5 -5
  33. data/lib/steam/packets/a2s_serverquery_getchallenge_packet.rb +4 -3
  34. data/lib/steam/packets/m2a_server_batch_packet.rb +20 -22
  35. data/lib/steam/packets/rcon/rcon_auth_request.rb +5 -5
  36. data/lib/steam/packets/rcon/rcon_auth_response.rb +6 -6
  37. data/lib/steam/packets/rcon/rcon_exec_request.rb +5 -5
  38. data/lib/steam/packets/rcon/rcon_exec_response.rb +2 -2
  39. data/lib/steam/packets/rcon/rcon_goldsrc_request.rb +7 -7
  40. data/lib/steam/packets/rcon/rcon_goldsrc_response.rb +8 -8
  41. data/lib/steam/packets/rcon/rcon_packet.rb +12 -16
  42. data/lib/steam/packets/rcon/rcon_packet_factory.rb +19 -19
  43. data/lib/steam/packets/request_with_challenge.rb +5 -5
  44. data/lib/steam/packets/s2a_info2_packet.rb +28 -30
  45. data/lib/steam/packets/s2a_info_base_packet.rb +11 -16
  46. data/lib/steam/packets/s2a_info_detailed_packet.rb +30 -28
  47. data/lib/steam/packets/s2a_player_packet.rb +7 -9
  48. data/lib/steam/packets/s2a_rules_packet.rb +8 -12
  49. data/lib/steam/packets/s2c_challenge_packet.rb +7 -6
  50. data/lib/steam/packets/steam_packet.rb +7 -6
  51. data/lib/steam/packets/steam_packet_factory.rb +37 -38
  52. data/lib/steam/servers/game_server.rb +76 -86
  53. data/lib/steam/servers/goldsrc_server.rb +5 -5
  54. data/lib/steam/servers/master_server.rb +24 -24
  55. data/lib/steam/servers/source_server.rb +17 -19
  56. data/lib/steam/sockets/goldsrc_socket.rb +43 -46
  57. data/lib/steam/sockets/master_server_socket.rb +11 -13
  58. data/lib/steam/sockets/rcon_socket.rb +15 -17
  59. data/lib/steam/sockets/source_socket.rb +21 -21
  60. data/lib/steam/sockets/steam_socket.rb +25 -28
  61. data/lib/steam/steam_player.rb +3 -1
  62. data/lib/stringio_additions.rb +48 -0
  63. data/test/datagram_channel_tests.rb +8 -8
  64. data/test/query_tests.rb +15 -14
  65. data/test/rcon_tests.rb +32 -31
  66. data/test/socket_channel_tests.rb +7 -7
  67. data/test/steam/communtiy/steam_community_test_suite.rb +5 -2
  68. data/test/steam_community_tests.rb +4 -3
  69. data/test/stringio_additions_tests.rb +77 -0
  70. metadata +15 -8
  71. data/lib/byte_buffer.rb +0 -126
  72. data/lib/exceptions/buffer_underflow_exception.rb +0 -8
  73. data/test/byte_buffer_tests.rb +0 -76
@@ -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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
6
  # This module implements a to_s method for request packets which send a challenge number
7
7
  module RequestWithChallenge
8
-
8
+
9
9
  # Returns a packed version of the request
10
10
  def to_s
11
- return [0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.array.to_i].pack("c5l")
11
+ [0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.data.to_i].pack('c5l')
12
12
  end
13
-
14
- end
13
+
14
+ end
@@ -1,50 +1,48 @@
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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
- require "steam/packets/s2a_info_base_packet"
6
+ require 'steam/packets/s2a_info_base_packet'
7
7
 
8
8
  # The S2A_INFO2_Packet class represents the response to a A2A_INFO
9
9
  # request send to a Source server.
10
10
  class S2A_INFO2_Packet < S2A_INFO_BasePacket
11
-
11
+
12
12
  # Creates a S2A_INFO2 response object based on the data received.
13
13
  def initialize(data)
14
14
  super SteamPacket::S2A_INFO2_HEADER, data
15
-
16
- @protocol_version = @content_data.get_byte
17
- @server_name = @content_data.get_string
18
- @map_name = @content_data.get_string
19
- @game_directory = @content_data.get_string
20
- @game_description = @content_data.get_string
21
- @app_id = @content_data.get_short
22
- @number_of_players = @content_data.get_byte
23
- @max_players = @content_data.get_byte
24
- @number_of_bots = @content_data.get_byte
25
- @dedicated = @content_data.get_byte.chr
26
- @operating_system = @content_data.get_byte.chr
27
- @password_needed = @content_data.get_byte == 1
28
- @secure = @content_data.get_byte == 1
29
- @game_version = @content_data.get_string
30
- extra_data_flag = @content_data.get_byte
31
-
32
- unless extra_data_flag & 0x80 == 0
33
- @server_port = @content_data.get_short
34
- end
15
+
16
+ @protocol_version = @content_data.byte
17
+ @server_name = @content_data.string
18
+ @map_name = @content_data.string
19
+ @game_directory = @content_data.string
20
+ @game_description = @content_data.string
21
+ @app_id = @content_data.short
22
+ @number_of_players = @content_data.byte
23
+ @max_players = @content_data.byte
24
+ @number_of_bots = @content_data.byte
25
+ @dedicated = @content_data.byte.chr
26
+ @operating_system = @content_data.byte.chr
27
+ @password_needed = @content_data.byte == 1
28
+ @secure = @content_data.byte == 1
29
+ @game_version = @content_data.string
30
+ extra_data_flag = @content_data.byte
31
+
32
+ @server_port = @content_data.short unless extra_data_flag & 0x80 == 0
35
33
 
36
34
  unless extra_data_flag & 0x10 == 0
37
- @server_id = @content_data.get_long | (@content_data.get_long << 32)
35
+ @server_id = @content_data.long | (@content_data.long << 32)
38
36
  end
39
37
 
40
38
  unless extra_data_flag & 0x40 == 0
41
- @tv_port = @content_data.get_short
42
- @tv_name = @content_data.get_string
39
+ @tv_port = @content_data.short
40
+ @tv_name = @content_data.string
43
41
  end
44
42
 
45
- unless extra_data_flag & 0x20 == 0
46
- @server_tags = @content_data.get_string
47
- end
43
+ @server_tags = @content_data.string unless extra_data_flag & 0x20 == 0
44
+
45
+ generate_info_hash
48
46
  end
49
-
47
+
50
48
  end
@@ -1,31 +1,26 @@
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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
- require "abstract_class"
7
- require "steam/packets/steam_packet"
6
+ require 'abstract_class'
7
+ require 'steam/packets/steam_packet'
8
8
 
9
9
  # The S2A_INFO_BasePacket class represents the response to a A2S_INFO
10
10
  # request send to the server.
11
11
  class S2A_INFO_BasePacket < SteamPacket
12
-
12
+
13
13
  include AbstractClass
14
-
15
- # Creates a S2A_INFO[...] response object based on the data received.
16
- def initialize(header, data)
17
- super header, data
18
- end
19
-
14
+
15
+ attr_reader :info_hash
16
+
20
17
  # Returns the hash containing information on the server
21
- public
22
- def get_info_hash
23
- return Hash[
18
+ def generate_info_hash
19
+ @info_hash = Hash[
24
20
  *instance_variables.map { |var|
25
- if var != "@content_data" && var != "@header_data"
26
- [var[1..-1], instance_variable_get(var)]
27
- end
21
+ [var[1..-1], instance_variable_get(var)] if var != '@content_data' && var != '@header_data'
28
22
  }.compact.flatten
29
23
  ]
30
24
  end
25
+
31
26
  end
@@ -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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
6
  require "steam/packets/s2a_info_base_packet"
7
7
 
@@ -10,41 +10,43 @@ require "steam/packets/s2a_info_base_packet"
10
10
  # This is deprecated by 10/24/2008 for GoldSrc servers. They use the same
11
11
  # format as Source servers (S2A_INFO2) now.
12
12
  class S2A_INFO_DETAILED_Packet < S2A_INFO_BasePacket
13
-
13
+
14
14
  # Creates a S2A_INFO_DETAILED response object based on the data received.
15
15
  def initialize(data)
16
16
  super SteamPacket::S2A_INFO_DETAILED_HEADER, data
17
17
 
18
- @game_ip = @content_data.get_string
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
- @number_of_players = @content_data.get_byte
24
- @max_players = @content_data.get_byte
25
- @network_version = @content_data.get_byte
26
- @dedicated = @content_data.get_byte.chr
27
- @operating_system = @content_data.get_byte.chr
28
- @password_needed = @content_data.get_byte == 1
29
- @is_mod = @content_data.get_byte == 1
30
-
18
+ @game_ip = @content_data.string
19
+ @server_name = @content_data.string
20
+ @map_name = @content_data.string
21
+ @game_directory = @content_data.string
22
+ @game_description = @content_data.string
23
+ @number_of_players = @content_data.byte
24
+ @max_players = @content_data.byte
25
+ @network_version = @content_data.byte
26
+ @dedicated = @content_data.byte.chr
27
+ @operating_system = @content_data.byte.chr
28
+ @password_needed = @content_data.byte == 1
29
+ @is_mod = @content_data.byte == 1
30
+
31
31
  if @is_mod
32
- @mod_info = Hash.new
33
- @mod_info["url_info"] = @content_data.get_string
34
- @mod_info["url_dl"] = @content_data.get_string
35
- @content_data.get_byte
32
+ @mod_info = {}
33
+ @mod_info['url_info'] = @content_data.string
34
+ @mod_info['url_dl'] = @content_data.string
35
+ @content_data.byte
36
36
  if @content_data.remaining == 12
37
- @mod_info["mod_version"] = @content_data.get_long
38
- @mod_info["mod_size"] = @content_data.get_long
39
- @mod_info["sv_only"] = @content_data.get_byte == 1
40
- @mod_info["cl_dll"] = @content_data.get_byte == 1
41
- @secure = @content_data.get_byte == 1
42
- @number_of_bots = @content_data.get_byte
37
+ @mod_info['mod_version'] = @content_data.long
38
+ @mod_info['mod_size'] = @content_data.long
39
+ @mod_info['sv_only'] = @content_data.byte == 1
40
+ @mod_info['cl_dll'] = @content_data.byte == 1
41
+ @secure = @content_data.byte == 1
42
+ @number_of_bots = @content_data.byte
43
43
  end
44
44
  else
45
- @secure = @content_data.get_byte == 1
46
- @number_of_bots = @content_data.get_byte
45
+ @secure = @content_data.byte == 1
46
+ @number_of_bots = @content_data.byte
47
47
  end
48
+
49
+ generate_info_hash
48
50
  end
49
-
51
+
50
52
  end
@@ -1,30 +1,28 @@
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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
- require "steam/packets/steam_packet"
6
+ require 'steam/packets/steam_packet'
7
7
 
8
8
  # The S2A_PLAYER_Packet class represents the response to a A2S_PLAYER
9
9
  # request send to the server.
10
10
  class S2A_PLAYER_Packet < SteamPacket
11
11
 
12
12
  attr_reader :player_hash
13
-
13
+
14
14
  # Creates a S2A_PLAYER response object based on the data received.
15
15
  def initialize(content_data)
16
- if content_data == nil
17
- raise Exception.new("Wrong formatted S2A_PLAYER packet.")
18
- end
19
-
16
+ raise Exception.new('Wrong formatted S2A_PLAYER packet.') if content_data.nil?
17
+
20
18
  super SteamPacket::S2A_PLAYER_HEADER, content_data
21
19
 
22
20
  # Ignore player count
23
- @content_data.get_byte
21
+ @content_data.byte
24
22
  @player_hash = {}
25
23
 
26
24
  while @content_data.remaining > 0
27
- player_data = @content_data.get_byte, @content_data.get_string, @content_data.get_signed_long, @content_data.get_float
25
+ player_data = @content_data.byte, @content_data.string, @content_data.signed_long, @content_data.float
28
26
  @player_hash[player_data[1]] = SteamPlayer.new(*player_data[0..3])
29
27
  end
30
28
  end
@@ -1,29 +1,29 @@
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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
- require "steam/packets/steam_packet"
6
+ require 'steam/packets/steam_packet'
7
7
 
8
8
  # The S2A_RULES_Packet class represents the response to a A2S_RULES
9
9
  # request send to the server.
10
10
  class S2A_RULES_Packet < SteamPacket
11
11
 
12
+ attr_reader :rules_hash
13
+
12
14
  # Creates a S2A_RULES response object based on the data received.
13
15
  def initialize(content_data)
14
- if content_data == nil
15
- raise Exception.new("Wrong formatted A2A_RULES response packet.")
16
- end
16
+ raise Exception.new('Wrong formatted A2A_RULES response packet.') if content_data.nil?
17
17
 
18
18
  super SteamPacket::S2A_RULES_HEADER, content_data
19
19
 
20
- rules_count = @content_data.get_short
20
+ rules_count = @content_data.short
21
21
 
22
22
  @rules_hash = {}
23
23
 
24
24
  rules_count.times do
25
- rule = @content_data.get_string
26
- value = @content_data.get_string
25
+ rule = @content_data.string
26
+ value = @content_data.string
27
27
 
28
28
  # This is a workaround for servers sending corrupt replies
29
29
  break if rule.empty? or value.empty?
@@ -32,8 +32,4 @@ class S2A_RULES_Packet < SteamPacket
32
32
  end
33
33
  end
34
34
 
35
- # Returns the hash containing the server rules
36
- def get_rules_hash
37
- return @rules_hash
38
- end
39
35
  end
@@ -1,21 +1,22 @@
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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
- require "steam/packets/steam_packet"
6
+ require 'steam/packets/steam_packet'
7
7
 
8
8
  # The S2C_CHALLENGE_Packet class represents the response
9
9
  # to a A2S_SERVERQUERY_GETCHALLENGE request send to the server.
10
10
  class S2C_CHALLENGE_Packet < SteamPacket
11
-
11
+
12
12
  # Creates a AS2C_CHALLENGE response object based on the data received.
13
13
  def initialize(challenge_number)
14
14
  super S2C_CHALLENGE_HEADER, challenge_number
15
15
  end
16
-
16
+
17
17
  # Returns the challenge number received from the server
18
- def get_challenge_number
19
- return @content_data.rewind.get_long
18
+ def challenge_number
19
+ @content_data.rewind
20
+ @content_data.long
20
21
  end
21
22
  end
@@ -3,6 +3,8 @@
3
3
  #
4
4
  # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
+ require 'stringio_additions'
7
+
6
8
  # This class represents a packet used by the Source query protocol
7
9
  class SteamPacket
8
10
 
@@ -25,15 +27,14 @@ class SteamPacket
25
27
  S2C_CHALLENGE_HEADER = 0x41
26
28
 
27
29
  # Creates a new SteamPacket object with given header and content data
28
- def initialize(header_data, content_data = "")
29
- @content_data = ByteBuffer.new content_data
30
- @header_data = header_data
30
+ def initialize(header_data, content_data = '')
31
+ @content_data = StringIO.new content_data.to_s
32
+ @header_data = header_data
31
33
  end
32
34
 
33
35
  # Returns a packed string representing the packet's data
34
36
  def to_s
35
- packet_data = [0xFF, 0xFF, 0xFF, 0xFF].pack("cccc")
36
-
37
- return packet_data << [@header_data, @content_data.array].pack("ca*")
37
+ [0xFF, 0xFF, 0xFF, 0xFF, @header_data, @content_data.data].pack('c5a*')
38
38
  end
39
+
39
40
  end
@@ -1,40 +1,41 @@
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-2009, Sebastian Staudt
4
+ # Copyright (c) 2008-2010, Sebastian Staudt
5
5
 
6
6
  require 'zlib'
7
7
 
8
- require "abstract_class"
9
- require "steam/packets/s2a_info_detailed_packet"
10
- require "steam/packets/a2s_info_packet"
11
- require "steam/packets/s2a_info2_packet"
12
- require "steam/packets/a2a_ping_packet"
13
- require "steam/packets/a2a_ack_packet"
14
- require "steam/packets/a2s_player_packet"
15
- require "steam/packets/s2a_player_packet"
16
- require "steam/packets/a2s_rules_packet"
17
- require "steam/packets/s2a_rules_packet"
18
- require "steam/packets/a2s_serverquery_getchallenge_packet"
19
- require "steam/packets/s2c_challenge_packet"
20
- require "steam/packets/a2m_get_servers_batch2_packet"
21
- require "steam/packets/m2a_server_batch_packet"
22
- require "steam/packets/rcon/rcon_goldsrc_response"
8
+ require 'abstract_class'
9
+ require 'exceptions/steam_condenser_exception'
10
+ require 'steam/packets/s2a_info_detailed_packet'
11
+ require 'steam/packets/a2s_info_packet'
12
+ require 'steam/packets/s2a_info2_packet'
13
+ require 'steam/packets/a2a_ping_packet'
14
+ require 'steam/packets/a2a_ack_packet'
15
+ require 'steam/packets/a2s_player_packet'
16
+ require 'steam/packets/s2a_player_packet'
17
+ require 'steam/packets/a2s_rules_packet'
18
+ require 'steam/packets/s2a_rules_packet'
19
+ require 'steam/packets/a2s_serverquery_getchallenge_packet'
20
+ require 'steam/packets/s2c_challenge_packet'
21
+ require 'steam/packets/a2m_get_servers_batch2_packet'
22
+ require 'steam/packets/m2a_server_batch_packet'
23
+ require 'steam/packets/rcon/rcon_goldsrc_response'
23
24
 
24
25
  class SteamPacketFactory
25
-
26
+
26
27
  include AbstractClass
27
-
28
+
28
29
  # Creates a new packet object based on the header byte of the given raw data
29
- def self.get_packet_from_data(raw_data)
30
- header = raw_data[0].to_i;
31
- data = raw_data[1..-1];
32
-
30
+ def self.packet_from_data(raw_data)
31
+ header = raw_data[0].to_i
32
+ data = raw_data[1..-1]
33
+
33
34
  case header
34
35
  when SteamPacket::S2A_INFO_DETAILED_HEADER
35
36
  return S2A_INFO_DETAILED_Packet.new(data)
36
37
  when SteamPacket::A2S_INFO_HEADER
37
- return A2S_INFO_Packet.new;
38
+ return A2S_INFO_Packet.new
38
39
  when SteamPacket::S2A_INFO2_HEADER
39
40
  return S2A_INFO2_Packet.new(data)
40
41
  when SteamPacket::A2A_PING_HEADER
@@ -54,7 +55,7 @@ class SteamPacketFactory
54
55
  when SteamPacket::S2C_CHALLENGE_HEADER
55
56
  return S2C_CHALLENGE_Packet.new(data)
56
57
  when SteamPacket::A2M_GET_SERVERS_BATCH2_HEADER
57
- return A2M_GET_SERVERS_BATCH2.new(data)
58
+ return A2M_GET_SERVERS_BATCH2_Packet.new(data)
58
59
  when SteamPacket::M2A_SERVER_BATCH_HEADER
59
60
  return M2A_SERVER_BATCH_Packet.new(data)
60
61
  when SteamPacket::RCON_GOLDSRC_CHALLENGE_HEADER,
@@ -62,29 +63,27 @@ class SteamPacketFactory
62
63
  SteamPacket::RCON_GOLDSRC_RESPONSE_HEADER
63
64
  return RCONGoldSrcResponse.new(data)
64
65
  else
65
- raise Exception.new("Unknown packet with header 0x#{header.to_s 16} received.")
66
+ raise SteamCondenserException.new("Unknown packet with header 0x#{header.to_s(16)} received.")
66
67
  end
67
68
  end
68
-
69
+
69
70
  def self.reassemble_packet(split_packets, is_compressed = false, packet_checksum = 0)
70
- packet_data = split_packets.join ""
71
-
71
+ packet_data = split_packets.join ''
72
+
72
73
  if is_compressed
73
74
  begin
74
75
  require 'bz2'
75
76
  packet_data = BZ2.uncompress(packet_data)
76
77
  rescue LoadError
77
- raise SteamCondenserException.new("You need to install the libbzip2 interface for Ruby.")
78
+ raise SteamCondenserException.new('You need to install the libbzip2 interface for Ruby.')
78
79
  end
79
-
80
- if Zlib.crc32(packet_data) != packet_checksum
81
- raise PacketFormatException.new("CRC32 checksum mismatch of uncompressed packet data.")
80
+
81
+ unless Zlib.crc32(packet_data) == packet_checksum
82
+ raise PacketFormatException.new('CRC32 checksum mismatch of uncompressed packet data.')
82
83
  end
83
84
  end
84
-
85
- packet_data = packet_data[4..-1]
86
-
87
- return self.get_packet_from_data(packet_data)
85
+
86
+ packet_from_data packet_data[4..-1]
88
87
  end
89
-
90
- end
88
+
89
+ end