1 require 'shogi_server/config'
2 require 'shogi_server/game'
13 attr_reader :sente_time
14 attr_reader :gote_time
16 def initialize(game_name, moves, owner, count, sente_time, gote_time)
17 raise "owner name is required" if owner && !owner.instance_of?(String)
18 @game_name, @moves, @owner, @count, @sente_time, @gote_time = game_name, moves, owner, count, sente_time, gote_time
26 return (@game_name == rhs.game_name &&
27 @moves == rhs.moves &&
28 @owner == rhs.owner &&
29 @count == rhs.count &&
30 @sente_time == rhs.sente_time &&
31 @gote_time == rhs.gote_time)
35 class NilBuoyGame < BuoyGame
37 super(nil, nil, nil, 0, nil, nil)
45 def Buoy.game_name?(str)
46 return /^buoy_.*\-\d+\-\d+$/.match(str) ? true : false
49 def initialize(conf = {})
50 @conf = $config || Config.new
51 @conf.merge!(conf, true)
52 filename = @conf[:buoy, :filename] || File.join(@conf[:topdir], "buoy.yaml")
53 @db = YAML::Store.new(filename)
58 def is_new_game?(game_name)
59 @db.transaction(true) do
60 return !@db.root?(game_name)
64 def add_game(buoy_game)
66 if @db.root?(buoy_game.game_name)
69 hash = {'moves' => buoy_game.moves,
70 'owner' => buoy_game.owner,
71 'count' => buoy_game.count,
72 'sente_time' => buoy_game.sente_time,
73 'gote_time' => buoy_game.gote_time}
74 @db[buoy_game.game_name] = hash
79 def update_game(buoy_game)
81 if @db.root?(buoy_game.game_name)
82 hash = {'moves' => buoy_game.moves,
83 'owner' => buoy_game.owner,
84 'count' => buoy_game.count,
85 'sene_time' => buoy_game.sente_time,
86 'gote_time' => buoy_game.gote_time}
87 @db[buoy_game.game_name] = hash
94 def delete_game(buoy_game)
96 @db.delete(buoy_game.game_name)
100 def get_game(game_name)
101 @db.transaction(true) do
102 hash = @db[game_name]
104 moves = hash['moves']
105 owner = hash['owner']
106 count = hash['count'].to_i
107 sente_time = hash['sente_time'] ? hash['sente_time'].to_i : nil
108 gote_time = hash['gote_time'] ? hash['gote_time'].to_i : nil
109 return BuoyGame.new(game_name, moves, owner, count, sente_time, gote_time)
111 return NilBuoyGame.new
116 def decrement_count(buoy_game)
117 return if buoy_game.instance_of?(NilBuoyGame)
119 buoy_game.decrement_count
120 if buoy_game.count > 0
121 update_game buoy_game
122 log_message "Buoy #{buoy_game.game_name} remains #{buoy_game.count} slots."
124 delete_game buoy_game
125 log_message "Buoy #{buoy_game.game_name} finished."
130 end # module ShogiServer