1 require 'shogi_server/config'
2 require 'shogi_server/game'
14 def initialize(game_name, moves, owner, count)
15 raise "owner name is required" if owner && !owner.instance_of?(String)
16 @game_name, @moves, @owner, @count = game_name, moves, owner, count
24 return (@game_name == rhs.game_name &&
25 @moves == rhs.moves &&
26 @owner == rhs.owner &&
31 class NilBuoyGame < BuoyGame
33 super(nil, nil, nil, 0)
41 def Buoy.game_name?(str)
42 return /^buoy_.*\-\d+\-\d+$/.match(str) ? true : false
45 def initialize(conf = {})
46 @conf = $config || Config.new
47 @conf.merge!(conf, true)
48 filename = @conf[:buoy, :filename] || File.join(@conf[:topdir], "buoy.yaml")
49 @db = YAML::Store.new(filename)
54 def is_new_game?(game_name)
55 @db.transaction(true) do
56 return !@db.root?(game_name)
60 def add_game(buoy_game)
62 if @db.root?(buoy_game.game_name)
65 hash = {'moves' => buoy_game.moves,
66 'owner' => buoy_game.owner,
67 'count' => buoy_game.count}
68 @db[buoy_game.game_name] = hash
73 def update_game(buoy_game)
75 if @db.root?(buoy_game.game_name)
76 hash = {'moves' => buoy_game.moves,
77 'owner' => buoy_game.owner,
78 'count' => buoy_game.count}
79 @db[buoy_game.game_name] = hash
86 def delete_game(buoy_game)
88 @db.delete(buoy_game.game_name)
92 def get_game(game_name)
93 @db.transaction(true) do
98 count = hash['count'].to_i
99 return BuoyGame.new(game_name, moves, owner, count)
101 return NilBuoyGame.new
108 # Observer obserers GameResult of a buoy game
111 def update(game_result)
112 game_name = game_result.game.game_name
113 unless game_result.instance_of?(GameResultWin)
114 log_message "#{game_name} was not valid. It will be retried"
118 buoy_game = buoy.get_game(game_name)
119 buoy_game.decrement_count
120 if buoy_game.count < 1
121 buoy.delete_game buoy_game
122 log_message "#{game_name} has finished."
124 buoy.update_game buoy_game
125 log_message "#{game_name} remains #{buoy_game.count} slots."
129 end # module ShogiServer