Skip to content

Instantly share code, notes, and snippets.

@reitermarkus
Created March 27, 2017 00:19
Show Gist options
  • Select an option

  • Save reitermarkus/5ab617999b7deeed6e65028cee6047d1 to your computer and use it in GitHub Desktop.

Select an option

Save reitermarkus/5ab617999b7deeed6e65028cee6047d1 to your computer and use it in GitHub Desktop.

Revisions

  1. reitermarkus created this gist Mar 27, 2017.
    24 changes: 24 additions & 0 deletions cod4.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    #!/usr/bin/env ruby
    #
    # Fetch CoD 4 server info and generate nice JSON output.
    #
    # Usage:
    # `$0 0.0.0.0:00000`

    require 'json'
    require 'socket'

    def get_server_info(host, port)
    server_info, *players = UDPSocket.new.tap {
    |s| s.send("\xFF\xFF\xFF\xFFgetstatus", 0, host, port)
    }.recvfrom(1 << 16).first.chomp.gsub(/\^(\d)/, '').split("\n")[1..-1]

    Hash[server_info.split("\\")[1..-1].each_slice(2).to_a].tap { |h|
    h["players"] = players.map { |p|
    /(?<score>\d+) (?<ping>\d+) \"(?<name>.*)\"/ =~ p
    {"score" => score, "ping" => ping, "name" => name }
    }
    }
    end

    print JSON.pretty_generate(get_server_info(*ARGV.first.split(":")))