2006-12-22 01:40:40 +00:00
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
Sessionhandler, stores and handles
|
|
|
|
|
a list of all player connections (sessions).
|
2006-12-22 01:40:40 +00:00
|
|
|
"""
|
2008-06-15 17:21:02 +00:00
|
|
|
import time
|
2009-04-20 22:34:16 +00:00
|
|
|
from django.contrib.auth.models import User
|
2008-12-15 04:35:00 +00:00
|
|
|
from src.config.models import ConfigValue
|
2010-08-29 18:46:58 +00:00
|
|
|
from src.utils import logger
|
2008-06-15 17:21:02 +00:00
|
|
|
|
2006-12-22 01:40:40 +00:00
|
|
|
# Our list of connected sessions.
|
2010-08-29 18:46:58 +00:00
|
|
|
SESSIONS = []
|
2009-04-20 22:34:16 +00:00
|
|
|
|
2007-05-21 20:52:05 +00:00
|
|
|
def add_session(session):
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
|
|
|
|
Adds a session to the session list.
|
|
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
SESSIONS.insert(0, session)
|
|
|
|
|
change_session_count(1)
|
|
|
|
|
logger.log_infomsg('Sessions active: %d' % (len(get_sessions(return_unlogged=True),)))
|
2008-06-13 19:52:29 +00:00
|
|
|
|
2010-08-29 18:46:58 +00:00
|
|
|
def get_sessions(return_unlogged=False):
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
|
|
|
|
Lists the connected session objects.
|
|
|
|
|
"""
|
|
|
|
|
if return_unlogged:
|
2010-08-29 18:46:58 +00:00
|
|
|
return SESSIONS
|
2008-06-13 19:52:29 +00:00
|
|
|
else:
|
2010-08-29 18:46:58 +00:00
|
|
|
return [sess for sess in SESSIONS if sess.logged_in]
|
2009-06-04 03:42:19 +00:00
|
|
|
|
|
|
|
|
def get_session_id_list(return_unlogged=False):
|
|
|
|
|
"""
|
|
|
|
|
Lists the connected session object ids.
|
|
|
|
|
"""
|
|
|
|
|
if return_unlogged:
|
2010-08-29 18:46:58 +00:00
|
|
|
return SESSIONS
|
2009-06-04 03:42:19 +00:00
|
|
|
else:
|
2010-08-29 18:46:58 +00:00
|
|
|
return [sess.uid for sess in SESSIONS if sess.logged_in]
|
2007-04-25 20:11:29 +00:00
|
|
|
|
2007-05-21 20:52:05 +00:00
|
|
|
def disconnect_all_sessions():
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
|
|
|
|
Cleanly disconnect all of the connected sessions.
|
|
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
for sess in get_sessions():
|
2008-06-13 19:52:29 +00:00
|
|
|
sess.handle_close()
|
2007-05-21 20:52:05 +00:00
|
|
|
|
2007-05-25 15:02:16 +00:00
|
|
|
def disconnect_duplicate_session(session):
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
|
|
|
|
Disconnects any existing session under the same object. This is used in
|
|
|
|
|
connection recovery to help with record-keeping.
|
|
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
SESSIONS = get_sessions()
|
|
|
|
|
session_pobj = session.get_character()
|
|
|
|
|
for other_session in SESSIONS:
|
|
|
|
|
other_pobject = other_session.get_character()
|
2009-01-22 00:17:43 +00:00
|
|
|
if session_pobj == other_pobject and other_session != session:
|
|
|
|
|
other_session.msg("Your account has been logged in from elsewhere, disconnecting.")
|
|
|
|
|
other_session.disconnectClient()
|
2008-06-13 19:52:29 +00:00
|
|
|
return True
|
|
|
|
|
return False
|
2007-05-25 15:02:16 +00:00
|
|
|
|
2007-04-25 20:11:29 +00:00
|
|
|
def check_all_sessions():
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
|
|
|
|
Check all currently connected sessions and see if any are dead.
|
|
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
idle_timeout = int(ConfigValue.objects.conf('idle_timeout'))
|
2007-05-09 15:28:12 +00:00
|
|
|
|
2010-08-29 18:46:58 +00:00
|
|
|
if len(SESSIONS) <= 0:
|
2008-06-13 19:52:29 +00:00
|
|
|
return
|
2007-05-09 15:28:12 +00:00
|
|
|
|
2008-06-13 19:52:29 +00:00
|
|
|
if idle_timeout <= 0:
|
|
|
|
|
return
|
|
|
|
|
|
2010-08-29 18:46:58 +00:00
|
|
|
for sess in get_sessions(return_unlogged=True):
|
2008-06-13 19:52:29 +00:00
|
|
|
if (time.time() - sess.cmd_last) > idle_timeout:
|
|
|
|
|
sess.msg("Idle timeout exceeded, disconnecting.")
|
|
|
|
|
sess.handle_close()
|
2007-05-21 20:52:05 +00:00
|
|
|
|
2010-08-29 18:46:58 +00:00
|
|
|
def change_session_count(num):
|
|
|
|
|
"""
|
|
|
|
|
Count number of connected users by use of a config value
|
|
|
|
|
|
|
|
|
|
num can be a positive or negative value. If 0, the counter
|
|
|
|
|
will be reset to 0.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if num == 0:
|
|
|
|
|
# reset
|
|
|
|
|
ConfigValue.objects.conf('nr_sessions', 0)
|
|
|
|
|
|
|
|
|
|
nr = ConfigValue.objects.conf('nr_sessions')
|
|
|
|
|
if nr == None:
|
|
|
|
|
nr = 0
|
|
|
|
|
else:
|
|
|
|
|
nr = int(nr)
|
|
|
|
|
nr += num
|
|
|
|
|
ConfigValue.objects.conf('nr_sessions', str(nr))
|
|
|
|
|
|
|
|
|
|
|
2006-12-22 01:40:40 +00:00
|
|
|
def remove_session(session):
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
|
|
|
|
Removes a session from the session list.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
2010-08-29 18:46:58 +00:00
|
|
|
SESSIONS.remove(session)
|
|
|
|
|
change_session_count(-1)
|
|
|
|
|
logger.log_infomsg('Sessions active: %d' % (len(get_sessions()),))
|
|
|
|
|
except ValueError:
|
|
|
|
|
# the session was already removed.
|
|
|
|
|
logger.log_errmsg("Unable to remove session: %s" % (session,))
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
def find_sessions_from_username(username):
|
|
|
|
|
"""
|
|
|
|
|
Given a username, return any matching sessions.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
uobj = User.objects.get(username=username)
|
|
|
|
|
uid = uobj.id
|
|
|
|
|
return [session for session in SESSIONS if session.uid == uid]
|
|
|
|
|
except User.DoesNotExist:
|
|
|
|
|
return None
|
|
|
|
|
|
2009-01-24 20:30:46 +00:00
|
|
|
def sessions_from_object(targ_object):
|
2008-06-13 19:52:29 +00:00
|
|
|
"""
|
2009-01-24 20:30:46 +00:00
|
|
|
Returns a list of matching session objects, or None if there are no matches.
|
2008-06-13 19:52:29 +00:00
|
|
|
|
|
|
|
|
targobject: (Object) The object to match.
|
|
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
return [session for session in SESSIONS
|
|
|
|
|
if session.get_character() == targ_object]
|
2008-06-15 20:31:25 +00:00
|
|
|
|
2010-08-29 18:46:58 +00:00
|
|
|
def announce_all(message):
|
2008-06-15 20:31:25 +00:00
|
|
|
"""
|
|
|
|
|
Announces something to all connected players.
|
|
|
|
|
"""
|
2010-08-29 18:46:58 +00:00
|
|
|
for session in get_sessions():
|
|
|
|
|
session.msg('%s' % message)
|