Changed importing of SESSION_HANDLER to avoid circular imports when extending Portal or Server SessionHandler.

This commit is contained in:
Andrew Bastien 2023-05-11 20:39:30 -04:00
parent 3d3bd5e9d7
commit 53d963e14c
25 changed files with 118 additions and 152 deletions

View file

@ -20,6 +20,7 @@ from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.utils import timezone
from django.utils.module_loading import import_string
from django.utils.translation import gettext as _
import evennia
from evennia.accounts.manager import AccountManager
from evennia.accounts.models import AccountDB
from evennia.commands.cmdsethandler import CmdSetHandler
@ -41,8 +42,6 @@ from evennia.utils.utils import is_iter, lazy_property, make_iter, to_str, varia
__all__ = ("DefaultAccount", "DefaultGuest")
_SESSIONS = None
_AT_SEARCH_RESULT = variable_from_module(*settings.SEARCH_AT_RESULT.rsplit(".", 1))
_MULTISESSION_MODE = settings.MULTISESSION_MODE
_AUTO_CREATE_CHARACTER_WITH_ACCOUNT = settings.AUTO_CREATE_CHARACTER_WITH_ACCOUNT
@ -95,13 +94,10 @@ class AccountSessionHandler(object):
is given, this is a list with one (or zero) elements.
"""
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
if sessid:
return make_iter(_SESSIONS.session_from_account(self.account, sessid))
return make_iter(evennia.SESSION_HANDLER.session_from_account(self.account, sessid))
else:
return _SESSIONS.sessions_from_account(self.account)
return evennia.SESSION_HANDLER.sessions_from_account(self.account)
def all(self):
"""
@ -284,10 +280,7 @@ class DefaultAccount(AccountDB, metaclass=TypeclassBase):
reason (str, optional): Eventual reason for the disconnect.
"""
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
_SESSIONS.disconnect(session, reason)
evennia.SESSION_HANDLER.disconnect(session, reason)
# puppeting operations

View file

@ -9,6 +9,7 @@ import time
from django.conf import settings
from django.utils.translation import gettext as _
import evennia
from evennia.accounts.accounts import DefaultAccount
from evennia.scripts.scripts import DefaultScript
from evennia.utils import logger, search, utils
@ -21,8 +22,6 @@ _RSS_ENABLED = settings.RSS_ENABLED
_GRAPEVINE_ENABLED = settings.GRAPEVINE_ENABLED
_DISCORD_ENABLED = settings.DISCORD_ENABLED and hasattr(settings, "DISCORD_BOT_TOKEN")
_SESSIONS = None
class BotStarter(DefaultScript):
"""
@ -61,10 +60,7 @@ class BotStarter(DefaultScript):
instead. This keeps the bot getting hit by IDLE_TIMEOUT.
"""
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
for session in _SESSIONS.sessions_from_account(self.account):
for session in evennia.SESSION_HANDLER.sessions_from_account(self.account):
session.update_session_counters(idle=True)
@ -170,10 +166,6 @@ class IRCBot(Bot):
self.delete()
return
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
# if keywords are given, store (the BotStarter script
# will not give any keywords, so this should normally only
# happen at initialization)
@ -208,7 +200,7 @@ class IRCBot(Bot):
"port": self.db.irc_port,
"ssl": self.db.irc_ssl,
}
_SESSIONS.start_bot_session(self.factory_path, configdict)
evennia.SESSION_HANDLER.start_bot_session(self.factory_path, configdict)
def at_msg_send(self, **kwargs):
"Shortcut here or we can end up in infinite loop"
@ -336,12 +328,9 @@ class IRCBot(Bot):
if txt.lower().startswith("who"):
# return server WHO list (abbreviated for IRC)
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
whos = []
t0 = time.time()
for sess in _SESSIONS.get_sessions():
for sess in evennia.SESSION_HANDLER.get_sessions():
delta_cmd = t0 - sess.cmd_last_visible
delta_conn = t0 - session.conn_time
account = sess.get_account()
@ -407,10 +396,6 @@ class RSSBot(Bot):
self.delete()
return
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
if ev_channel:
# connect to Evennia channel
channel = search.channel_search(ev_channel)
@ -425,7 +410,7 @@ class RSSBot(Bot):
# instruct the server and portal to create a new session with
# the stored configuration
configdict = {"uid": self.dbid, "url": self.db.rss_url, "rate": self.db.rss_rate}
_SESSIONS.start_bot_session("evennia.server.portal.rss.RSSBotFactory", configdict)
evennia.SESSION_HANDLER.start_bot_session("evennia.server.portal.rss.RSSBotFactory", configdict)
def execute_cmd(self, txt=None, session=None, **kwargs):
"""
@ -468,10 +453,6 @@ class GrapevineBot(Bot):
self.delete()
return
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSIONS as _SESSIONS
# connect to Evennia channel
if ev_channel:
# connect to Evennia channel
@ -488,7 +469,7 @@ class GrapevineBot(Bot):
# these will be made available as properties on the protocol factory
configdict = {"uid": self.dbid, "grapevine_channel": self.db.grapevine_channel}
_SESSIONS.start_bot_session(self.factory_path, configdict)
evennia.SESSION_HANDLER.start_bot_session(self.factory_path, configdict)
def at_msg_send(self, **kwargs):
"Shortcut here or we can end up in infinite loop"
@ -619,12 +600,9 @@ class DiscordBot(Bot):
channel.connect(self)
# connect
global _SESSIONS
if not _SESSIONS:
from evennia.server.sessionhandler import SESSION_HANDLER as _SESSIONS
# these will be made available as properties on the protocol factory
configdict = {"uid": self.dbid}
_SESSIONS.start_bot_session(self.factory_path, configdict)
evennia.SESSION_HANDLER.start_bot_session(self.factory_path, configdict)
def at_pre_channel_msg(self, message, channel, senders=None, **kwargs):
"""

View file

@ -6,6 +6,7 @@ from unittest import TestCase
from django.test import override_settings
from mock import MagicMock, Mock, patch
import evennia
from evennia.accounts.accounts import (
AccountSessionHandler,
DefaultAccount,
@ -37,22 +38,20 @@ class TestAccountSessionHandler(TestCase):
self.assertEqual(self.handler.get(), [])
self.assertEqual(self.handler.get(100), [])
import evennia.server.sessionhandler
s1 = MagicMock()
s1.logged_in = True
s1.uid = self.account.uid
evennia.server.sessionhandler.SESSIONS[s1.uid] = s1
evennia.SESSION_HANDLER[s1.uid] = s1
s2 = MagicMock()
s2.logged_in = True
s2.uid = self.account.uid + 1
evennia.server.sessionhandler.SESSIONS[s2.uid] = s2
evennia.SESSION_HANDLER[s2.uid] = s2
s3 = MagicMock()
s3.logged_in = False
s3.uid = self.account.uid + 2
evennia.server.sessionhandler.SESSIONS[s3.uid] = s3
evennia.SESSION_HANDLER[s3.uid] = s3
self.assertEqual([s.uid for s in self.handler.get()], [s1.uid])
self.assertEqual([s.uid for s in [self.handler.get(self.account.uid)]], [s1.uid])
@ -251,8 +250,6 @@ class TestDefaultAccount(TestCase):
def test_puppet_object_already_puppeting(self):
"Check puppet_object method called, already puppeting this"
import evennia.server.sessionhandler
account = create.create_account(
f"TestAccount{randint(0, 999999)}",
email="test@test.com",
@ -260,7 +257,7 @@ class TestDefaultAccount(TestCase):
typeclass=DefaultAccount,
)
self.s1.uid = account.uid
evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1
evennia.SESSION_HANDLER[self.s1.uid] = self.s1
self.s1.logged_in = True
self.s1.data_out = Mock(return_value=None)
@ -276,8 +273,6 @@ class TestDefaultAccount(TestCase):
def test_puppet_object_no_permission(self):
"Check puppet_object method called, no permission"
import evennia.server.sessionhandler
account = create.create_account(
f"TestAccount{randint(0, 999999)}",
email="test@test.com",
@ -285,7 +280,7 @@ class TestDefaultAccount(TestCase):
typeclass=DefaultAccount,
)
self.s1.uid = account.uid
evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1
evennia.SESSION_HANDLER[self.s1.uid] = self.s1
self.s1.data_out = MagicMock()
obj = Mock()
@ -302,8 +297,6 @@ class TestDefaultAccount(TestCase):
def test_puppet_object_joining_other_session(self):
"Check puppet_object method called, joining other session"
import evennia.server.sessionhandler
account = create.create_account(
f"TestAccount{randint(0, 999999)}",
email="test@test.com",
@ -311,7 +304,7 @@ class TestDefaultAccount(TestCase):
typeclass=DefaultAccount,
)
self.s1.uid = account.uid
evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1
evennia.SESSION_HANDLER[self.s1.uid] = self.s1
self.s1.puppet = None
self.s1.logged_in = True
@ -332,8 +325,6 @@ class TestDefaultAccount(TestCase):
def test_puppet_object_already_puppeted(self):
"Check puppet_object method called, already puppeted"
import evennia.server.sessionhandler
account = create.create_account(
f"TestAccount{randint(0, 999999)}",
email="test@test.com",
@ -342,7 +333,7 @@ class TestDefaultAccount(TestCase):
)
self.account = account
self.s1.uid = account.uid
evennia.server.sessionhandler.SESSIONS[self.s1.uid] = self.s1
evennia.SESSION_HANDLER[self.s1.uid] = self.s1
self.s1.puppet = None
self.s1.logged_in = True
@ -410,7 +401,7 @@ class TestDefaultAccountEv(BaseEvenniaTest):
# test no sessions
with patch(
"evennia.accounts.accounts._SESSIONS.sessions_from_account", return_value=[]
"evennia.SESSION_HANDLER.sessions_from_account", return_value=[]
) as mock_sessh:
idle = self.account.idle_time
self.assertEqual(idle, None)
@ -423,7 +414,7 @@ class TestDefaultAccountEv(BaseEvenniaTest):
# test no sessions
with patch(
"evennia.accounts.accounts._SESSIONS.sessions_from_account", return_value=[]
"evennia.SESSION_HANDLER.sessions_from_account", return_value=[]
) as mock_sessh:
idle = self.account.connection_time
self.assertEqual(idle, None)