2 require 'shogi_server/league/floodgate'
8 # @param game_names an array of game name strings
10 def initialize(game_names)
11 @game_names = game_names
15 # Return the most recent Floodgate instance
17 def next_league(leagues)
18 floodgate = leagues.min {|a,b| a.next_time <=> b.next_time}
22 def floodgate_reload_log(leagues)
23 floodgate = next_league(leagues)
24 diff = floodgate.next_time - Time.now
25 log_message("Floodgate reloaded. The next match will start at %s in %d seconds" %
26 [floodgate.next_time, diff])
30 leagues = @game_names.collect do |game_name|
31 ShogiServer::League::Floodgate.new($league,
32 {:game_name => game_name})
34 leagues.delete_if do |floodgate|
36 unless floodgate.next_time
37 log_error("Unsupported game name: %s" % floodgate.game_name)
43 log_error("No valid Floodgate game names found")
44 return [] # will exit the thread
46 floodgate_reload_log(leagues)
50 def wait_next_floodgate(floodgate)
51 diff = floodgate.next_time - Time.now
59 def reload_shogi_server
61 log_message("Reloading source...")
66 def start_games(floodgate)
67 log_message("Starting Floodgate games...: %s" % [floodgate.game_name])
72 # Regenerate floodgate instances from next_array for the next matches.
73 # @param next_array array of [game_name, next_time]
75 def regenerate_leagues(next_array)
76 leagues = next_array.collect do |game_name, next_time|
77 floodgate = ShogiServer::League::Floodgate.new($league,
78 {:game_name => game_name,
79 :next_time => next_time})
81 floodgate_reload_log(leagues)
86 return nil if @game_names.nil? || @game_names.empty?
88 log_message("Set up floodgate games: %s" % [@game_names.join(",")])
89 @thread = Thread.start(@game_names) do |game_names|
92 if leagues.nil? || leagues.empty?
93 return # exit from this thread
98 floodgate = next_league(leagues)
99 next if wait_next_floodgate(floodgate)
101 next_array = leagues.collect do |floodgate|
102 if (floodgate.next_time - Time.now) > 0
103 [floodgate.game_name, floodgate.next_time]
105 start_games(floodgate)
106 floodgate.charge # updates next_time
107 [floodgate.game_name, floodgate.next_time]
113 # Regenerate floodgate instances after ShogiServer.realod
114 leagues = regenerate_leagues(next_array)
115 rescue Exception => ex
117 log_error("[in Floodgate's thread] #{ex} #{ex.backtrace}")
126 @thread.kill if @thread
129 end # class SetupFloodgate
131 end # module ShogiServer