From 1ffbc4b9f359d7f02aa4485c78b7e2ec282b46fe Mon Sep 17 00:00:00 2001 From: Griatch Date: Mon, 4 Aug 2014 15:58:51 +0200 Subject: [PATCH] Implemented a first working version of MULTISESSION_MODE=3 --- src/commands/default/player.py | 17 +++++++++++------ src/players/models.py | 22 ++++++++++++---------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/commands/default/player.py b/src/commands/default/player.py index 073cb5a40d..a6da780b23 100644 --- a/src/commands/default/player.py +++ b/src/commands/default/player.py @@ -248,17 +248,22 @@ class CmdIC(MuxPlayerCommand): self.msg("That is not a valid character choice.") return # permission checks - if player.get_puppet(sessid) == new_character: + if player.get_puppjet(sessid) == new_character: self.msg("{RYou already act as {c%s{n." % new_character.name) return if new_character.player: # may not puppet an already puppeted character - if new_character.sessid and new_character.player == player: - # as a safeguard we allow "taking over chars from - # your own sessions. - player.msg("{c%s{n{R is now acted from another of your sessions.{n" % (new_character.name), sessid=new_character.sessid) + if new_character.sessid.count() and new_character.player == player: + # as a safeguard we allow "taking over" chars from your own sessions. + if MULTISESSION_MODE == 3: + txt = "{c%s{n{G is now shared from another of your sessions.{n" + txt2 = "Sharing {c%s{n with another of your sessions." + else: + txt = "{c%s{n{R is now acted from another of your sessions.{n" + txt2 = "Taking over {c%s{n from another of your sessions." + player.msg(txt % (new_character.name), sessid=new_character.sessid.get()) player.unpuppet_object(new_character.sessid) - self.msg("Taking over {c%s{n from another of your sessions." % new_character.name) + self.msg(txt2 % new_character.name) elif new_character.player != player and new_character.player.is_connected: self.msg("{c%s{r is already acted by another player.{n" % new_character.name) return diff --git a/src/players/models.py b/src/players/models.py index dcf920ed8d..9e5e707596 100644 --- a/src/players/models.py +++ b/src/players/models.py @@ -230,7 +230,7 @@ class PlayerDB(TypedObject, AbstractUser): to all sessions connected to this player. This is usually only relevant when using msg() directly from a player-command (from a command on a Character, the character automatically stores - and handles the sessid). + and handles the sessid). Can also be a list of sessids. kwargs (dict) - All other keywords are parsed as extra data. """ if "data" in kwargs: @@ -247,13 +247,14 @@ class PlayerDB(TypedObject, AbstractUser): _GA(from_obj, "at_msg_send")(text=text, to_obj=_GA(self, "typeclass"), **kwargs) except Exception: pass - session = _MULTISESSION_MODE > 1 and sessid and _GA(self, "get_session")(sessid) or None - if session: - obj = session.puppet - if obj and not obj.at_msg_receive(text=text, **kwargs): - # if hook returns false, cancel send - return - session.msg(text=text, **kwargs) + sessions = _MULTISESSION_MODE > 1 and [sessid] and make_iter(_GA(self, "get_session")(sessid)) or None + if sessions: + for session in sessions: + obj = session.puppet + if obj and not obj.at_msg_receive(text=text, **kwargs): + # if hook returns false, cancel send + continue + session.msg(text=text, **kwargs) else: # if no session was specified, send to them all for sess in _GA(self, 'get_all_sessions')(): @@ -264,6 +265,7 @@ class PlayerDB(TypedObject, AbstractUser): def get_session(self, sessid): """ Return session with given sessid connected to this player. + note that the sessionhandler also accepts sessid as an iterable. """ global _SESSIONS if not _SESSIONS: @@ -347,14 +349,14 @@ class PlayerDB(TypedObject, AbstractUser): obj = hasattr(session, "puppet") and session.puppet or None if not obj: return False - # do the disconnect + # do the disconnect, but only if we are the last session to puppet _GA(obj.typeclass, "at_pre_unpuppet")() obj.dbobj.sessid.remove(sessid) if not obj.dbobj.sessid.count(): del obj.dbobj.player + _GA(obj.typeclass, "at_post_unpuppet")(_GA(self, "typeclass"), sessid=sessid) session.puppet = None session.puid = None - _GA(obj.typeclass, "at_post_unpuppet")(_GA(self, "typeclass"), sessid=sessid) return True def unpuppet_all(self):