OSDN Git Service

[shogi-server] shogi-server, shogi_server/{command,game_result,player}.rb: The change...
authorDaigo Moriwaki <daigo@debian.org>
Sat, 17 Jan 2015 09:23:00 +0000 (18:23 +0900)
committerDaigo Moriwaki <daigo@debian.org>
Sat, 17 Jan 2015 09:23:00 +0000 (18:23 +0900)
  A player, attempting to login with the current live player
  stalling for more than a day, can forcibly override the current
  player.

changelog
shogi-server
shogi_server/command.rb
shogi_server/game_result.rb
shogi_server/player.rb
test/TC_floodgate_history.rb
test/mock_player.rb

index bdd04c4..465e6a7 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,3 +1,12 @@
+2015-01-17  Daigo Moriwaki <daigo at debian dot org>
+
+       * [shogi-server]
+         - shogi-server, shogi_server/{command,game_result,player}.rb:
+           The change at 2014-10-13 was not worked as expected. Reworked.
+           A player, attempting to login with the current live player
+           stalling for more than a day, can forcibly override the current
+           player.
+
 2015-01-12  Daigo Moriwaki <daigo at debian dot org>
 
        * [shogi-server]
index 8073889..56f92d4 100755 (executable)
@@ -356,8 +356,9 @@ def login_loop(client)
           # can override the current player.
           if (current_player.password == player.password &&
               (current_player.status != "game" ||
-               Time.now - current_player.modifiled_at > ONE_DAY))
-            log_message("user %s login forcely (previously modified at %s)" % [player.name, player.modified_at])
+               Time.now - current_player.last_command_at > ONE_DAY))
+            log_message("player %s login forcibly, nudging the former player" % [player.name])
+            log_message("  the former player was in %s and received the last command at %s" % [current_player.status, current_player.last_command_at])
             current_player.kill
           else
             login.incorrect_duplicated_player(str)
index b09b95a..5b25200 100644 (file)
@@ -121,6 +121,7 @@ module ShogiServer
       end
 
       cmd.time = time
+      player.last_command_at = time
       return cmd
     end
 
index 678ef3f..d6960af 100644 (file)
@@ -94,7 +94,7 @@ class GameResult
     elsif !p1.sente && p2.sente
       @black, @white = p2, p1
     else
-      raise "Never reached!"
+      raise "Never reached!: %s p1: %s p2: %s" % [game.game_id, p1.sente, p2.sente]
     end
     @players.each do |player|
       player.status = "connected"
index 471119b..c7dc8a4 100644 (file)
@@ -148,6 +148,7 @@ class Player < BasicPlayer
     @main_thread = Thread::current
     @write_queue = ShogiServer::TimeoutQueue.new(WRITE_THREAD_WATCH_INTERVAL)
     @player_logger = nil
+    @last_command_at = Time.now
     start_write_thread
   end
 
@@ -155,6 +156,8 @@ class Player < BasicPlayer
   attr_accessor :protocol, :eol, :game, :mytime
   attr_accessor :main_thread
   attr_reader :socket_buffer
+  # It is updated whenever a player sends a new command
+  attr_accessor :last_command_at
   
   def setup_logger(dir)
     log_file = File.join(dir, "%s.log" % [simple_player_id])
index f8761b8..767d1c5 100644 (file)
@@ -18,6 +18,7 @@ end
 
 class MockPlayer < ShogiServer::BasicPlayer
   attr_accessor :status
+  attr_accessor :last_command_at
 end
 
 class TestHistory < Test::Unit::TestCase
index fa20abf..94666e0 100644 (file)
@@ -7,6 +7,7 @@ class MockPlayer < ShogiServer::BasicPlayer
   attr_accessor :game_name
   attr_reader :socket_buffer
   attr_reader :rate
+  attr_accessor :last_command_at
 
   def initialize
     @name     = "mock_player"