#!/usr/bin/ruby

# Use irb if you want to see what's getting stored in which objects.

require 'steam/servers/goldsrc_server'
require 'steam/servers/master_server'

# You'll probably want some dependencies
#   sudo apt-get install libbz2-dev gem2deb
#   gem2deb bzip2-ruby
#   gem2deb steam-condenser
#   sudo dpkg -i steam-condenser*.deb *bzip2*.deb

goldsrcservers = Array.new # Defined here so it has global scope

[ # List taken from Steam/config/MasterServer2.vdf
  ["69.28.158.131", "27011"],
  ["69.28.158.131", "27012"],
  ["208.64.200.117", "27011"],
  ["208.64.200.118", "27011"]
].shuffle.each do |goldsrcmasterserver|
  begin   # begin/rescue/end is used for handling exceptions such as a response timeout.
    goldsrcservers = MasterServer.new(*goldsrcmasterserver).servers(MasterServer::REGION_ALL, "\\gamedir\\action")
          # see http://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol for more info on query strings
    break # If we get to this line, it means we didn't hit any exceptions and may as well break the loop and live with the response we got.
  rescue
    next  # If we get to this line, it means we hit an exception and need to try again on the next goldsrcmasterserver.
  end
end

if goldsrcservers.empty? then
  print "No servers! :(\n"
  exit 2;
end

width = `stty size`.split[1].to_i
if width < 60 then
  width = 60 # people with terminals this small are freaks we don't care about supporting
end
namesize = width - 16 - 6 - 3 - 3 - 19

goldsrcservers.each do |goldsrcserver|
  goldsrcserverhandle = GoldSrcServer.new(*goldsrcserver)
  begin
  if info = goldsrcserverhandle.server_info then
    printf("%-15s %-5d %2d/%-2d %-18.18s %-.#{namesize}s\n",
           goldsrcserver[0],
           info[:server_port], # may differ from server[1] (udp vs. tcp)
           info[:number_of_players],
           info[:max_players],
           info[:map_name],
           info[:server_name]
    )
    if info[:number_of_players] > 0 && players = goldsrcserverhandle.players then
      players.keys.each do |player|
        printf("%3d %s\n", players[player].score, player)
      end
    end
    # goldsrcserverhandle.rules is also available for specific server configuration variables
  end
  rescue
    print goldsrcserver, " failed for some reason.\n"
    next
  end
end
