Guest User

Untitled

a guest
Feb 12th, 2012
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. require 'qstat_parse'
  2.  
  3. def read_server_list(filepath)
  4. buf=File.readlines(filepath)
  5.  
  6. # STM以降の行のみを対象とする
  7. lines = []
  8. flag = false
  9. buf.each{ |line|
  10. if flag
  11. lines << line
  12. end
  13.  
  14. if line =~ /^STM/
  15. flag = true
  16. end
  17. }
  18.  
  19. servers = []
  20.  
  21. server = []
  22. server << lines.shift()
  23. lines.each do |line|
  24. if line =~ /^\t/
  25. server << line
  26. elsif line =~ /^A2S/
  27. servers << server
  28. server = [line]
  29. end
  30. end
  31.  
  32. info_list = []
  33. servers.each do |server|
  34. info = Hash.new
  35.  
  36. header = server.first
  37. players = server[1..-1]
  38.  
  39. if header =~ /^(\S+)\s+(\S+)\s+(\d+\s*\/\s*\d+)\s*(\S+)\s*(\S+\s*\/\s*\S+)\s*(\S+)\s*(.*)$/
  40. info[:a2s] = $1
  41. info[:ip_port] = $2
  42. info[:number_of_players] = $3
  43. info[:map] = $4
  44. info[:imihu] = $5
  45. info[:game] = $6
  46. info[:server] = $7
  47. else
  48. if header =~ /^(\S+)\s+(.*) no response$/ # server name only
  49. info[:a2s] = $1
  50. info[:ip_port] = $2
  51. else
  52. raise "format error: #{header}"
  53. end
  54. end
  55.  
  56. info[:players] = []
  57.  
  58. players.each{ |player|
  59. if player =~ /^\s+(\S+)\s+(\S+)\s+(.*?s)\s+(.*)$/
  60. pl = Hash.new
  61. pl[:frags] = $1
  62. pl[:time] = $3
  63. pl[:name] = $4
  64.  
  65. info[:players] << pl
  66. else
  67. raise "format error: #{player.inspect}"
  68. end
  69. }
  70.  
  71. info_list << info
  72. end
  73.  
  74. info_list
  75. end
  76.  
  77. def find_by_player_name(list, name)
  78. list.each{ |item|
  79. item[:players].each{ |player|
  80. player_name = player[:name] ? player[:name] : ""
  81. player_name2 = name ? name : ""
  82.  
  83. if player_name.upcase == player_name2.upcase
  84. return item
  85. end
  86. }
  87. }
  88. return nil
  89. end
  90.  
  91. def find_empty_player_slot(list)
  92. list.each{ |item|
  93. if item[:players].empty?
  94. return item
  95. end
  96. }
  97. return nil
  98. end
  99.  
  100. def get_players(list)
  101. list.each{ |item|
  102. p item[:players].map{ |r|
  103. unless r[:name] && r[:name].empty?
  104. p r[:name]
  105. end
  106. }.uniq
  107. }
  108. end
  109.  
  110. def recommend_server?(server_name)
  111. recommend_regexp = [
  112. /^\[JP\] skull's Left4Dead2 Server PUBLIC/i,
  113. /^dd2n\.com.*/i,
  114. /^L4D2JPN\s+DEDICATED\s+SERVER/i,
  115. /^\[JP\] FiveSeven.*confogl/i
  116. # /Rino Server/i
  117. ]
  118.  
  119. recommend_regexp.each{ |regexp|
  120. if server_name =~ regexp
  121. return true
  122. end
  123. }
  124. return false
  125. end
  126.  
  127. def find_empty_server(list)
  128. servers = []
  129. list.each{ |item|
  130. if recommend_server?(item[:server]) and item[:players].empty? and item[:number_of_players].gsub(" ","") =~ /^0\//
  131. servers << item
  132. end
  133. }
  134. servers
  135. end
  136.  
  137. def find_player_server(list, search_player)
  138. servers = []
  139. list.each do |item|
  140. players = item[:players].map{|r| r[:name]}
  141. players.each do |r|
  142. if search_player.toutf8.downcase == r.toutf8.downcase
  143. servers << item
  144. break
  145. end
  146. end
  147. end
  148. servers
  149. end
Advertisement
Add Comment
Please, Sign In to add comment