diff --git a/src/server/amp.py b/src/server/amp.py index 4b0dd8e2c8..a2b92dffa9 100644 --- a/src/server/amp.py +++ b/src/server/amp.py @@ -20,7 +20,7 @@ try: except ImportError: import pickle from twisted.protocols import amp -from twisted.internet import protocol, defer, reactor +from twisted.internet import protocol, defer from django.conf import settings from src.utils import utils from src.server.models import ServerConfig @@ -31,6 +31,17 @@ from src.server.serversession import ServerSession PORTAL_RESTART = os.path.join(settings.GAME_DIR, "portal.restart") SERVER_RESTART = os.path.join(settings.GAME_DIR, "server.restart") +# communication bits + +PCONN = chr(1) # portal session connect +PDISCONN = chr(2) # portal session disconnect +PSYNC = chr(3) # portal session sync +SLOGIN = chr(4) # server session login +SDISCONN = chr(5) # server session disconnect +SDISCONNALL = chr(6) # server session disconnect all +SSHUTD = chr(7) # server shutdown +SSYNC = chr(8) # server session sync + # i18n from django.utils.translation import ugettext as _ @@ -212,7 +223,7 @@ class AMPProtocol(amp.AMP): sessdata = self.factory.portal.sessions.get_all_sync_data() #print sessdata self.call_remote_ServerAdmin(0, - "PSYNC", + PSYNC, data=sessdata) if get_restart_mode(SERVER_RESTART): msg = _(" ... Server restarted.") @@ -315,7 +326,6 @@ class AMPProtocol(amp.AMP): # Server administration from the Portal side - def amp_server_admin(self, sessid, operation, data): """ This allows the portal to perform admin @@ -326,7 +336,7 @@ class AMPProtocol(amp.AMP): #print "serveradmin (server side):", sessid, operation, data - if operation == 'PCONN': #portal_session_connect + if operation == PCONN: #portal_session_connect # create a new session and sync it sess = ServerSession() sess.sessionhandler = self.factory.server.sessions @@ -338,11 +348,11 @@ class AMPProtocol(amp.AMP): self.factory.server.sessions.portal_connect(sessid, sess) - elif operation == 'PDISCONN': #'portal_session_disconnect' + elif operation == PDISCONN: #'portal_session_disconnect' # session closed from portal side self.factory.server.sessions.portal_disconnect(sessid) - elif operation == 'PSYNC': #'portal_session_sync' + elif operation == PSYNC: #'portal_session_sync' # force a resync of sessions when portal reconnects to server (e.g. after a server reboot) # the data kwarg contains a dict {sessid: {arg1:val1,...}} representing the attributes # to sync for each session. @@ -390,24 +400,24 @@ class AMPProtocol(amp.AMP): data = loads(data) #print "portaladmin (portal side):", sessid, operation, data - if operation == 'SLOGIN': # 'server_session_login' + if operation == SLOGIN: # 'server_session_login' # a session has authenticated; sync it. sess = self.factory.portal.sessions.get_session(sessid) sess.load_sync_data(data) - elif operation == 'SDISCONN': #'server_session_disconnect' + elif operation == SDISCONN: #'server_session_disconnect' # the server is ordering to disconnect the session self.factory.portal.sessions.server_disconnect(sessid, reason=data) - elif operation == 'SDISCONNALL': #'server_session_disconnect_all' + elif operation == SDISCONNALL: #'server_session_disconnect_all' # server orders all sessions to disconnect self.factory.portal.sessions.server_disconnect_all(reason=data) - elif operation == 'SSHUTD': #server_shutdown' + elif operation == SSHUTD: #server_shutdown' # the server orders the portal to shut down self.factory.portal.shutdown(restart=False) - elif operation == 'SSYNC': #'server_session_sync' + elif operation == SSYNC: #'server_session_sync' # server wants to save session data to the portal, maybe because # it's about to shut down. We don't overwrite any sessions, # just update data on them and remove eventual ones that are diff --git a/src/server/sessionhandler.py b/src/server/sessionhandler.py index 5dd952e210..3821af524b 100644 --- a/src/server/sessionhandler.py +++ b/src/server/sessionhandler.py @@ -10,7 +10,6 @@ There are two similar but separate stores of sessions: twisted protocols. These are dumb connectors that handle network communication but holds no game info. - """ import time @@ -21,6 +20,16 @@ from src.utils import utils from src.commands.cmdhandler import CMD_LOGINSTART +# AMP signals +PCONN = chr(1) # portal session connect +PDISCONN = chr(2) # portal session disconnect +PSYNC = chr(3) # portal session sync +SLOGIN = chr(4) # server session login +SDISCONN = chr(5) # server session disconnect +SDISCONNALL = chr(6) # server session disconnect all +SSHUTD = chr(7) # server shutdown +SSYNC = chr(8) # server session sync + # i18n from django.utils.translation import ugettext as _ @@ -129,7 +138,7 @@ class ServerSessionHandler(SessionHandler): Called by server when shutting down the portal. """ self.server.amp_protocol.call_remote_PortalAdmin(0, - operation='SSHUTD', + operation=SSHUTD, data="") # server-side access methods @@ -144,7 +153,7 @@ class ServerSessionHandler(SessionHandler): del self.sessions[sessid] # inform portal that session should be closed. self.server.amp_protocol.call_remote_PortalAdmin(sessid, - operation='SDISCONN', + operation=SDISCONN, data=reason) self.session_count(-1) @@ -165,7 +174,7 @@ class ServerSessionHandler(SessionHandler): # sync the portal to this session sessdata = session.get_sync_data() self.server.amp_protocol.call_remote_PortalAdmin(session.sessid, - operation='SLOGIN', + operation=SLOGIN, data=sessdata) def session_sync(self): @@ -175,11 +184,11 @@ class ServerSessionHandler(SessionHandler): """ sessdata = self.get_all_sync_data() self.server.amp_protocol.call_remote_PortalAdmin(0, - 'SSYNC', + SSYNC, data=sessdata) - def disconnect_all_sessions(self, reason="You have been disconnected."): + def disconnect_all_sessions(self, reason=_("You have been disconnected.")): """ Cleanly disconnect all of the connected sessions. """ @@ -189,10 +198,10 @@ class ServerSessionHandler(SessionHandler): self.session_count(0) # tell portal to disconnect all sessions self.server.amp_protocol.call_remote_PortalAdmin(0, - operation='SDISCONNALL', + operation=SDISCONNALL, data=reason) - def disconnect_duplicate_sessions(self, curr_session): + def disconnect_duplicate_sessions(self, curr_session, reason = _("Logged in from elsewhere. Disconnecting.") ): """ Disconnects any existing sessions with the same game object. """ @@ -201,7 +210,6 @@ class ServerSessionHandler(SessionHandler): if sess.logged_in and sess.get_character() == curr_char and sess != curr_session] - reason = _("Logged in from elsewhere. Disconnecting.") for sessid in doublet_sessions: self.disconnect(session, reason) self.session_count(-1) @@ -213,11 +221,11 @@ class ServerSessionHandler(SessionHandler): and see if any are dead. """ tcurr = time.time() - invalid_sessions = [session for session in self.sessions.values() - if session.logged_in and IDLE_TIMEOUT > 0 - and (tcurr - session.cmd_last) > IDLE_TIMEOUT] - for session in invalid_sessions: - self.disconnect(session, reason=_("Idle timeout exceeded, disconnecting.")) + reason= _("Idle timeout exceeded, disconnecting.")) + for session in (session for session in self.sessions.values() + if session.logged_in and IDLE_TIMEOUT > 0 + and (tcurr - session.cmd_last) > IDLE_TIMEOUT): + self.disconnect(session, reason=reason) self.session_count(-1) def session_count(self, num=None): @@ -357,7 +365,7 @@ class PortalSessionHandler(SessionHandler): self.sessions[sessid] = session # sync with server-side self.portal.amp_protocol.call_remote_ServerAdmin(sessid, - operation="PCONN", + operation=PCONN, data=sessdata) def disconnect(self, session): """ @@ -365,7 +373,7 @@ class PortalSessionHandler(SessionHandler): """ sessid = session.sessid self.portal.amp_protocol.call_remote_ServerAdmin(sessid, - operation="PDISCONN") + operation=PDISCONN) def server_disconnect(self, sessid, reason=""): """