@@ -8,19 +8,30 @@ module Proto
8
8
#
9
9
##
10
10
module Steam
11
+ # The Steam header ussed when the message is fragmented.
11
12
FRAGMENTED_HEADER = 0xFFFFFFFE
13
+ # The Steam header ussed when the message is not fragmented.
12
14
UNFRAGMENTED_HEADER = 0xFFFFFFFF
13
15
16
+ # Decodes a Steam response message.
17
+ #
18
+ # @param message [String] the message to decode
19
+ # @return [Array] the message type and body
14
20
def decode_message ( message )
15
21
# minimum size is header (4) + type (1)
16
22
return if message . length < 5
17
23
header , type = message . unpack ( 'NC' )
18
24
# TODO: handle fragmented responses
19
25
return if header != UNFRAGMENTED_HEADER
20
- [ header , type , message [ 5 , message . length ] ]
26
+ [ type , message [ 5 , message . length ] ]
21
27
end
22
28
23
- def encode_message ( type , payload )
29
+ # Encodes a Steam message.
30
+ #
31
+ # @param type [String, Fixnum] the message type
32
+ # @param body [String] the message body
33
+ # @return [String] the encoded Steam message
34
+ def encode_message ( type , body )
24
35
if type . is_a? Fixnum
25
36
type_num = type
26
37
elsif type . is_a? String
@@ -29,23 +40,30 @@ def encode_message(type, payload)
29
40
fail ArgumentError , 'type must be a String or Fixnum'
30
41
end
31
42
32
- [ UNFRAGMENTED_HEADER , type_num ] . pack ( 'NC' ) + payload
43
+ [ UNFRAGMENTED_HEADER , type_num ] . pack ( 'NC' ) + body
33
44
end
34
45
46
+ # Builds an A2S_INFO message
47
+ #
48
+ # @return [String] the A2S_INFO message
35
49
def a2s_info
36
50
encode_message ( 'T' , "Source Engine Query\x00 " )
37
51
end
38
52
39
- def a2s_info_decode ( message )
53
+ # Decodes an A2S_INFO response message
54
+ #
55
+ # @parameter response [String] the A2S_INFO resposne to decode
56
+ # @return [Hash] the fields extracted from the response
57
+ def a2s_info_decode ( response )
40
58
# abort if it is impossibly short
41
- return nil if message . length < 19
42
- _header , message_type , payload = decode_message ( message )
59
+ return nil if response . length < 19
60
+ message_type , body = decode_message ( response )
43
61
# abort if it isn't a valid Steam response
44
62
return nil if message_type != 0x49 # 'I'
45
63
info = { }
46
64
info [ :version ] , info [ :name ] , info [ :map ] , info [ :folder ] , info [ :game_name ] ,
47
65
info [ :game_id ] , players , players_max , info [ :bots ] ,
48
- type , env , vis , vac , info [ :game_version ] , _edf = payload . unpack ( "CZ*Z*Z*Z*SCCCCCCCZ*C" )
66
+ type , env , vis , vac , info [ :game_version ] , _edf = body . unpack ( "CZ*Z*Z*Z*SCCCCCCCZ*C" )
49
67
50
68
# translate type
51
69
case type
0 commit comments