Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Advertisement
Add Comment
Please, Sign In to add comment