Created
September 25, 2010 10:31
-
-
Save kimoto/596715 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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