Can now log in to a character selection screen. Lots more testing required before one-char-per-session works.

This commit is contained in:
Griatch 2013-02-03 00:25:06 +01:00
parent c0d634fe8c
commit f1767251c6
6 changed files with 41 additions and 27 deletions

View file

@ -696,7 +696,7 @@ class CmdOOCLook(MuxCommandOOC, CmdLook):
characters = player.get_all_characters() # get all characters characters = player.get_all_characters() # get all characters
string = "You are logged in as {g%s{n." % player.key string = "You are logged in as {g%s{n." % player.key
string += " Use {w@ic <character>{n to enter the game." string += " Use {w@ic <character>{n to enter the game."
string += "\n\nAvailable character%s:" % (characters.count() > 1 and "s" or "") string += "\n\nAvailable character%s:" % (len(characters) > 1 and "s" or "")
for char in characters: for char in characters:
csessid = char.sessid csessid = char.sessid
if csessid: if csessid:

View file

@ -282,7 +282,8 @@ class ObjectDB(TypedObject):
def __sessid_del(self): def __sessid_del(self):
"Deleter. Allows for del self.player" "Deleter. Allows for del self.player"
del_field_cache(self, "sessid") del_field_cache(self, "sessid")
player = property(__sessid_get, __sessid_set, __sessid_del) sessid = property(__sessid_get, __sessid_set, __sessid_del)
# location property (wraps db_location) # location property (wraps db_location)
#@property #@property
def __location_get(self): def __location_get(self):

View file

@ -369,6 +369,15 @@ class PlayerDB(TypedObject):
""" """
Evennia -> User Evennia -> User
This is the main route for sending data back to the user from the server. This is the main route for sending data back to the user from the server.
outgoing_string (string) - text data to send
from_obj (Object/Player) - source object of message to send
data (dict) - arbitrary data object containing eventual protocol-specific options
sessid - the session id of the session to send to. If not given, return 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).
""" """
if from_obj: if from_obj:
# call hook # call hook
@ -389,11 +398,12 @@ class PlayerDB(TypedObject):
session.msg(outgoing_string, data) session.msg(outgoing_string, data)
else: else:
# if no session was specified, send to them all # if no session was specified, send to them all
for sess in _GA(self, 'get_sessions'): for sess in _GA(self, 'get_all_sessions')():
sess.msg(outgoing_string, data) sess.msg(outgoing_string, data)
def inmsg(self, ingoing_string, sessid): def inmsg(self, ingoing_string, sessid):
""" """
User -> Evennia
This is the reverse of msg - used by sessions to relay This is the reverse of msg - used by sessions to relay
messages/data back into the game. It is normally not called messages/data back into the game. It is normally not called
from inside game code but only by the serversessions directly. from inside game code but only by the serversessions directly.
@ -433,6 +443,10 @@ class PlayerDB(TypedObject):
set_prop_cache(self, "_characters", cache) set_prop_cache(self, "_characters", cache)
# call hooks # call hooks
character.at_init() character.at_init()
if character:
# start (persistent) scripts on this object
#ScriptDB.objects.validate(obj=character)
pass
if character.db.FIRST_LOGIN: if character.db.FIRST_LOGIN:
character.at_first_login() character.at_first_login()
del character.db.FIRST_LOGIN del character.db.FIRST_LOGIN
@ -446,6 +460,8 @@ class PlayerDB(TypedObject):
""" """
char = _GA(self, "get_character")(sessid=sessid) char = _GA(self, "get_character")(sessid=sessid)
if char: if char:
# call hook before disconnecting
character.at_disconnect()
del char.sessid del char.sessid
# update cache # update cache
cache = get_prop_cache(self, "_characters") or {} cache = get_prop_cache(self, "_characters") or {}
@ -457,11 +473,11 @@ class PlayerDB(TypedObject):
""" """
Return session with given sessid connected to this player. Return session with given sessid connected to this player.
""" """
return SESSIONS.get_session_from_player(self, sessid=sessid) return SESSIONS.sessions_from_player(self, sessid=sessid)
def get_all_sessions(self): def get_all_sessions(self):
"Return all sessions connected to this player" "Return all sessions connected to this player"
return SESSIONS.get_session_from_player(self) return SESSIONS.sessions_from_player(self)
def get_character(self, sessid=None, character=None): def get_character(self, sessid=None, character=None):
""" """
@ -479,7 +495,7 @@ class PlayerDB(TypedObject):
# try to return a character with a given sessid # try to return a character with a given sessid
char = cache.get(sessid) char = cache.get(sessid)
if not char: if not char:
char = _GA(self, "db_objs").filter(player=self, sessid=sessid) or None char = _GA(self, "db_objs").filter(db_player=self, db_sessid=sessid) or None
if char: if char:
cache[sessid] = char[0] cache[sessid] = char[0]
set_prop_cache(self, "_characters", cache) set_prop_cache(self, "_characters", cache)

