Class: GoldSrcSocket
- Inherits:
-
Object
- Object
- GoldSrcSocket
- Includes:
- SteamSocket
- Defined in:
- lib/steam/sockets/goldsrc_socket.rb
Overview
This class represents a socket used to communicate with game servers based on the GoldSrc engine (e.g. Half-Life, Counter-Strike)
Instance Method Summary collapse
-
#initialize(ipaddress, port_number = 27015, is_hltv = false) ⇒ GoldSrcSocket
constructor
Creates a new socket to communicate with the server on the given IP address and port.
-
#rcon_challenge ⇒ Object
Requests a challenge number from the server to be used for further requests.
-
#rcon_exec(password, command) ⇒ RCONGoldSrcResponse
Executes the given command on the server via RCON.
-
#rcon_send(command) ⇒ Object
Wraps the given command in a RCON request packet and send it to the server.
-
#reply ⇒ SteamPacket
Reads a packet from the socket.
Methods included from SteamSocket
#close, #receive_packet, #send, timeout=
Constructor Details
#initialize(ipaddress, port_number = 27015, is_hltv = false) ⇒ GoldSrcSocket
Creates a new socket to communicate with the server on the given IP address and port
31 32 33 34 35 |
# File 'lib/steam/sockets/goldsrc_socket.rb', line 31 def initialize(ipaddress, port_number = 27015, is_hltv = false) super ipaddress, port_number @is_hltv = is_hltv end |
Instance Method Details
#rcon_challenge ⇒ Object
Requests a challenge number from the server to be used for further requests
125 126 127 128 129 130 131 132 133 134 |
# File 'lib/steam/sockets/goldsrc_socket.rb', line 125 def rcon_challenge rcon_send 'challenge rcon' response = reply.response.strip if response.strip == 'You have been banned from this server.' raise RCONBanError end @rcon_challenge = response[14..-1] end |
#rcon_exec(password, command) ⇒ RCONGoldSrcResponse
Executes the given command on the server via RCON
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/steam/sockets/goldsrc_socket.rb', line 90 def rcon_exec(password, command) rcon_challenge if @rcon_challenge.nil? || @is_hltv rcon_send "rcon #@rcon_challenge #{password} #{command}" if @is_hltv begin response = reply.response rescue SteamCondenser::TimeoutError response = '' end else response = reply.response end if response.strip == 'Bad rcon_password.' raise RCONNoAuthError elsif response.strip == 'You have been banned from this server.' raise RCONBanError end rcon_send "rcon #@rcon_challenge #{password}" begin response_part = reply.response response << response_part end while response_part.size > 0 response end |
#rcon_send(command) ⇒ Object
Wraps the given command in a RCON request packet and send it to the server
139 140 141 |
# File 'lib/steam/sockets/goldsrc_socket.rb', line 139 def rcon_send(command) send RCONGoldSrcRequest.new(command) end |
#reply ⇒ SteamPacket
Reads a packet from the socket
The Source query protocol specifies a maximum packet size of 1,400 bytes. Bigger packets will be split over several UDP packets. This method reassembles split packets into single packet objects.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/steam/sockets/goldsrc_socket.rb', line 44 def reply receive_packet 1400 if @buffer.long == 0xFFFFFFFE split_packets = [] begin request_id = @buffer.long packet_number_and_count = @buffer.byte packet_count = packet_number_and_count & 0xF packet_number = (packet_number_and_count >> 4) + 1 split_packets[packet_number - 1] = @buffer.get puts "Received packet #{packet_number} of #{packet_count} for request ##{request_id}" if $DEBUG if split_packets.size < packet_count begin bytes_read = receive_packet rescue SteamCondenser::TimeoutError bytes_read = 0 end else bytes_read = 0 end end while bytes_read > 0 && @buffer.long == 0xFFFFFFFE packet = SteamPacketFactory.reassemble_packet(split_packets) else packet = SteamPacketFactory.packet_from_data(@buffer.get) end puts "Got reply of type \"#{packet.class.to_s}\"." if $DEBUG packet end |