X-Git-Url: http://git.sourceforge.jp/view?p=shogi-server%2Fshogi-server.git;a=blobdiff_plain;f=shogi_server%2Fleague%2Ffloodgate.rb;h=e3902de83b611b0d19924edf3697bbbd05876f86;hp=484ffd3c8d32ce6b8a9139b0e051c66ccb83fe24;hb=893e6e974a00a76cab6a22bcfb45ef8bd0d1e05f;hpb=b312106cb35cd7efc2e51721dac743a08f1993e3 diff --git a/shogi_server/league/floodgate.rb b/shogi_server/league/floodgate.rb index 484ffd3..e3902de 100644 --- a/shogi_server/league/floodgate.rb +++ b/shogi_server/league/floodgate.rb @@ -7,49 +7,97 @@ module ShogiServer class League class Floodgate class << self - # "floodgate-900-0" + # ex. "floodgate-900-0" # def game_name?(str) return /^floodgate\-\d+\-\d+$/.match(str) ? true : false end - end - attr_reader :next_time, :league + def history_file_path(gamename) + return nil unless game_name?(gamename) + filename = "floodgate_history_%s.yaml" % [gamename.gsub("floodgate-", "").gsub("-","_")] + file = File.join($topdir, filename) + return Pathname.new(file) + end + end # class method + + attr_reader :next_time, :league, :game_name - def initialize(league, next_time=nil) + def initialize(league, hash={}) @league = league - @next_time = next_time + @next_time = hash[:next_time] || nil + @game_name = hash[:game_name] || "floodgate-900-0" charge end + def game_name?(str) + return Regexp.new(@game_name).match(str) ? true : false + end + def charge - now = Time.now - unless $DEBUG - # each 30 minutes - if now.min < 30 - @next_time = Time.mktime(now.year, now.month, now.day, now.hour, 30) - else - @next_time = Time.mktime(now.year, now.month, now.day, now.hour) + 3600 - end + ntg = NextTimeGenerator.factory(@game_name) + if ntg + @next_time = ntg.call(Time.now) else - # for test, each 30 seconds - if now.sec < 30 - @next_time = Time.mktime(now.year, now.month, now.day, now.hour, now.min, 30) - else - @next_time = Time.mktime(now.year, now.month, now.day, now.hour, now.min) + 60 - end + @next_time = nil end end def match_game players = @league.find_all_players do |pl| pl.status == "game_waiting" && - Floodgate.game_name?(pl.game_name) && + game_name?(pl.game_name) && pl.sente == nil end Pairing.match(players) end + + # + # + class NextTimeGenerator + class << self + def factory(game_name) + ret = nil + if $DEBUG + ret = NextTimeGenerator_Debug.new + elsif game_name == "floodgate-900-0" + ret = NextTimeGenerator_Floodgate_900_0.new + elsif game_name == "floodgate-3600-0" + ret = NextTimeGenerator_Floodgate_3600_0.new + end + return ret + end + end + end + + class NextTimeGenerator_Floodgate_900_0 + def call(now) + # each 30 minutes + if now.min < 30 + return Time.mktime(now.year, now.month, now.day, now.hour, 30) + else + return Time.mktime(now.year, now.month, now.day, now.hour) + 3600 + end + end + end + class NextTimeGenerator_Floodgate_3600_0 + def call(now) + # each 2 hours (odd hour) + return Time.mktime(now.year, now.month, now.day, now.hour) + ((now.hour%2)+1)*3600 + end + end + + class NextTimeGenerator_Debug + def call(now) + # for test, each 30 seconds + if now.sec < 30 + return Time.mktime(now.year, now.month, now.day, now.hour, now.min, 30) + else + return Time.mktime(now.year, now.month, now.day, now.hour, now.min) + 60 + end + end + end # # @@ -57,9 +105,12 @@ class League @@mutex = Mutex.new class << self - def factory - file = Pathname.new $options["floodgate-history"] - history = History.new file + def factory(pathname) + unless ShogiServer::is_writable_file?(pathname.to_s) + log_error("Failed to write a history file: %s" % [pathname]) + return nil + end + history = History.new pathname history.load return history end @@ -67,7 +118,8 @@ class League attr_reader :records - # file_path_name is a Pathname object for this storage + # Initialize this instance. + # @param file_path_name a Pathname object for this storage # def initialize(file_path_name) @records = [] @@ -101,13 +153,16 @@ class League def load return unless @file.exist? - yaml = @file.open("r") {|f| f.read} - @records = YAML.load(yaml) + @records = YAML.load_file(@file) + unless @records && @records.instance_of?(Array) + $logger.error "%s is not a valid yaml file. Instead, an empty array will be used and updated." % [@file] + @records = [] + end end def save begin - @file.open("w+") do |f| + @file.open("w") do |f| f << YAML.dump(@records) end rescue Errno::ENOSPC