From 707a21c7d7a8613e8b8897753532d65024a6488d Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 17 Feb 2013 13:59:36 +0100 Subject: [PATCH] Fixed so reloading the server reconnects the proper sessions to the characters again. --- src/players/models.py | 18 ++++++++++++++++++ src/server/amp.py | 19 +++---------------- src/server/server.py | 19 ++----------------- src/server/serversession.py | 2 ++ src/server/sessionhandler.py | 6 +++--- 5 files changed, 28 insertions(+), 36 deletions(-) diff --git a/src/players/models.py b/src/players/models.py index 813b089688..b9465ca6a9 100644 --- a/src/players/models.py +++ b/src/players/models.py @@ -432,6 +432,8 @@ class PlayerDB(TypedObject): from src.server.sessionhandler import SESSIONS as _SESSIONS _SESSIONS.disconnect(sessid=sessid) + + def connect_session_to_character(self, sessid, character, force=False): """ Connect the given session to a character through this player. @@ -488,6 +490,22 @@ class PlayerDB(TypedObject): set_prop_cache(self, "_characters", cache) return char + def reconnect_session_to_character(self, sessid): + """ + Auto-re-connect a session to a character. This is called by the sessionhandler + during a server reload. It goes through the characters stored in this player's + db_objs many2many fields and checks if any of those has the given sessid + stored on themselves - if so they connect them. This should ONLY be called + automatically by sessionhandler after a reload - after a portal shutdown + the portal sessids will be out of sync with whatever is stored on character + objects which could lead to a session being linked to the wrong character. + """ + char = _GA(self, "get_character")(sessid=sessid, return_dbobj=True) + if not char: + print "No reconnecting character found" + return + self.connect_session_to_character(sessid, char, force=True) + def get_session(self, sessid): """ Return session with given sessid connected to this player. diff --git a/src/server/amp.py b/src/server/amp.py index 03b7033cb5..7f4cffbdfa 100644 --- a/src/server/amp.py +++ b/src/server/amp.py @@ -27,16 +27,6 @@ from twisted.internet import protocol from twisted.internet.defer import Deferred from src.utils.utils import to_str, variable_from_module -# these are only needed on the server side, so we delay loading of them -# so as to not have to load them on the portal too. Note: It's doubtful -# if this really matters, considering many of the -# protocols require import of django components (at least settings). -#_ServerConfig = None -#_ScriptDB = None -#_PlayerDB = None -#_ServerSession = None -#_ = None #i18n hook - # communication bits PCONN = chr(1) # portal session connect @@ -61,8 +51,8 @@ def get_restart_mode(restart_file): class AmpServerFactory(protocol.ServerFactory): """ - This factory creates new AMPProtocol protocol instances to use for accepting - connections from TCPServer. + This factory creates the Server as a new AMPProtocol instance for accepting + connections from the Portal. """ def __init__(self, server): """ @@ -83,10 +73,7 @@ class AmpServerFactory(protocol.ServerFactory): class AmpClientFactory(protocol.ReconnectingClientFactory): """ - This factory creates new AMPProtocol protocol instances to use to connect - to the MUD server. It also maintains the portal attribute - on the ProxyService instance, which is used for piping input - from Telnet to the MUD server. + This factory creates an instance of the Portal, an AMPProtocol instances to use to connect """ # Initial reconnect delay in seconds. initialDelay = 1 diff --git a/src/server/server.py b/src/server/server.py index d45dc50fce..8d96184df2 100644 --- a/src/server/server.py +++ b/src/server/server.py @@ -190,9 +190,6 @@ class Evennia(object): from src.objects.models import ObjectDB #from src.players.models import PlayerDB - # clear eventual lingering session storages - ObjectDB.objects.clear_all_sessids() - #update eventual changed defaults self.update_defaults() @@ -209,6 +206,8 @@ class Evennia(object): SERVER_STARTSTOP_MODULE.at_server_reload_start() elif mode in ('reset', 'shutdown'): SERVER_STARTSTOP_MODULE.at_server_cold_start() + # clear eventual lingering session storages + ObjectDB.objects.clear_all_sessids() # always call this regardless of start type SERVER_STARTSTOP_MODULE.at_server_start() @@ -231,20 +230,6 @@ class Evennia(object): f.write(str(mode)) return mode - #if mode == None: - # f = open(SERVER_RESTART, 'r') - # if os.path.exists(SERVER_RESTART) and 'True' == f.read(): - # mode = 'reload' - # else: - # mode = 'shutdown' - # f.close() - #else: - # restart = mode in ('reload', 'reset') - # f = open(SERVER_RESTART, 'w') - # f.write(str(restart)) - # f.close() - #return mode - @defer.inlineCallbacks def shutdown(self, mode=None, _reactor_stopping=False): """ diff --git a/src/server/serversession.py b/src/server/serversession.py index caf46eb765..b1d358699d 100644 --- a/src/server/serversession.py +++ b/src/server/serversession.py @@ -56,6 +56,8 @@ class ServerSession(Session): self.cmdset_storage = [settings.CMDSET_UNLOGGEDIN] self.cmdset.update(init_mode=True) return + else: + self.player.reconnect_session_to_character(self.sessid) def session_login(self, player): """ diff --git a/src/server/sessionhandler.py b/src/server/sessionhandler.py index bc6d8ec40f..73ab503a10 100644 --- a/src/server/sessionhandler.py +++ b/src/server/sessionhandler.py @@ -181,7 +181,7 @@ class ServerSessionHandler(SessionHandler): _ScriptDB.objects.validate(init_mode=init_mode) _ServerConfig.objects.conf("server_restart_mode", delete=True) # announce the reconnection - self.announce_all(_(" ... server restarted.")) + self.announce_all(_(" ... Server restarted.")) def portal_shutdown(self): """ @@ -431,8 +431,8 @@ class PortalSessionHandler(SessionHandler): serversessions - dictionary {sessid:{property:value},...} describing the properties to sync on all sessions """ - to_save = [sessid for sessid, syncdata in serversessions if sessid in self.sessions] - to_delete = [sessid for sessid, syncdata in serversessions if sessid not in to_save] + to_save = [sessid for sessid in serversessions if sessid in self.sessions] + to_delete = [sessid for sessid in serversessions if sessid not in to_save] # save protocols for sessid in to_save: self.sessions[sessid].load_sync_data(serversessions[sessid])