class Command
# Factory method
#
- def Command.factory(str, player)
+ def Command.factory(str, player, time=Time.now)
cmd = nil
case str
when ""
cmd = ErrorCommand.new(str, player)
end
+ cmd.time = time
return cmd
end
def initialize(str, player)
@str = str
@player = player
+ @time = Time.now # this should be replaced later with a real time
end
+ attr_accessor :time
end
# Application-level protocol for Keep-Alive.
if (@player.status == "game")
array_str = @str.split(",")
move = array_str.shift
+ if @player.game.last_move &&
+ @player.game.last_move.split(",").first == move
+ log_warning("Received two sequencial identical moves [#{move}] from #{@player.name}. The last one was ignored.")
+ return :continue
+ end
additional = array_str.shift
comment = nil
if /^'(.*)/ =~ additional
comment = array_str.unshift("'*#{$1.toeuc}")
end
- s = @player.game.handle_one_move(move, @player)
+ s = @player.game.handle_one_move(move, @player, @time)
@player.game.log_game(Kconv.toeuc(comment.first)) if (comment && comment.first && !s)
return :return if (s && @player.protocol == LoginCSA::PROTOCOL)
end
def in_game_status
rc = :continue
- s = @player.game.handle_one_move(@str, @player)
+ s = @player.game.handle_one_move(@str, @player, @time)
rc = :return if (s && @player.protocol == LoginCSA::PROTOCOL)
return rc
def ==(rhs)
return rhs != nil &&
rhs.is_a?(MonitorHandler) &&
- @player = rhs.player &&
- @type = rhs.type
+ @player == rhs.player &&
+ @type == rhs.type
end
def write_safe(game_id, str)
end
end
- class Monitor2OffCommand < MonitorOffCommand # same
+ class Monitor2OffCommand < MonitorOffCommand
def initialize(str, player, game)
super
end
+
+ def call
+ if (@game)
+ @game.monitoroff(MonitorHandler2.new(@player))
+ end
+ return :continue
+ end
end
# Command of HELP
end
@player.sente = nil
else
- if (@my_sente_str == "*")
+ if (@my_sente_str == "*") && !Login.handicapped_game_name?(@game_name)
rival = $league.get_player("game_waiting", @game_name, nil, @player) # no preference
elsif (@my_sente_str == "+")
rival = $league.get_player("game_waiting", @game_name, false, @player) # rival must be gote
elsif (@my_sente_str == "-")
rival = $league.get_player("game_waiting", @game_name, true, @player) # rival must be sente
else
- ## never reached
@player.write_safe(sprintf("##[ERROR] bad game option\n"))
return :continue
end
Game::new(@player.game_name, @player, rival, board)
end
else
- board = Board.new
+ klass = Login.handicapped_game_name?(@game_name) || Board
+ board = klass.new
board.initial
Game::new(@player.game_name, @player, rival, board)
end
end
def call
- msg = "##[ERROR] unknown command %s\n" % [@str]
+ msg = "##[ERROR] unknown command %s\n" % [@str.chomp]
@player.write_safe(msg)
log_error(msg)
return :continue