class Q2ServerQuery::Client

Attributes

address[RW]
parsed_response[R]
players_list[R]
port[RW]
raw_response[R]
socket[R]

Public Class Methods

new(address, port) click to toggle source
# File lib/q2_server_query/client.rb, line 9
def initialize(address, port)
  @socket   = UDPSocket.new
  @timeout  = 2
  @address  = address
  @port     = port
  @msg      = "\xff\xff\xff\xffstatus\x00"
end

Public Instance Methods

status() click to toggle source
# File lib/q2_server_query/client.rb, line 17
def status
  response = status_query
  return nil if response.nil?

  @parsed_response = response.first.split("\\")
  response_header  = @parsed_response.shift[4..8]

  return if response_header != "print"

  build_status(@parsed_response)
end

Private Instance Methods

build_players(players) click to toggle source
# File lib/q2_server_query/client.rb, line 54
def build_players(players)
  list = []
  players.each do |player|
    player_info = player.split(" ")
    h = {
      frags: player_info.shift,
      ping:  player_info.shift,
      name:  player_info.shift.delete('\\"')
    }

    list.push h
  end

  list
end
build_status(unparsed_info) click to toggle source
# File lib/q2_server_query/client.rb, line 31
def build_status(unparsed_info)
  basic_info       = {}
  unparsed_players = nil

  loop do
    key   = unparsed_info.shift
    value = unparsed_info.shift

    if value.include? "\n"
      unparsed_players = value.split("\n")
      value            = unparsed_players.delete_at(0)
      basic_info[key]  = value
      break
    else
      basic_info[key] = value
    end
  end

  @players_list = build_players(unparsed_players)

  basic_info.merge(players: @players_list).with_indifferent_access
end
status_query() click to toggle source
# File lib/q2_server_query/client.rb, line 70
def status_query
  begin
    @raw_response = nil
    socket.send(@msg, 0, address, port)

    Timeout.timeout(@timeout) do
      @raw_response = socket.recvfrom(1000)
    end

    socket.close
  rescue => e
    puts "-- Error with server #{address}:#{port}. Reason: #{e}"
  ensure
    return @raw_response
  end
end