Browse Source

verbose disconnect reasons

David Rose 23 years ago
parent
commit
350369ae57
2 changed files with 43 additions and 17 deletions
  1. 40 17
      direct/src/distributed/ClientRepository.py
  2. 3 0
      direct/src/distributed/MsgTypes.py

+ 40 - 17
direct/src/distributed/ClientRepository.py

@@ -41,6 +41,9 @@ class ClientRepository(DirectObject.DirectObject):
         # is weak.
         self.connectHttp = base.config.GetBool('connect-http', 1)
 
+        self.bootedIndex = None
+        self.bootedText = None
+
         self.tcpConn = None
         return None
 
@@ -75,7 +78,8 @@ class ClientRepository(DirectObject.DirectObject):
         the return status code giving reason for failure, if it is
         known.
         """
-
+        self.bootedIndex = None
+        self.bootedText = None
         if self.connectHttp:
             ch = self.http.makeChannel(0)
             ch.beginConnectTo(serverURL)
@@ -488,24 +492,43 @@ class ClientRepository(DirectObject.DirectObject):
                 "Asked to update non-existent DistObj " + str(doId))
         return None
 
-    def handleUnexpectedMsgType(self, msgType, di):
-        currentLoginState = self.loginFSM.getCurrentState()
-        if currentLoginState:
-            currentLoginStateName = currentLoginState.getName()
+    def handleGoGetLost(self, di):
+        # The server told us it's about to drop the connection on us.
+        # Get ready!
+        if (di.getRemainingSize() > 0):
+            self.bootedIndex = di.getUint16()
+            self.bootedText = di.getString()
+
+            ClientRepository.notify.warning(
+                "Server is booting us out (%d): %s" % (self.bootedIndex, self.bootedText))
         else:
-            currentLoginStateName = "None"
-        currentGameState = self.gameFSM.getCurrentState()
-        if currentGameState:
-            currentGameStateName = currentGameState.getName()
+            self.bootedIndex = None
+            self.bootedText = None
+            ClientRepository.notify.warning(
+                "Server is booting us out with no explanation.")
+        
+
+    def handleUnexpectedMsgType(self, msgType, di):
+        if msgType == CLIENT_GO_GET_LOST:
+            self.handleGoGetLost(di)
         else:
-            currentGameStateName = "None"
-        ClientRepository.notify.warning(
-            "Ignoring unexpected message type: " +
-            str(msgType) +
-            " login state: " +
-            currentLoginStateName +
-            " game state: " +
-            currentGameStateName)
+            currentLoginState = self.loginFSM.getCurrentState()
+            if currentLoginState:
+                currentLoginStateName = currentLoginState.getName()
+            else:
+                currentLoginStateName = "None"
+            currentGameState = self.gameFSM.getCurrentState()
+            if currentGameState:
+                currentGameStateName = currentGameState.getName()
+            else:
+                currentGameStateName = "None"
+            ClientRepository.notify.warning(
+                "Ignoring unexpected message type: " +
+                str(msgType) +
+                " login state: " +
+                currentLoginStateName +
+                " game state: " +
+                currentGameStateName)
         return None
 
     def sendSetShardMsg(self, shardId):

+ 3 - 0
direct/src/distributed/MsgTypes.py

@@ -1,5 +1,8 @@
 """MsgTypes module: contains distributed object message types"""
 
+# Sent by the server when it is dropping the connection deliberately.
+CLIENT_GO_GET_LOST =                          4
+
 CLIENT_OBJECT_UPDATE_FIELD =                 24
 CLIENT_OBJECT_UPDATE_FIELD_RESP =            24
 CLIENT_OBJECT_DISABLE_RESP =                 25