Skip to content

Instantly share code, notes, and snippets.

@kevinthompson
Created January 21, 2015 07:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevinthompson/695d2cea49435994e485 to your computer and use it in GitHub Desktop.
Save kevinthompson/695d2cea49435994e485 to your computer and use it in GitHub Desktop.
Monitor H1Z1 Servers
require 'open-uri'
require 'json'
##
# Add underscore method to string for simple JSON
# key manipulation.
class String
def underscore
self.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
end
class Game
attr_reader :name, :servers
def initialize(name, servers)
@name = name
@servers = servers.map do |server_name, data|
Server.new(server_name, data)
end
end
end
class Server
attr_reader :name, :state
def initialize(name, data)
@name = name
data.each do |key, value|
instance_variable_set("@#{key.underscore}", value)
end
end
def to_s
"[#{name}] State: #{state.capitalize}"
end
end
##
# Fetch and parse JSON
url = 'https://census.soe.com/get/lp/status.worlds/?c:limit=1000&c:tree=title,name&c:hide=id,lastReported,reason,region,lastReportedTime,game,regionName'
while(true) do
raw = open(url){ |page| page.read }
json = JSON.parse(raw)
games = json['status.worlds_list'][0].map do |name, servers|
Game.new(name, servers)
end
h1z1 = games.find{ |game| game.name == 'H1Z1' }
servers_online = h1z1.servers.select{ |server| server.state != 'down' }
noun = servers_online.size == 1 ? 'server' : 'servers'
`say There's currently #{servers_online.size} server online`
sleep 30
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment