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.
- data/LICENSE +25 -0
- data/README.md +30 -0
- data/Rakefile +42 -0
- data/lib/abstract_class.rb +40 -0
- data/lib/byte_buffer.rb +126 -0
- data/lib/datagram_channel.rb +70 -0
- data/lib/exceptions/buffer_underflow_exception.rb +10 -0
- data/lib/exceptions/packet_format_exception.rb +12 -0
- data/lib/exceptions/rcon_no_auth_exception.rb +14 -0
- data/lib/exceptions/steam_condenser_exception.rb +8 -0
- data/lib/exceptions/timeout_exception.rb +10 -0
- data/lib/socket_channel.rb +54 -0
- data/lib/steam-condenser.rb +3 -0
- data/lib/steam/community/dods/dods_class.rb +32 -0
- data/lib/steam/community/dods/dods_stats.rb +47 -0
- data/lib/steam/community/dods/dods_weapon.rb +54 -0
- data/lib/steam/community/game_achievement.rb +26 -0
- data/lib/steam/community/game_class.rb +15 -0
- data/lib/steam/community/game_stats.rb +92 -0
- data/lib/steam/community/game_weapon.rb +29 -0
- data/lib/steam/community/l4d/l4d_explosive.rb +23 -0
- data/lib/steam/community/l4d/l4d_map.rb +34 -0
- data/lib/steam/community/l4d/l4d_stats.rb +166 -0
- data/lib/steam/community/l4d/l4d_weapon.rb +23 -0
- data/lib/steam/community/steam_group.rb +16 -0
- data/lib/steam/community/steam_id.rb +212 -0
- data/lib/steam/community/tf2/tf2_class.rb +31 -0
- data/lib/steam/community/tf2/tf2_class_factory.rb +38 -0
- data/lib/steam/community/tf2/tf2_engineer.rb +25 -0
- data/lib/steam/community/tf2/tf2_medic.rb +22 -0
- data/lib/steam/community/tf2/tf2_sniper.rb +20 -0
- data/lib/steam/community/tf2/tf2_spy.rb +23 -0
- data/lib/steam/community/tf2/tf2_stats.rb +39 -0
- data/lib/steam/packets/a2a_ack_packet.rb +21 -0
- data/lib/steam/packets/a2a_ping_packet.rb +18 -0
- data/lib/steam/packets/a2m_get_servers_batch2_packet.rb +25 -0
- data/lib/steam/packets/a2s_info_packet.rb +18 -0
- data/lib/steam/packets/a2s_player_packet.rb +22 -0
- data/lib/steam/packets/a2s_rules_packet.rb +21 -0
- data/lib/steam/packets/a2s_serverquery_getchallenge_packet.rb +18 -0
- data/lib/steam/packets/m2a_server_batch_packet.rb +37 -0
- data/lib/steam/packets/rcon/rcon_auth_request.rb +16 -0
- data/lib/steam/packets/rcon/rcon_auth_response.rb +16 -0
- data/lib/steam/packets/rcon/rcon_exec_request.rb +16 -0
- data/lib/steam/packets/rcon/rcon_exec_response.rb +20 -0
- data/lib/steam/packets/rcon/rcon_goldsrc_request.rb +20 -0
- data/lib/steam/packets/rcon/rcon_goldsrc_response.rb +20 -0
- data/lib/steam/packets/rcon/rcon_packet.rb +36 -0
- data/lib/steam/packets/rcon/rcon_packet_factory.rb +37 -0
- data/lib/steam/packets/request_with_challenge.rb +16 -0
- data/lib/steam/packets/s2a_info2_packet.rb +48 -0
- data/lib/steam/packets/s2a_info_base_packet.rb +29 -0
- data/lib/steam/packets/s2a_info_detailed_packet.rb +50 -0
- data/lib/steam/packets/s2a_player_packet.rb +32 -0
- data/lib/steam/packets/s2a_rules_packet.rb +33 -0
- data/lib/steam/packets/s2c_challenge_packet.rb +23 -0
- data/lib/steam/packets/steam_packet.rb +48 -0
- data/lib/steam/packets/steam_packet_factory.rb +90 -0
- data/lib/steam/servers/game_server.rb +222 -0
- data/lib/steam/servers/goldsrc_server.rb +36 -0
- data/lib/steam/servers/master_server.rb +60 -0
- data/lib/steam/servers/source_server.rb +65 -0
- data/lib/steam/sockets/goldsrc_socket.rb +108 -0
- data/lib/steam/sockets/master_server_socket.rb +20 -0
- data/lib/steam/sockets/rcon_socket.rb +50 -0
- data/lib/steam/sockets/source_socket.rb +72 -0
- data/lib/steam/sockets/steam_socket.rb +63 -0
- data/lib/steam/steam_player.rb +51 -0
- data/test/query_tests.rb +71 -0
- data/test/rcon_tests.rb +79 -0
- data/test/steam_community_tests.rb +36 -0
- 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
|