From 7e2afe431680b2f01d95290c0f0b4395e8f1827c Mon Sep 17 00:00:00 2001 From: sorressean Date: Fri, 5 Jan 2018 02:33:29 -0500 Subject: [PATCH 1/4] Fixed typo in help message that shows syntax. --- evennia/commands/default/building.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index f4a001e6d2..9f3e2303a9 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -2686,7 +2686,7 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS): def _show_prototypes(prototypes): """Helper to show a list of available prototypes""" prots = ", ".join(sorted(prototypes.keys())) - return "\nAvailable prototypes (case sensistive): %s" % ( + return "\nAvailable prototypes (case sensative): %s" % ( "\n" + utils.fill(prots) if prots else "None") prototypes = spawn(return_prototypes=True) From 61f02309e4c334f6278c6322e318b78c94d54b5d Mon Sep 17 00:00:00 2001 From: sorressean Date: Fri, 5 Jan 2018 02:38:35 -0500 Subject: [PATCH 2/4] spelled correctly this time. --- evennia/commands/default/building.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 9f3e2303a9..78aa7d7553 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -2686,7 +2686,7 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS): def _show_prototypes(prototypes): """Helper to show a list of available prototypes""" prots = ", ".join(sorted(prototypes.keys())) - return "\nAvailable prototypes (case sensative): %s" % ( + return "\nAvailable prototypes (case sensitive): %s" % ( "\n" + utils.fill(prots) if prots else "None") prototypes = spawn(return_prototypes=True) From e3de3fb1dc71caa9305fc42d31e8086453bc2271 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 6 Jan 2018 19:19:20 +0100 Subject: [PATCH 3/4] Make DELAY_CMD_LOGINSTART configurable in settings --- evennia/server/sessionhandler.py | 10 ++++------ evennia/settings_default.py | 8 ++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/evennia/server/sessionhandler.py b/evennia/server/sessionhandler.py index 49d9b46498..423bc87f1c 100644 --- a/evennia/server/sessionhandler.py +++ b/evennia/server/sessionhandler.py @@ -65,6 +65,7 @@ from django.utils.translation import ugettext as _ _SERVERNAME = settings.SERVERNAME _MULTISESSION_MODE = settings.MULTISESSION_MODE _IDLE_TIMEOUT = settings.IDLE_TIMEOUT +_DELAY_CMD_LOGINSTART = settings.DELAY_CMD_LOGINSTART _MAX_SERVER_COMMANDS_PER_SECOND = 100.0 _MAX_SESSION_COMMANDS_PER_SECOND = 5.0 _MODEL_MAP = None @@ -319,12 +320,9 @@ class ServerSessionHandler(SessionHandler): sess.logged_in = False sess.uid = None - # show the first login command - - # this delay is necessary notably for Mudlet, which will fail on the connection screen - # unless the MXP protocol has been negotiated. Unfortunately this may be too short for some - # networks, the symptom is that < and > are not parsed by mudlet on first connection. - delay(0.3, self._run_cmd_login, sess) + # show the first login command, may delay slightly to allow + # the handshakes to finish. + delay(_DELAY_CMD_LOGINSTART, self._run_cmd_login, sess) def portal_session_sync(self, portalsessiondata): """ diff --git a/evennia/settings_default.py b/evennia/settings_default.py index b1e2a7a79e..7ae45c4be2 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -307,6 +307,14 @@ CMD_IGNORE_PREFIXES = "@&/+" # This module should contain one or more variables # with strings defining the look of the screen. CONNECTION_SCREEN_MODULE = "server.conf.connection_screens" +# Delay to use before sending the evennia.syscmdkeys.CMD_LOGINSTART Command +# when a new session connects (this defaults the unloggedin-look for showing +# the connection screen). The delay is useful mainly for telnet, to allow +# client/server to establish client capabilities like color/mxp etc before +# sending any text. A value of 0.3 should be enough. While a good idea, it may +# cause issues with menu-logins and autoconnects since the menu will not have +# started when the autoconnects starts sending menu commands. +DELAY_CMD_LOGINSTART = 0.3 # An optional module that, if existing, must hold a function # named at_initial_setup(). This hook method can be used to customize # the server's initial setup sequence (the very first startup of the system). From d2b89b7613fb3a48145d6cfd15fc7288e7928eb3 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 6 Jan 2018 20:12:51 +0100 Subject: [PATCH 4/4] Update/refactor search_channel with aliases and proper query. Resolves #1534. --- evennia/comms/managers.py | 53 +++++++++++++++++--------------------- evennia/objects/manager.py | 10 ++++--- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/evennia/comms/managers.py b/evennia/comms/managers.py index f50d813123..dc541528c7 100644 --- a/evennia/comms/managers.py +++ b/evennia/comms/managers.py @@ -355,15 +355,16 @@ class ChannelDBManager(TypedObjectManager): channel (Channel or None): A channel match. """ - # first check the channel key - channels = self.filter(db_key__iexact=channelkey) - if not channels: - # also check aliases - channels = [channel for channel in self.all() - if channelkey in channel.aliases.all()] - if channels: - return channels[0] - return None + dbref = self.dbref(channelkey) + if dbref: + try: + return self.get(id=dbref) + except self.model.DoesNotExist: + pass + results = self.filter(Q(db_key__iexact=channelkey) | + Q(db_tags__db_tagtype__iexact="alias", + db_tags__db_key__iexact=channelkey)).distinct() + return results[0] if results else None def get_subscriptions(self, subscriber): """ @@ -393,26 +394,20 @@ class ChannelDBManager(TypedObjectManager): case sensitive) match. """ - channels = [] - if not ostring: - return channels - try: - # try an id match first - dbref = int(ostring.strip('#')) - channels = self.filter(id=dbref) - except Exception: - # Usually because we couldn't convert to int - not a dbref - pass - if not channels: - # no id match. Search on the key. - if exact: - channels = self.filter(db_key__iexact=ostring) - else: - channels = self.filter(db_key__icontains=ostring) - if not channels: - # still no match. Search by alias. - channels = [channel for channel in self.all() - if ostring.lower() in [a.lower for a in channel.aliases.all()]] + dbref = self.dbref(ostring) + if dbref: + try: + return self.get(id=dbref) + except self.model.DoesNotExist: + pass + if exact: + channels = self.filter(Q(db_key__iexact=ostring) | + Q(db_tags__db_tagtype__iexact="alias", + db_tags__db_key__iexact=ostring)).distinct() + else: + channels = self.filter(Q(db_key__icontains=ostring) | + Q(db_tags__db_tagtype__iexact="alias", + db_tags__db_key__icontains=ostring)).distinct() return channels # back-compatibility alias channel_search = search_channel diff --git a/evennia/objects/manager.py b/evennia/objects/manager.py index 3d29768e5a..4c81ea186a 100644 --- a/evennia/objects/manager.py +++ b/evennia/objects/manager.py @@ -76,10 +76,14 @@ class ObjectDBManager(TypedObjectManager): # simplest case - search by dbref dbref = self.dbref(ostring) if dbref: - return dbref + try: + return self.get(id=dbref) + except self.model.DoesNotExist: + pass + # not a dbref. Search by name. - cand_restriction = candidates is not None and Q(pk__in=[_GA(obj, "id") for obj in make_iter(candidates) - if obj]) or Q() + cand_restriction = candidates is not None and Q( + pk__in=[_GA(obj, "id") for obj in make_iter(candidates) if obj]) or Q() if exact: return self.filter(cand_restriction & Q(db_account__username__iexact=ostring)) else: # fuzzy matching