Skip to content

Instantly share code, notes, and snippets.

@kimoto
Created September 25, 2010 10:31
Show Gist options
  • Select an option

  • Save kimoto/596715 to your computer and use it in GitHub Desktop.

Select an option

Save kimoto/596715 to your computer and use it in GitHub Desktop.
require 'qstat_parse'
def read_server_list(filepath)
buf=File.readlines(filepath)
# STM以降の行のみを対象とする
lines = []
flag = false
buf.each{ |line|
if flag
lines << line
end
if line =~ /^STM/
flag = true
end
}
servers = []
server = []
server << lines.shift()
lines.each do |line|
if line =~ /^\t/
server << line
elsif line =~ /^A2S/
servers << server
server = [line]
end
end
info_list = []
servers.each do |server|
info = Hash.new
header = server.first
players = server[1..-1]
if header =~ /^(\S+)\s+(\S+)\s+(\d+\s*\/\s*\d+)\s*(\S+)\s*(\S+\s*\/\s*\S+)\s*(\S+)\s*(.*)$/
info[:a2s] = $1
info[:ip_port] = $2
info[:number_of_players] = $3
info[:map] = $4
info[:imihu] = $5
info[:game] = $6
info[:server] = $7
else
if header =~ /^(\S+)\s+(.*) no response$/ # server name only
info[:a2s] = $1
info[:ip_port] = $2
else
raise "format error: #{header}"
end
end
info[:players] = []
players.each{ |player|
if player =~ /^\s+(\S+)\s+(\S+)\s+(.*?s)\s+(.*)$/
pl = Hash.new
pl[:frags] = $1
pl[:time] = $3
pl[:name] = $4
info[:players] << pl
else
raise "format error: #{player.inspect}"
end
}
info_list << info
end
info_list
end
def find_by_player_name(list, name)
list.each{ |item|
item[:players].each{ |player|
player_name = player[:name] ? player[:name] : ""
player_name2 = name ? name : ""
if player_name.upcase == player_name2.upcase
return item
end
}
}
return nil
end
def find_empty_player_slot(list)
list.each{ |item|
if item[:players].empty?
return item
end
}
return nil
end
def get_players(list)
list.each{ |item|
p item[:players].map{ |r|
unless r[:name] && r[:name].empty?
p r[:name]
end
}.uniq
}
end
def recommend_server?(server_name)
recommend_regexp = [
/^\[JP\] skull's Left4Dead2 Server PUBLIC/i,
/^dd2n\.com.*/i,
/^L4D2JPN\s+DEDICATED\s+SERVER/i,
/^\[JP\] FiveSeven.*confogl/i
# /Rino Server/i
]
recommend_regexp.each{ |regexp|
if server_name =~ regexp
return true
end
}
return false
end
def find_empty_server(list)
servers = []
list.each{ |item|
if recommend_server?(item[:server]) and item[:players].empty? and item[:number_of_players].gsub(" ","") =~ /^0\//
servers << item
end
}
servers
end
def find_player_server(list, search_player)
servers = []
list.each do |item|
players = item[:players].map{|r| r[:name]}
players.each do |r|
if search_player.toutf8.downcase == r.toutf8.downcase
servers << item
break
end
end
end
servers
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment