OSDN Git Service

Run shogi-server as a service, specifying a log output directory
[shogi-server/shogi-server.git] / utils / csa-filter.rb
index a87e44f..deadf21 100755 (executable)
@@ -5,7 +5,7 @@
 # you will see such files under the some_dir directory.
 #
 # Author::    Daigo Moriwaki <daigo at debian dot org>
-# Copyright:: Copyright (C) 2006-2008  Daigo Moriwaki <daigo at debian dot org>
+# Copyright:: Copyright (C) 2006-2017 Daigo Moriwaki <daigo at debian dot org>
 #
 # $Id$
 #
@@ -28,6 +28,7 @@
 require 'time'
 require 'pathname'
 require 'getoptlong'
+require 'nkf'
 
 class CsaFileReader
   WIN_MARK  = "win"
@@ -35,24 +36,29 @@ class CsaFileReader
   DRAW_MARK = "draw"
 
   attr_reader :file_name
+  attr_reader :str
   attr_reader :black_name, :white_name
   attr_reader :black_id, :white_id
   attr_reader :winner, :loser
+  attr_reader :state
   attr_reader :start_time, :end_time
+  attr_reader :ply
 
-  def initialize(file_name)
+  def initialize(file_name, encoding="Shift_JIS:EUC-JP")
     @file_name = file_name
+    @encoding = encoding
+    @ply = 0
     grep
   end
 
   def grep
-    str = File.open(@file_name).read
+    @str = File.open(@file_name, "r:#{@encoding}").read
 
-    if /^N\+(.*)$/ =~ str then @black_name = $1.strip end
-    if /^N\-(.*)$/ =~ str then @white_name = $1.strip end
-    if /^'summary:(.*)$/ =~ str
-      state, p1, p2 = $1.split(":").map {|a| a.strip}    
-      return if state == "abnormal"
+
+    if /^N\+(.*)$/ =~ @str then @black_name = $1.strip end
+    if /^N\-(.*)$/ =~ @str then @white_name = $1.strip end
+    if /^'summary:(.*)$/ =~ @str
+      @state, p1, p2 = $1.split(":").map {|a| a.strip}    
       p1_name, p1_mark = p1.split(" ")
       p2_name, p2_mark = p2.split(" ")
       if p1_name == @black_name
@@ -65,29 +71,41 @@ class CsaFileReader
         raise "Never reach!: #{black} #{white} #{p3} #{p2}"
       end
     end
-    if /^\$START_TIME:(.*)$/ =~ str
+    if /^\$START_TIME:(.*)$/ =~ @str
       @start_time = Time.parse($1.strip)
     end
-    if /^'\$END_TIME:(.*)$/ =~ str
+    if /^'\$END_TIME:(.*)$/ =~ @str
       @end_time = Time.parse($1.strip)
     end
-    if /^'rating:(.*)$/ =~ str
-      black_id, white_id = $1.split(":").map {|a| a.strip}
+    if /^'summary:.*?:(.*)$/ =~ @str
+      black_id, bresult, white_id, wresult = $1.split(":").map {|a| a.strip.split(" ")}.flatten
       @black_id = identify_id(black_id)
       @white_id = identify_id(white_id)
-      if @black_id && @white_id && (@black_id != @white_id) &&
-         @black_mark && @white_mark
+      if @black_id && @white_id
         if black_mark == WIN_MARK && white_mark == LOSS_MARK
           @winner, @loser = @black_id, @white_id
         elsif black_mark == LOSS_MARK && white_mark == WIN_MARK
           @winner, @loser = @white_id, @black_id
-        elsif black_mark == DRAW_MARK && white_mark == DRAW_MARK
+       else
+          # draw or errors
           @winner, @loser = nil, nil
-        else
-          raise "Never reached!"
         end
       end
     end
+
+    @str.each_line do |line|
+      if /^[\+\-]\d{4}[A-Z]{2}/ =~ line
+        @ply += 1
+      end
+    end
+  end
+
+  def movetimes
+    ret = []
+    @str.gsub(%r!^T(\d+)!) do |match|
+      ret << $1.to_i
+    end
+    return ret
   end
 
   def to_s
@@ -95,7 +113,8 @@ class CsaFileReader
            "BlackName #{@black_name}, WhiteName #{@white_name}\n" +
            "BlackId #{@black_id}, WhiteId #{@white_id}\n" +
            "Winner #{@winner}, Loser #{@loser}\n"    +
-           "Start #{@start_time}, End #{@end_time}\n"
+           "Start #{@start_time}, End #{@end_time}\n" +
+           "Ply #{@ply}"
   end
 
   def identify_id(id)
@@ -114,6 +133,8 @@ if $0 == __FILE__
     puts "  --players player_a,player_b  select games of the player_a vs the player_b"
     puts "  --black player               select games of which the player is Black"
     puts "  --white player               select games of which the player is White"
+    puts "  --winner player              select games that the player won"
+    puts "  --loser player               select games that the player lose"
     exit 1
   end
 
@@ -122,7 +143,9 @@ if $0 == __FILE__
   parser = GetoptLong.new(
              ['--black',   GetoptLong::REQUIRED_ARGUMENT],
              ['--white',   GetoptLong::REQUIRED_ARGUMENT],
-             ['--players', GetoptLong::REQUIRED_ARGUMENT]
+             ['--players', GetoptLong::REQUIRED_ARGUMENT],
+             ['--winner',  GetoptLong::REQUIRED_ARGUMENT],
+             ['--loser',   GetoptLong::REQUIRED_ARGUMENT]
            )
   begin
     parser.each_option do |name, arg|
@@ -154,6 +177,14 @@ if $0 == __FILE__
       if $OPT_WHITE
         next unless csa.white_id.downcase.index($OPT_WHITE.downcase) == 0
       end
+
+      if $OPT_WINNER
+        next unless csa.winner && csa.winner.downcase.index($OPT_WINNER.downcase) == 0
+      end
+      if $OPT_LOSER
+        next unless csa.loser && csa.loser.downcase.index($OPT_LOSER.downcase) == 0
+      end
+
       puts csa.file_name
     end
   end