OSDN Git Service

Use Thrift (RPC) instead of executing directly a command to generate image files.
[shogi-server/shogi-server.git] / showgame / controller / main.rb
1 # Default url mappings are:
2 #  a controller called Main is mapped on the root of the site: /
3 #  a controller called Something is mapped on: /something
4 # If you want to override this, add a line like this inside the class
5 #  map '/otherurl'
6 # this will force the controller to be mounted on: /otherurl
7
8 require File.join(__DIR__, "..", "..", "shogi_server", "piece")
9 require File.join(__DIR__, "..", "..", "shogi_server", "board")
10 require File.join(__DIR__, "..", "..", "shogi_server", "usi")
11
12 require File.join(__DIR__, "..", "gen-rb", "ShogiGraphic")
13 require 'thrift/transport/socket'
14 require 'thrift/protocol/tbinaryprotocol'
15
16 $pos2img_out_dir = File.join(".", "public", "images")
17
18 class MainController < Ramaze::Controller
19   layout '/page'
20
21   # the index action is called automatically when no other action is specified
22   def index
23     @title = "Welcome to Ramaze!"
24   end
25
26   def game(csa_file)
27     csa_file.gsub!(" ", "+")
28     dir = "/home/daigo/rubyprojects/shogi-server"
29     files = Dir.glob(File.join(dir, "**", csa_file))
30     if files.empty?
31       redirect Rs()
32     end
33     board = ShogiServer::Board.new
34     board.initial
35     @moves = Array.new
36     teban = true
37     usi = ShogiServer::Usi.new
38     kifu = File.open(files.first) {|f| f.read}
39     kifu.each_line do |line|
40       #  Ramaze::Log.warn(line)
41       if /^([\+\-])(\d)(\d)(\d)(\d)([A-Z]{2})/ =~ line
42         board.handle_one_move(line)
43         sfen = usi.board2usi(board, teban)
44         sfen = ShogiServer::Usi.escape(sfen)
45         @moves << A(h(line), :href => Rs(:sfen, u(sfen)))
46         teban = teban ? false : true
47       end
48     end
49   end
50
51   def sfen(str)
52     sfen = "sfen %s" % [ShogiServer::Usi.unescape(str)]
53     Ramaze::Log.warn(sfen)
54
55     transport = Thrift::BufferedTransport.new(Thrift::Socket.new('localhost', 9090))
56     client    = ShogiGraphic::Client.new(Thrift::BinaryProtocol.new(transport))
57
58     transport.open
59     result = client.usi2png(sfen)
60     transport.close
61
62     Ramaze::Log.warn("result fail") unless result
63     @img = "/images/%s" % [result]
64   end
65
66   def images(str)
67     file = File.join($pos2img_out_dir, str)
68     send_file(file, mime_type = Ramaze::Tool::MIME.type_for(file))
69   end
70
71   # the string returned at the end of the function is used as the html body
72   # if there is no template for the action. if there is a template, the string
73   # is silently ignored
74   def notemplate
75     "there is no 'notemplate.xhtml' associated with this action"
76   end
77 end