View file

@ -88,16 +88,20 @@ class Player(TypeClass):
## methods inherited from database model ## methods inherited from database model
def msg(self, outgoing_string, from_obj=None, data=None): def msg(self, outgoing_string, from_obj=None, data=None, sessid=None):
""" """
Evennia -> User Evennia -> User
This is the main route for sending data back to the user from the server. This is the main route for sending data back to the user from the server.
outgoing_string (string) - text data to send outgoing_string (string) - text data to send
from_obj (Object/Player) - source object of message to send from_obj (Object/Player) - source object of message to send
data (?) - arbitrary data object containing eventual protocol-specific options data (dict) - arbitrary data object containing eventual protocol-specific options
sessid - the session id of the session to send to. If not given, return 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).
"""
self.dbobj.msg(outgoing_string, from_obj=from_obj, data=data) self.dbobj.msg(outgoing_string, from_obj=from_obj, data=data)
def swap_character(self, new_character, delete_old_character=False): def swap_character(self, new_character, delete_old_character=False):
@ -293,8 +297,7 @@ class Player(TypeClass):
""" """
# Character.at_post_login also looks around. Only use # Character.at_post_login also looks around. Only use
# this as a backup when logging in without a character # this as a backup when logging in without a character
if not self.character: self.execute_cmd("look")
self.execute_cmd("look")
def at_disconnect(self, reason=None): def at_disconnect(self, reason=None):
""" """

View file

@ -57,10 +57,6 @@ class ServerSession(Session):
self.cmdset.update(init_mode=True) self.cmdset.update(init_mode=True)
return return
character = self.get_character()
if character:
# start (persistent) scripts on this object
ScriptDB.objects.validate(obj=character)
def session_login(self, player): def session_login(self, player):
""" """
@ -103,7 +99,7 @@ class ServerSession(Session):
self.log(_('Logged in: %(self)s') % {'self': self}) self.log(_('Logged in: %(self)s') % {'self': self})
# start (persistent) scripts on this object # start (persistent) scripts on this object
ScriptDB.objects.validate(obj=self.player.character) #ScriptDB.objects.validate(obj=self.player.character)
#add session to connected list #add session to connected list
self.sessionhandler.login(self) self.sessionhandler.login(self)
@ -117,10 +113,10 @@ class ServerSession(Session):
accounts. accounts.
""" """
if self.logged_in: if self.logged_in:
player = self.get_player() sessid = self.sessid
character = self.get_character() player = self.player
if character: if player.get_character(sessid):
character.at_disconnect() player.disconnect_session_from_character(sessid)
uaccount = player.user uaccount = player.user
uaccount.last_login = datetime.now() uaccount.last_login = datetime.now()
uaccount.save() uaccount.save()
@ -140,10 +136,7 @@ class ServerSession(Session):
Returns the in-game character associated with this session. Returns the in-game character associated with this session.
This returns the typeclass of the object. This returns the typeclass of the object.
""" """
player = self.get_player() return self.logged_in and self.player.get_character(self.sessid) or None
if player:
return player.character
return None
def log(self, message, channel=True): def log(self, message, channel=True):
""" """

View file

@ -500,6 +500,7 @@ def create_player(name, email, password,
# call hook method (may override default permissions) # call hook method (may override default permissions)
new_player.at_player_creation() new_player.at_player_creation()
print
# custom given arguments potentially overrides the hook # custom given arguments potentially overrides the hook
if permissions: if permissions:
new_player.permissions = permissions new_player.permissions = permissions
@ -521,7 +522,7 @@ def create_player(name, email, password,
player=new_player, report_to=report_to) player=new_player, report_to=report_to)
return new_character return new_character
return new_player return new_player
except Exception, e: except Exception:
# a failure in creating the character # a failure in creating the character
if not user: if not user:
# in there was a failure we clean up everything we can # in there was a failure we clean up everything we can
@ -538,7 +539,7 @@ def create_player(name, email, password,
del new_character del new_character
except Exception: except Exception:
pass pass
raise e raise
# alias # alias
player = create_player player = create_player