From 0493dc0b4edce5be6dd37d7a9727fe6f349378e5 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 18 Oct 2015 17:24:17 +0200 Subject: [PATCH 01/13] Added nattributes/attributes on ServerSessions as mock non-db-persistent handlers (both pointing to the same NAttributeHandler) in order to better match the API of Objects. Resolves #827. --- evennia/server/serversession.py | 141 ++++++++++++++++++++++++++++---- evennia/typeclasses/models.py | 4 +- 2 files changed, 128 insertions(+), 17 deletions(-) diff --git a/evennia/server/serversession.py b/evennia/server/serversession.py index 492e58256..cf91408d4 100644 --- a/evennia/server/serversession.py +++ b/evennia/server/serversession.py @@ -8,19 +8,21 @@ are stored on the Portal side) """ import re +import weakref from time import time from django.utils import timezone from django.conf import settings from evennia.comms.models import ChannelDB from evennia.utils import logger from evennia.utils.inlinefunc import parse_inlinefunc -from evennia.utils.utils import make_iter +from evennia.utils.utils import make_iter, lazy_property from evennia.commands.cmdhandler import cmdhandler from evennia.commands.cmdsethandler import CmdSetHandler from evennia.server.session import Session _IDLE_COMMAND = settings.IDLE_COMMAND _GA = object.__getattribute__ +_SA = object.__setattr__ _ObjectDB = None _ANSI = None _INLINEFUNC_ENABLED = settings.INLINEFUNC_ENABLED @@ -30,6 +32,121 @@ _RE_SCREENREADER_REGEX = re.compile(r"%s" % settings.SCREENREADER_REGEX_STRIP, r from django.utils.translation import ugettext as _ +# Handlers for Session.db/ndb operation + +class NDbHolder(object): + "Holder for allowing property access of attributes" + def __init__(self, obj, name, manager_name='attributes'): + _SA(self, name, _GA(obj, manager_name)) + _SA(self, 'name', name) + + def __getattribute__(self, attrname): + if attrname == 'all': + # we allow to overload our default .all + attr = _GA(self, _GA(self, 'name')).get("all") + return attr if attr else _GA(self, "all") + return _GA(self, _GA(self, 'name')).get(attrname) + + def __setattr__(self, attrname, value): + _GA(self, _GA(self, 'name')).add(attrname, value) + + def __delattr__(self, attrname): + _GA(self, _GA(self, 'name')).remove(attrname) + + def get_all(self): + return _GA(self, _GA(self, 'name')).all() + all = property(get_all) + + +class NAttributeHandler(object): + """ + NAttributeHandler version without recache protection. + This stand-alone handler manages non-database saving. + It is similar to `AttributeHandler` and is used + by the `.ndb` handler in the same way as `.db` does + for the `AttributeHandler`. + """ + def __init__(self, obj): + """ + Initialized on the object + """ + self._store = {} + self.obj = weakref.proxy(obj) + + def has(self, key): + """ + Check if object has this attribute or not. + + Args: + key (str): The Nattribute key to check. + + Returns: + has_nattribute (bool): If Nattribute is set or not. + + """ + return key in self._store + + def get(self, key): + """ + Get the named key value. + + Args: + key (str): The Nattribute key to get. + + Returns: + the value of the Nattribute. + + """ + return self._store.get(key, None) + + def add(self, key, value): + """ + Add new key and value. + + Args: + key (str): The name of Nattribute to add. + value (any): The value to store. + + """ + self._store[key] = value + + def remove(self, key): + """ + Remove Nattribute from storage. + + Args: + key (str): The name of the Nattribute to remove. + + """ + if key in self._store: + del self._store[key] + + def clear(self): + """ + Remove all NAttributes from handler. + + """ + self._store = {} + + def all(self, return_tuples=False): + """ + List the contents of the handler. + + Args: + return_tuples (bool, optional): Defines if the Nattributes + are returns as a list of keys or as a list of `(key, value)`. + + Returns: + nattributes (list): A list of keys `[key, key, ...]` or a + list of tuples `[(key, value), ...]` depending on the + setting of `return_tuples`. + + """ + if return_tuples: + return [(key, value) for (key, value) in self._store.items() if not key.startswith("_")] + return [key for key in self._store if not key.startswith("_")] + + #------------------------------------------------------------ # Server Session #------------------------------------------------------------ @@ -323,6 +440,14 @@ class ServerSession(Session): # (note that no databse is involved at all here. session.db.attr = # value just saves a normal property in memory, just like ndb). + @lazy_property + def nattributes(self): + return NAttributeHandler(self) + + @lazy_property + def attributes(self): + return self.nattributes + #@property def ndb_get(self): """ @@ -335,19 +460,7 @@ class ServerSession(Session): try: return self._ndb_holder except AttributeError: - class NdbHolder(object): - "Holder for storing non-persistent attributes." - def all(self): - return [val for val in self.__dict__.keys() - if not val.startswith['_']] - - def __getattribute__(self, key): - # return None if no matching attribute was found. - try: - return object.__getattribute__(self, key) - except AttributeError: - return None - self._ndb_holder = NdbHolder() + self._ndb_holder = NDbHolder(self, "nattrhandler", manager_name="nattributes") return self._ndb_holder #@ndb.setter diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index 49a74226a..8832c08f2 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -122,9 +122,7 @@ class DbHolder(object): if attrname == 'all': # we allow to overload our default .all attr = _GA(self, _GA(self, 'name')).get("all") - if attr: - return attr - return _GA(self, "all") + return attr if attr else _GA(self, "all") return _GA(self, _GA(self, 'name')).get(attrname) def __setattr__(self, attrname, value): From 0384fcc63d5cef3c52bc3b23cf44205be9f80f45 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 21:45:54 +0000 Subject: [PATCH 02/13] Move to python3 style except. --- evennia/commands/cmdhandler.py | 2 +- evennia/commands/cmdsethandler.py | 6 +++--- evennia/commands/default/batchprocess.py | 4 ++-- evennia/commands/default/building.py | 2 +- evennia/commands/default/player.py | 4 ++-- evennia/commands/default/unloggedin.py | 4 ++-- evennia/comms/comms.py | 2 +- evennia/contrib/email_login.py | 2 +- evennia/contrib/menusystem.py | 2 +- evennia/objects/models.py | 2 +- evennia/server/evennia_launcher.py | 6 +++--- evennia/server/evennia_runner.py | 8 ++++---- evennia/server/oob_cmds.py | 2 +- evennia/server/oobhandler.py | 2 +- evennia/server/portal/ssh.py | 4 ++-- evennia/server/portal/ssl.py | 4 ++-- evennia/server/portal/telnet.py | 6 +++--- evennia/server/portal/websocket_client.py | 2 +- evennia/utils/batchprocessors.py | 2 +- evennia/utils/eveditor.py | 6 +++--- evennia/utils/evtable.py | 4 ++-- evennia/utils/logger.py | 10 +++++----- evennia/utils/txws.py | 2 +- evennia/utils/utils.py | 6 +++--- 24 files changed, 47 insertions(+), 47 deletions(-) diff --git a/evennia/commands/cmdhandler.py b/evennia/commands/cmdhandler.py index 9579d2c94..b30a4bdd6 100644 --- a/evennia/commands/cmdhandler.py +++ b/evennia/commands/cmdhandler.py @@ -565,7 +565,7 @@ def cmdhandler(called_by, raw_string, _testing=False, callertype="session", sess # catch it here and don't pass it on. pass - except ExecSystemCommand, exc: + except ExecSystemCommand as exc: # Not a normal command: run a system command, if available, # or fall back to a return string. syscmd = exc.syscmd diff --git a/evennia/commands/cmdsethandler.py b/evennia/commands/cmdsethandler.py index c4a52507e..5ef1d5767 100644 --- a/evennia/commands/cmdsethandler.py +++ b/evennia/commands/cmdsethandler.py @@ -159,7 +159,7 @@ def import_cmdset(path, cmdsetobj, emit_to_obj=None, no_logging=False): cmdsetclass = cmdsetclass(cmdsetobj) errstring = "" return cmdsetclass - except ImportError, e: + except ImportError as e: logger.log_trace() errstring += _("\nError loading cmdset {path}: \"{error}\"") errstring = errstring.format(path=python_path, error=e) @@ -169,12 +169,12 @@ def import_cmdset(path, cmdsetobj, emit_to_obj=None, no_logging=False): errstring += _("\nError in loading cmdset: No cmdset class '{classname}' in {path}.") errstring = errstring.format(classname=classname, path=python_path) break - except SyntaxError, e: + except SyntaxError as e: logger.log_trace() errstring += _("\nSyntaxError encountered when loading cmdset '{path}': \"{error}\".") errstring = errstring.format(path=python_path, error=e) break - except Exception, e: + except Exception as e: logger.log_trace() errstring += _("\nCompile/Run error when loading cmdset '{path}': \"{error}\".") errstring = errstring.format(path=python_path, error=e) diff --git a/evennia/commands/default/batchprocess.py b/evennia/commands/default/batchprocess.py index 1e2a45238..7a3dd3fc4 100644 --- a/evennia/commands/default/batchprocess.py +++ b/evennia/commands/default/batchprocess.py @@ -239,7 +239,7 @@ class CmdBatchCommands(MuxCommand): try: commands = BATCHCMD.parse_file(python_path) - except UnicodeDecodeError, err: + except UnicodeDecodeError as err: caller.msg(_UTF8_ERROR % (python_path, err)) return except IOError as err: @@ -346,7 +346,7 @@ class CmdBatchCode(MuxCommand): #parse indata file try: codes = BATCHCODE.parse_file(python_path, debug=debug) - except UnicodeDecodeError, err: + except UnicodeDecodeError as err: caller.msg(_UTF8_ERROR % (python_path, err)) return except IOError: diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index ea8168cbe..d78789700 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -1774,7 +1774,7 @@ class CmdLock(ObjManipCommand): lockdef = re.sub(r"\'|\"", "", lockdef) try: ok = obj.locks.add(lockdef) - except LockException, e: + except LockException as e: caller.msg(str(e)) if ok: caller.msg("Added lock '%s' to %s." % (lockdef, obj)) diff --git a/evennia/commands/default/player.py b/evennia/commands/default/player.py index 941201793..36ee23ec0 100644 --- a/evennia/commands/default/player.py +++ b/evennia/commands/default/player.py @@ -258,7 +258,7 @@ class CmdIC(MuxPlayerCommand): try: player.puppet_object(sessid, new_character) player.db._last_puppet = new_character - except RuntimeError, exc: + except RuntimeError as exc: self.msg("{rYou cannot become {C%s{n: %s" % (new_character.name, exc)) @@ -298,7 +298,7 @@ class CmdOOC(MuxPlayerCommand): player.unpuppet_object(sessid) self.msg("\n{GYou go OOC.{n\n") player.execute_cmd("look", sessid=sessid) - except RuntimeError, exc: + except RuntimeError as exc: self.msg("{rCould not unpuppet from {c%s{n: %s" % (old_char, exc)) class CmdSessions(MuxPlayerCommand): diff --git a/evennia/commands/default/unloggedin.py b/evennia/commands/default/unloggedin.py index f2063825a..4751c2d8f 100644 --- a/evennia/commands/default/unloggedin.py +++ b/evennia/commands/default/unloggedin.py @@ -467,7 +467,7 @@ def _create_player(session, playername, password, permissions, typeclass=None): new_player = create.create_player(playername, None, password, permissions=permissions, typeclass=typeclass) - except Exception, e: + except Exception as e: session.msg("There was an error creating the Player:\n%s\n If this problem persists, contact an admin." % e) logger.log_trace() return False @@ -505,7 +505,7 @@ def _create_character(session, new_player, typeclass, home, permissions): new_character.db.desc = "This is a Player." # We need to set this to have @ic auto-connect to this character new_player.db._last_puppet = new_character - except Exception, e: + except Exception as e: session.msg("There was an error creating the Character:\n%s\n If this problem persists, contact an admin." % e) logger.log_trace() return False diff --git a/evennia/comms/comms.py b/evennia/comms/comms.py index a8d9b4bdf..c7403f5be 100644 --- a/evennia/comms/comms.py +++ b/evennia/comms/comms.py @@ -200,7 +200,7 @@ class DefaultChannel(ChannelDB): # note our addition of the from_channel keyword here. This could be checked # by a custom player.msg() to treat channel-receives differently. entity.msg(msg.message, from_obj=msg.senders, from_channel=self.id) - except AttributeError, e: + except AttributeError as e: logger.log_trace("%s\nCannot send msg to '%s'." % (e, entity)) def msg(self, msgobj, header=None, senders=None, sender_strings=None, diff --git a/evennia/contrib/email_login.py b/evennia/contrib/email_login.py index 0f73797fc..cee8a1484 100644 --- a/evennia/contrib/email_login.py +++ b/evennia/contrib/email_login.py @@ -208,7 +208,7 @@ its and @/./+/-/_ only.") # this echoes the restrictions made by django's auth m new_player = create.create_player(playername, email, password, permissions=permissions) - except Exception, e: + except Exception as e: session.msg("There was an error creating the default Player/Character:\n%s\n If this problem persists, contact an admin." % e) logger.log_trace() return diff --git a/evennia/contrib/menusystem.py b/evennia/contrib/menusystem.py index 3e81c30cf..3bc52c2fe 100644 --- a/evennia/contrib/menusystem.py +++ b/evennia/contrib/menusystem.py @@ -72,7 +72,7 @@ class CmdMenuNode(Command): if self.callback: try: self.callback() - except Exception, e: + except Exception as e: self.caller.msg("%s\n{rThere was an error with this selection.{n" % e) else: self.caller.msg("{rThis option is not available.{n") diff --git a/evennia/objects/models.py b/evennia/objects/models.py index 7d8bcc92f..8136145cd 100644 --- a/evennia/objects/models.py +++ b/evennia/objects/models.py @@ -267,7 +267,7 @@ class ObjectDB(TypedObject): errmsg = "Error: %s.location = %s creates a location loop." % (self.key, location) logger.log_errmsg(errmsg) raise #RuntimeError(errmsg) - except Exception, e: + except Exception as e: errmsg = "Error (%s): %s is not a valid location." % (str(e), location) logger.log_errmsg(errmsg) raise #Exception(errmsg) diff --git a/evennia/server/evennia_launcher.py b/evennia/server/evennia_launcher.py index 303c7095f..c1f4f6469 100644 --- a/evennia/server/evennia_launcher.py +++ b/evennia/server/evennia_launcher.py @@ -527,7 +527,7 @@ def check_database(): from evennia.players.models import PlayerDB try: PlayerDB.objects.get(id=1) - except django.db.utils.OperationalError, e: + except django.db.utils.OperationalError as e: print ERROR_DATABASE.format(traceback=e) sys.exit() except PlayerDB.DoesNotExist: @@ -783,7 +783,7 @@ def init_game_directory(path, check_db=True): # test existence of the settings module try: from django.conf import settings - except Exception, ex: + except Exception as ex: if not str(ex).startswith("No module named"): import traceback print traceback.format_exc().strip() @@ -1226,7 +1226,7 @@ def main(): args.append(arg) try: django.core.management.call_command(*args, **kwargs) - except django.core.management.base.CommandError, exc: + except django.core.management.base.CommandError as exc: args = ", ".join(args) kwargs = ", ".join(["--%s" % kw for kw in kwargs]) print ERROR_INPUT.format(traceback=exc, args=args, kwargs=kwargs) diff --git a/evennia/server/evennia_runner.py b/evennia/server/evennia_runner.py index fff469135..c8a031051 100644 --- a/evennia/server/evennia_runner.py +++ b/evennia/server/evennia_runner.py @@ -144,7 +144,7 @@ def start_services(server_argv, portal_argv): def server_waiter(queue): try: rc = Popen(server_argv, env=getenv()).wait() - except Exception, e: + except Exception as e: print PROCESS_ERROR.format(component="Server", traceback=e) return # this signals the controller that the program finished @@ -153,7 +153,7 @@ def start_services(server_argv, portal_argv): def portal_waiter(queue): try: rc = Popen(portal_argv, env=getenv()).wait() - except Exception, e: + except Exception as e: print PROCESS_ERROR.format(component="Portal", traceback=e) return # this signals the controller that the program finished @@ -168,7 +168,7 @@ def start_services(server_argv, portal_argv): # normal operation: start portal as a daemon; # we don't care to monitor it for restart PORTAL = Popen(portal_argv, env=getenv()) - except IOError, e: + except IOError as e: print PROCESS_IOERROR.format(component="Portal", traceback=e) return @@ -176,7 +176,7 @@ def start_services(server_argv, portal_argv): if server_argv: # start server as a reloadable thread SERVER = thread.start_new_thread(server_waiter, (processes, )) - except IOError, e: + except IOError as e: print PROCESS_IOERROR.format(component="Server", traceback=e) return diff --git a/evennia/server/oob_cmds.py b/evennia/server/oob_cmds.py index c69e25388..9c712bb8f 100644 --- a/evennia/server/oob_cmds.py +++ b/evennia/server/oob_cmds.py @@ -201,7 +201,7 @@ def oob_send(session, *args, **kwargs): #print "MSDP SEND inp:", name value = OOB_SENDABLE.get(name, _NA)(obj) ret[name] = value - except Exception, e: + except Exception as e: ret[name] = str(e) # return, make sure to use the right case session.msg(oob=("MSDP_TABLE", (), ret)) diff --git a/evennia/server/oobhandler.py b/evennia/server/oobhandler.py index a6e061e74..330357812 100644 --- a/evennia/server/oobhandler.py +++ b/evennia/server/oobhandler.py @@ -462,7 +462,7 @@ class OOBHandler(TickerHandler): # we found an oob command. Execute it. try: oobfunc(session, *args, **kwargs) - except Exception, err: + except Exception as err: errmsg = "Exception in %s(*%s, **%s):\n%s" % (oobfuncname, args, kwargs, err) if _OOB_ERROR: _OOB_ERROR(session, errmsg, *args, **kwargs) diff --git a/evennia/server/portal/ssh.py b/evennia/server/portal/ssh.py index 0e92cf8ab..9d55e62e6 100644 --- a/evennia/server/portal/ssh.py +++ b/evennia/server/portal/ssh.py @@ -212,7 +212,7 @@ class SshProtocol(Manhole, session.Session): """ try: text = utils.to_str(text if text else "", encoding=self.encoding) - except Exception, e: + except Exception as e: self.lineSend(str(e)) return raw = kwargs.get("raw", False) @@ -382,7 +382,7 @@ def makeFactory(configdict): publicKey, privateKey = getKeyPair(pubkeyfile, privkeyfile) factory.publicKeys = {'ssh-rsa': publicKey} factory.privateKeys = {'ssh-rsa': privateKey} - except Exception, e: + except Exception as e: print " getKeyPair error: %(e)s\n WARNING: Evennia could not auto-generate SSH keypair. Using conch default keys instead." % {'e': e} print " If this error persists, create game/%(pub)s and game/%(priv)s yourself using third-party tools." % {'pub': pubkeyfile, 'priv': privkeyfile} diff --git a/evennia/server/portal/ssl.py b/evennia/server/portal/ssl.py index b17a29060..4ea623c97 100644 --- a/evennia/server/portal/ssl.py +++ b/evennia/server/portal/ssl.py @@ -44,7 +44,7 @@ def verify_SSL_key_and_cert(keyfile, certfile): rsaKey = Key(RSA.generate(KEY_LENGTH)) keyString = rsaKey.toString(type="OPENSSH") file(keyfile, 'w+b').write(keyString) - except Exception, e: + except Exception as e: print "rsaKey error: %(e)s\n WARNING: Evennia could not auto-generate SSL private key." % {'e': e} print "If this error persists, create game/%(keyfile)s yourself using third-party tools." % {'keyfile': keyfile} sys.exit(5) @@ -58,7 +58,7 @@ def verify_SSL_key_and_cert(keyfile, certfile): try: #, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) subprocess.call(exestring) - except OSError, e: + except OSError as e: string = "\n".join([ " %s\n" % e, " Evennia's SSL context factory could not automatically", diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index 623280d0d..1bc3c2b7c 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -172,12 +172,12 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): else: self.iaw_mode = False return - except Exception, err1: + except Exception as err1: conv = "" try: for b in data: conv += " " + repr(ord(b)) - except Exception, err2: + except Exception as err2: conv = str(err2) + ":", str(data) out = "Telnet Error (%s): %s (%s)" % (err1, data, conv) logger.log_trace(out) @@ -299,7 +299,7 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): try: text = utils.to_str(text if text else "", encoding=self.encoding) - except Exception, e: + except Exception as e: self.sendLine(str(e)) return if "oob" in kwargs and "OOB" in self.protocol_flags: diff --git a/evennia/server/portal/websocket_client.py b/evennia/server/portal/websocket_client.py index f28e3d350..d6da0f963 100644 --- a/evennia/server/portal/websocket_client.py +++ b/evennia/server/portal/websocket_client.py @@ -172,7 +172,7 @@ class WebSocketClient(Protocol, Session): """ try: text = to_str(text if text else "", encoding=self.encoding) - except Exception, e: + except Exception as e: self.sendLine(str(e)) if "oob" in kwargs: for cmdname, args, okwargs in kwargs["oob"]: diff --git a/evennia/utils/batchprocessors.py b/evennia/utils/batchprocessors.py index 6c8bc1c27..5ab3b2af0 100644 --- a/evennia/utils/batchprocessors.py +++ b/evennia/utils/batchprocessors.py @@ -230,7 +230,7 @@ def read_batchfile(pythonpath, file_ending='.py'): try: with codecs.open(abspath, 'r', encoding=file_encoding) as fobj: text = fobj.read() - except (ValueError, UnicodeDecodeError), e: + except (ValueError, UnicodeDecodeError) as e: # this means an encoding error; try another encoding decoderr.append(str(e)) continue diff --git a/evennia/utils/eveditor.py b/evennia/utils/eveditor.py index 9d046770f..5d50755b9 100644 --- a/evennia/utils/eveditor.py +++ b/evennia/utils/eveditor.py @@ -626,7 +626,7 @@ class EvEditor(object): """ try: self._buffer = self._loadfunc(self._caller) - except Exception, e: + except Exception as e: self._caller.msg(_ERROR_LOADFUNC.format(error=e)) def get_buffer(self): @@ -661,7 +661,7 @@ class EvEditor(object): """ try: self._quitfunc(self._caller) - except Exception, e: + except Exception as e: self._caller.msg(_ERROR_QUITFUNC.format(error=e)) del self._caller.ndb._lineeditor self._caller.cmdset.remove(EvEditorCmdSet) @@ -679,7 +679,7 @@ class EvEditor(object): # save worked. The saving function is responsible for # any status messages. self._unsaved = False - except Exception, e: + except Exception as e: self._caller.msg(_ERROR_SAVEFUNC.format(error=e)) else: self._caller.msg(_MSG_SAVE_NO_CHANGE) diff --git a/evennia/utils/evtable.py b/evennia/utils/evtable.py index 3ef66476d..e58a09f04 100644 --- a/evennia/utils/evtable.py +++ b/evennia/utils/evtable.py @@ -1266,7 +1266,7 @@ class EvTable(object): for ix, col in enumerate(self.worktable): try: col.reformat(width=cwidths[ix], **options) - except Exception, e: + except Exception as e: msg = "ix=%s, width=%s: %s" % (ix, cwidths[ix], e.message) raise #Exception ("Error in horizontal allign:\n %s" % msg) @@ -1315,7 +1315,7 @@ class EvTable(object): for iy, cell in enumerate(col): try: col.reformat_cell(iy, height=cheights[iy], **options) - except Exception, e: + except Exception as e: msg = "ix=%s, iy=%s, height=%s: %s" % (ix, iy, cheights[iy], e.message) raise Exception ("Error in vertical allign:\n %s" % msg) diff --git a/evennia/utils/logger.py b/evennia/utils/logger.py index e481c790b..011cb275d 100644 --- a/evennia/utils/logger.py +++ b/evennia/utils/logger.py @@ -40,7 +40,7 @@ def log_trace(errmsg=None): if errmsg: try: errmsg = str(errmsg) - except Exception, e: + except Exception as e: errmsg = str(e) for line in errmsg.splitlines(): log.msg('[EE] %s' % line) @@ -59,7 +59,7 @@ def log_err(errmsg): """ try: errmsg = str(errmsg) - except Exception, e: + except Exception as e: errmsg = str(e) for line in errmsg.splitlines(): log.msg('[EE] %s' % line) @@ -77,7 +77,7 @@ def log_warn(warnmsg): """ try: warnmsg = str(warnmsg) - except Exception, e: + except Exception as e: warnmsg = str(e) for line in warnmsg.splitlines(): log.msg('[WW] %s' % line) @@ -93,7 +93,7 @@ def log_info(infomsg): """ try: infomsg = str(infomsg) - except Exception, e: + except Exception as e: infomsg = str(e) for line in infomsg.splitlines(): log.msg('[..] %s' % line) @@ -109,7 +109,7 @@ def log_dep(depmsg): """ try: depmsg = str(depmsg) - except Exception, e: + except Exception as e: depmsg = str(e) for line in depmsg.splitlines(): log.msg('[DP] %s' % line) diff --git a/evennia/utils/txws.py b/evennia/utils/txws.py index 4a565eac4..8091942e3 100644 --- a/evennia/utils/txws.py +++ b/evennia/utils/txws.py @@ -420,7 +420,7 @@ class WebSocketProtocol(ProtocolWrapper): try: frames, self.buf = parser(self.buf) - except WSException, wse: + except WSException as wse: # Couldn't parse all the frames, something went wrong, let's bail. self.close(wse.args[0]) return diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index e92bc9d73..6bbecb06e 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -926,7 +926,7 @@ def mod_import(module): if errmsg: try: errmsg = to_str(errmsg) - except Exception, e: + except Exception as e: errmsg = str(e) for line in errmsg.splitlines(): log.msg('[EE] %s' % line) @@ -941,7 +941,7 @@ def mod_import(module): # first try to import as a python path try: mod = __import__(module, fromlist=["None"]) - except ImportError, ex: + except ImportError as ex: # check just where the ImportError happened (it could have been # an erroneous import inside the module as well). This is the # trivial way to do it ... @@ -1104,7 +1104,7 @@ def fuzzy_import_from_module(path, variable, default=None, defaultpaths=None): for modpath in paths: try: mod = import_module(path) - except ImportError, ex: + except ImportError as ex: if not str(ex).startswith ("No module named %s" % path): # this means the module was found but it # triggers an ImportError on import. From 418ca41803d4a7f3fee350d7334b415646838ed0 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 22:24:25 +0000 Subject: [PATCH 03/13] Move to python3 style raise. --- evennia/scripts/scripts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evennia/scripts/scripts.py b/evennia/scripts/scripts.py index aee5775c5..2cc01bf6b 100644 --- a/evennia/scripts/scripts.py +++ b/evennia/scripts/scripts.py @@ -62,7 +62,7 @@ class ExtendedLoopingCall(LoopingCall): assert not self.running, ("Tried to start an already running " "ExtendedLoopingCall.") if interval < 0: - raise ValueError, "interval must be >= 0" + raise ValueError("interval must be >= 0") self.running = True d = self.deferred = Deferred() self.starttime = self.clock.seconds() From b7577f13cd2af95d4a0dd81190fe1386ce5f2663 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 22:27:39 +0000 Subject: [PATCH 04/13] Move to python3 style exec. --- evennia/server/profiling/test_queries.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/evennia/server/profiling/test_queries.py b/evennia/server/profiling/test_queries.py index d53db20e9..aed9bcd41 100644 --- a/evennia/server/profiling/test_queries.py +++ b/evennia/server/profiling/test_queries.py @@ -15,10 +15,10 @@ def count_queries(exec_string, setup_string): to setup the environment to test. """ - exec setup_string + exec(setup_string) num_queries_old = len(connection.queries) - exec exec_string + exec(exec_string) nqueries = len(connection.queries) - num_queries_old for query in connection.queries[-nqueries if nqueries else 1:]: From 402cbed8fa5691490251c525dca3dd5283359ff4 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 22:32:05 +0000 Subject: [PATCH 05/13] Move to python3 style next. --- evennia/utils/prettytable.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/evennia/utils/prettytable.py b/evennia/utils/prettytable.py index 800afb3d7..52c30703f 100644 --- a/evennia/utils/prettytable.py +++ b/evennia/utils/prettytable.py @@ -1372,10 +1372,7 @@ def from_csv(fp, field_names = None, **kwargs): if field_names: table.field_names = field_names else: - if py3k: - table.field_names = [x.strip() for x in next(reader)] - else: - table.field_names = [x.strip() for x in reader.next()] + table.field_names = [x.strip() for x in next(reader)] for row in reader: table.add_row([x.strip() for x in row]) From bc340fbf0d7929b8f4dbb5c8366715bded0126f6 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 23:09:42 +0000 Subject: [PATCH 06/13] Remove commented out print statements. --- evennia/commands/cmdhandler.py | 4 ---- evennia/commands/cmdset.py | 1 - evennia/commands/cmdsethandler.py | 3 --- evennia/commands/default/admin.py | 1 - evennia/commands/default/building.py | 1 - evennia/commands/default/comms.py | 2 -- evennia/commands/default/general.py | 1 - evennia/commands/default/muxcommand.py | 1 - evennia/commands/default/player.py | 1 - evennia/contrib/chargen.py | 2 -- evennia/contrib/rpsystem.py | 1 - .../contrib/tutorial_examples/red_button_scripts.py | 2 -- evennia/objects/objects.py | 1 - evennia/scripts/manager.py | 4 ---- evennia/scripts/scripts.py | 1 - evennia/scripts/tickerhandler.py | 1 - evennia/server/amp.py | 11 ----------- evennia/server/initial_setup.py | 3 --- evennia/server/oob_cmds.py | 2 -- evennia/server/oobhandler.py | 1 - evennia/server/portal/portalsessionhandler.py | 4 ---- evennia/server/portal/ssl.py | 1 - evennia/server/portal/telnet.py | 8 -------- evennia/server/portal/telnet_oob.py | 7 ------- evennia/server/portal/ttype.py | 3 --- evennia/server/server.py | 1 - evennia/server/sessionhandler.py | 1 - evennia/typeclasses/attributes.py | 1 - evennia/typeclasses/models.py | 1 - evennia/utils/ansi.py | 2 -- evennia/utils/evform.py | 12 ------------ evennia/utils/evtable.py | 6 ------ evennia/utils/idmapper/models.py | 9 --------- evennia/utils/prettytable.py | 2 -- evennia/utils/tests.py | 1 - 35 files changed, 103 deletions(-) diff --git a/evennia/commands/cmdhandler.py b/evennia/commands/cmdhandler.py index b30a4bdd6..c66403de4 100644 --- a/evennia/commands/cmdhandler.py +++ b/evennia/commands/cmdhandler.py @@ -296,7 +296,6 @@ def get_and_merge_cmdsets(caller, session, player, obj, tempmergers = {} for cmdset in cmdsets: prio = cmdset.priority - #print cmdset.key, prio if prio in tempmergers: # merge same-prio cmdset together separately tempmergers[prio] = yield cmdset + tempmergers[prio] @@ -309,8 +308,6 @@ def get_and_merge_cmdsets(caller, session, player, obj, # Merge all command sets into one, beginning with the lowest-prio one cmdset = cmdsets[0] for merging_cmdset in cmdsets[1:]: - #print "<%s(%s,%s)> onto <%s(%s,%s)>" % (merging_cmdset.key, merging_cmdset.priority, merging_cmdset.mergetype, - # cmdset.key, cmdset.priority, cmdset.mergetype) cmdset = yield merging_cmdset + cmdset # store the full sets for diagnosis cmdset.merged_from = cmdsets @@ -321,7 +318,6 @@ def get_and_merge_cmdsets(caller, session, player, obj, for cset in (cset for cset in local_obj_cmdsets if cset): cset.duplicates = cset.old_duplicates - #print "merged set:", cmdset.key returnValue(cmdset) except ErrorReported: raise diff --git a/evennia/commands/cmdset.py b/evennia/commands/cmdset.py index 58912003d..b3d16d0ab 100644 --- a/evennia/commands/cmdset.py +++ b/evennia/commands/cmdset.py @@ -490,7 +490,6 @@ class CmdSet(object): commands.append(cmd) # extra run to make sure to avoid doublets self.commands = list(set(commands)) - #print "In cmdset.add(cmd):", self.key, cmd # add system_command to separate list as well, # for quick look-up if cmd.key.startswith("__"): diff --git a/evennia/commands/cmdsethandler.py b/evennia/commands/cmdsethandler.py index 5ef1d5767..b4ea3ad88 100644 --- a/evennia/commands/cmdsethandler.py +++ b/evennia/commands/cmdsethandler.py @@ -127,7 +127,6 @@ def import_cmdset(path, cmdsetobj, emit_to_obj=None, no_logging=False): try: # first try to get from cache - #print "importing %s: _CACHED_CMDSETS=%s" % (python_path, _CACHED_CMDSETS) cmdsetclass = _CACHED_CMDSETS.get(python_path, None) if not cmdsetclass: @@ -243,7 +242,6 @@ class CmdSetHandler(object): mergelist = [] if len(self.cmdset_stack) > 1: # We have more than one cmdset in stack; list them all - #print self.cmdset_stack, self.mergetype_stack for snum, cmdset in enumerate(self.cmdset_stack): mergetype = self.mergetype_stack[snum] permstring = "non-perm" @@ -310,7 +308,6 @@ class CmdSetHandler(object): if init_mode: # reimport all permanent cmdsets storage = self.obj.cmdset_storage - #print "cmdset_storage:", self.obj.cmdset_storage if storage: self.cmdset_stack = [] for pos, path in enumerate(storage): diff --git a/evennia/commands/default/admin.py b/evennia/commands/default/admin.py index 3301c7f6e..357df8ae6 100644 --- a/evennia/commands/default/admin.py +++ b/evennia/commands/default/admin.py @@ -198,7 +198,6 @@ class CmdBan(MuxCommand): # replace * with regex form and compile it ipregex = ban.replace('.', '\.') ipregex = ipregex.replace('*', '[0-9]{1,3}') - #print "regex:",ipregex ipregex = re.compile(r"%s" % ipregex) bantup = ("", ban, ipregex, now, reason) # save updated banlist diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index d78789700..afa7fbb3e 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -2416,7 +2416,6 @@ class CmdTag(MuxCommand): category = None if ":" in tag: tag, category = [part.strip() for part in tag.split(":", 1)] - #print "tag search:", tag, search_category objs = search.search_tag(tag, category=category) nobjs = len(objs) if nobjs > 0: diff --git a/evennia/commands/default/comms.py b/evennia/commands/default/comms.py index d89f23f68..c4bc7d4d0 100644 --- a/evennia/commands/default/comms.py +++ b/evennia/commands/default/comms.py @@ -267,13 +267,11 @@ class CmdChannels(MuxPlayerCommand): # all channels we have available to listen to channels = [chan for chan in ChannelDB.objects.get_all_channels() if chan.access(caller, 'listen')] - #print channels if not channels: self.msg("No channels available.") return # all channel we are already subscribed to subs = ChannelDB.objects.get_subscriptions(caller) - #print subs if self.cmdstring == "comlist": # just display the subscribed channels with no extra info diff --git a/evennia/commands/default/general.py b/evennia/commands/default/general.py index 63eb76887..04a4209d1 100644 --- a/evennia/commands/default/general.py +++ b/evennia/commands/default/general.py @@ -233,7 +233,6 @@ class CmdGet(MuxCommand): if not self.args: caller.msg("Get what?") return - #print "general/get:", caller, caller.location, self.args, caller.location.contents obj = caller.search(self.args, location=caller.location) if not obj: return diff --git a/evennia/commands/default/muxcommand.py b/evennia/commands/default/muxcommand.py index 1de7ac866..b0953a36c 100644 --- a/evennia/commands/default/muxcommand.py +++ b/evennia/commands/default/muxcommand.py @@ -100,7 +100,6 @@ class MuxCommand(Command): switches = [] if args and len(args) > 1 and args[0] == "/": # we have a switch, or a set of switches. These end with a space. - #print "'%s'" % args switches = args[1:].split(None, 1) if len(switches) > 1: switches, args = switches diff --git a/evennia/commands/default/player.py b/evennia/commands/default/player.py index 36ee23ec0..b842aaf36 100644 --- a/evennia/commands/default/player.py +++ b/evennia/commands/default/player.py @@ -592,7 +592,6 @@ class CmdColorTest(MuxPlayerCommand): string = "ANSI colors:" for row in table: string += "\n " + " ".join(row) - #print string self.msg(string) self.msg("{{X : black. {{/ : return, {{- : tab, {{_ : space, {{* : invert, {{u : underline") self.msg("To combine background and foreground, add background marker last, e.g. {{r{{[b.") diff --git a/evennia/contrib/chargen.py b/evennia/contrib/chargen.py index 683edd6c0..cf1ab8bc1 100644 --- a/evennia/contrib/chargen.py +++ b/evennia/contrib/chargen.py @@ -74,7 +74,6 @@ class CmdOOCLook(default_cmds.CmdLook): self.character = None if utils.inherits_from(self.caller, "evennia.objects.objects.Object"): # An object of some type is calling. Convert to player. - #print self.caller, self.caller.__class__ self.character = self.caller if hasattr(self.caller, "player"): self.caller = self.caller.player @@ -151,7 +150,6 @@ class CmdOOCCharacterCreate(Command): self.character = None if utils.inherits_from(self.caller, "evennia.objects.objects.Object"): # An object of some type is calling. Convert to player. - #print self.caller, self.caller.__class__ self.character = self.caller if hasattr(self.caller, "player"): self.caller = self.caller.player diff --git a/evennia/contrib/rpsystem.py b/evennia/contrib/rpsystem.py index 1b57901b0..94f19e977 100644 --- a/evennia/contrib/rpsystem.py +++ b/evennia/contrib/rpsystem.py @@ -335,7 +335,6 @@ def parse_sdescs_and_recogs(sender, candidates, string, search_mode=False): # we scan backwards so we can replace in-situ without messing # up later occurrences. Given a marker match, query from # start index forward for all candidates. - #print "marker_match:", marker_match.re.pattern, marker_match.groups() # first see if there is a number given (e.g. 1-tall) num_identifier, _ = marker_match.groups("") # return "" if no match, rather than None diff --git a/evennia/contrib/tutorial_examples/red_button_scripts.py b/evennia/contrib/tutorial_examples/red_button_scripts.py index 4146d2f41..ba369bcb6 100644 --- a/evennia/contrib/tutorial_examples/red_button_scripts.py +++ b/evennia/contrib/tutorial_examples/red_button_scripts.py @@ -79,7 +79,6 @@ class OpenLidState(DefaultScript): automatically checked, so we don't need to worry about adding the cmdset to a closed lid-button. """ - #print "In Open at_start (should add cmdset)" self.obj.cmdset.add(cmdsetexamples.LidOpenCmdSet) def is_valid(self): @@ -215,7 +214,6 @@ class BlinkButtonEvent(DefaultScript): """ Button will keep blinking unless it is broken. """ - #print "self.obj.db.lamp_works:", self.obj.db.lamp_works return self.obj.db.lamp_works def at_repeat(self): diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index 0370fa0f2..ac389bad5 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -585,7 +585,6 @@ class DefaultObject(ObjectDB): # Perform move try: - #print "move_to location:", destination self.location = destination except Exception: emit_to_obj.msg(errtxt % "location change") diff --git a/evennia/scripts/manager.py b/evennia/scripts/manager.py index 507c74c1b..3967eb2c5 100644 --- a/evennia/scripts/manager.py +++ b/evennia/scripts/manager.py @@ -197,7 +197,6 @@ class ScriptDBManager(TypedObjectManager): if dbref and self.dbref(dbref, reqhash=False): scripts = self.get_id(dbref) elif obj: - #print "calling get_all_scripts_on_obj", obj, key, VALIDATE_ITERATION scripts = self.get_all_scripts_on_obj(obj, key=key) else: scripts = self.get_all_scripts(key=key) #self.model.get_all_cached_instances() @@ -207,12 +206,9 @@ class ScriptDBManager(TypedObjectManager): VALIDATE_ITERATION -= 1 return None, None - #print "scripts to validate: [%s]" % (", ".join(script.key for script in scripts)) for script in scripts: - #print "validating %s (%i) (init_mode=%s)" % (script.key, id(script), init_mode) if script.is_valid(): nr_started += script.start(force_restart=init_mode) - #print "back from start. nr_started=", nr_started else: script.stop() nr_stopped += 1 diff --git a/evennia/scripts/scripts.py b/evennia/scripts/scripts.py index 2cc01bf6b..cf2d8971e 100644 --- a/evennia/scripts/scripts.py +++ b/evennia/scripts/scripts.py @@ -226,7 +226,6 @@ class DefaultScript(ScriptBase): callcount = self.ndb._task.callcount maxcount = self.db_repeats if maxcount > 0 and maxcount <= callcount: - #print "stopping script!" self.stop() def _step_task(self): diff --git a/evennia/scripts/tickerhandler.py b/evennia/scripts/tickerhandler.py index deb4a895c..24370b8d7 100644 --- a/evennia/scripts/tickerhandler.py +++ b/evennia/scripts/tickerhandler.py @@ -344,7 +344,6 @@ class TickerHandler(object): ticker_storage = ServerConfig.objects.conf(key=self.save_name) if ticker_storage: self.ticker_storage = dbunserialize(ticker_storage) - #print "restore:", self.ticker_storage for store_key, (args, kwargs) in self.ticker_storage.items(): obj, interval, idstring = store_key obj = unpack_dbobj(obj) diff --git a/evennia/server/amp.py b/evennia/server/amp.py index d7b62ef00..8c87c3332 100644 --- a/evennia/server/amp.py +++ b/evennia/server/amp.py @@ -101,7 +101,6 @@ class AmpServerFactory(protocol.ServerFactory): protocol (Protocol): The created protocol. """ - #print "Evennia Server connected to Portal at %s." % addr self.server.amp_protocol = AMPProtocol() self.server.amp_protocol.factory = self return self.server.amp_protocol @@ -139,7 +138,6 @@ class AmpClientFactory(protocol.ReconnectingClientFactory): """ pass - #print 'AMP started to connect:', connector def buildProtocol(self, addr): """ @@ -149,7 +147,6 @@ class AmpClientFactory(protocol.ReconnectingClientFactory): addr (str): Connection address. Not used. """ - #print "Portal connected to Evennia server at %s." % addr self.resetDelay() self.portal.amp_protocol = AMPProtocol() self.portal.amp_protocol.factory = self @@ -417,7 +414,6 @@ class AMPProtocol(amp.AMP): """ sessid, kwargs = loads(packed_data) - #print "msg portal -> server (server side):", sessid, msg, loads(ret["data"]) self.factory.server.sessions.data_in(sessid, **kwargs) return {} @@ -434,7 +430,6 @@ class AMPProtocol(amp.AMP): deferred (Deferred): Asynchronous return. """ - #print "msg portal->server (portal side):", sessid, msg, data return self.send_data(MsgPortal2Server, sessid, text=text, **kwargs) # Server -> Portal message @@ -454,7 +449,6 @@ class AMPProtocol(amp.AMP): packed_data (str): Pickled data (sessid, kwargs) coming over the wire. """ sessid, kwargs = loads(packed_data) - #print "msg server->portal (portal side):", sessid, ret["text"], loads(ret["data"]) self.factory.portal.sessions.data_out(sessid, **kwargs) return {} @@ -470,7 +464,6 @@ class AMPProtocol(amp.AMP): kwargs (any, optiona): Extra data. """ - #print "msg server->portal (server side):", sessid, msg, data return self.send_data(MsgServer2Portal, sessid, text=text, **kwargs) # Server administration from the Portal side @@ -485,12 +478,10 @@ class AMPProtocol(amp.AMP): packed_data (str): Incoming, pickled data. """ - #print "serveradmin (server side):", hashid, ipart, nparts sessid, kwargs = loads(packed_data) operation = kwargs.pop("operation", "") server_sessionhandler = self.factory.server.sessions - #print "serveradmin (server side):", sessid, ord(operation), data if operation == PCONN: # portal_session_connect # create a new session and sync it @@ -527,7 +518,6 @@ class AMPProtocol(amp.AMP): data (str or dict, optional): Data used in the administrative operation. """ - #print "serveradmin (portal side):", sessid, ord(operation), data return self.send_data(AdminPortal2Server, sessid, operation=operation, **kwargs) # Portal administraton from the Server side @@ -543,7 +533,6 @@ class AMPProtocol(amp.AMP): packed_data (str): Data received, a pickled tuple (sessid, kwargs). """ - #print "portaladmin (portal side):", sessid, ord(operation), data sessid, kwargs = loads(packed_data) operation = kwargs.pop("operation") portal_sessionhandler = self.factory.portal.sessions diff --git a/evennia/server/initial_setup.py b/evennia/server/initial_setup.py index 048bbc3e6..5eecab737 100644 --- a/evennia/server/initial_setup.py +++ b/evennia/server/initial_setup.py @@ -198,14 +198,11 @@ def handle_setup(last_step): at_initial_setup, reset_server] - #print " Initial setup: %s steps." % (len(setup_queue)) - # step through queue, from last completed function for num, setup_func in enumerate(setup_queue[last_step:]): # run the setup function. Note that if there is a # traceback we let it stop the system so the config # step is not saved. - #print "%s..." % num try: setup_func() diff --git a/evennia/server/oob_cmds.py b/evennia/server/oob_cmds.py index 9c712bb8f..d65adbdab 100644 --- a/evennia/server/oob_cmds.py +++ b/evennia/server/oob_cmds.py @@ -198,7 +198,6 @@ def oob_send(session, *args, **kwargs): if obj: for name in (a.upper() for a in args if a): try: - #print "MSDP SEND inp:", name value = OOB_SENDABLE.get(name, _NA)(obj) ret[name] = value except Exception as e: @@ -257,7 +256,6 @@ def oob_report(session, *args, **kwargs): else: OOB_HANDLER.add_attribute_monitor(obj, session.sessid, propname, "return_attribute_report") ret.append(_GA(obj, "db_value")) - #print "ret:", ret session.msg(oob=("MSDP_ARRAY", ret)) else: oob_error(session, "You must log in first.") diff --git a/evennia/server/oobhandler.py b/evennia/server/oobhandler.py index 330357812..bcf4e21af 100644 --- a/evennia/server/oobhandler.py +++ b/evennia/server/oobhandler.py @@ -448,7 +448,6 @@ class OOBHandler(TickerHandler): (session, oobfuncname, args, kwargs) raise RuntimeError(errmsg) - #print "execute_oob:", session, oobfuncname, args, kwargs try: oobfunc = _OOB_FUNCS[oobfuncname] except Exception: diff --git a/evennia/server/portal/portalsessionhandler.py b/evennia/server/portal/portalsessionhandler.py index 8dc6e0bbf..7b0f29ce8 100644 --- a/evennia/server/portal/portalsessionhandler.py +++ b/evennia/server/portal/portalsessionhandler.py @@ -110,7 +110,6 @@ class PortalSessionHandler(SessionHandler): self.sessions[session.sessid] = session session.server_connected = True - #print "connecting", session.sessid, " number:", len(self.sessions) self.portal.amp_protocol.send_AdminPortal2Server(session.sessid, operation=PCONN, sessiondata=sessdata) @@ -389,7 +388,6 @@ class PortalSessionHandler(SessionHandler): # data throttle (anti DoS measure) now = time() dT = now - self.command_counter_reset - #print " command rate:", _MAX_COMMAND_RATE / dT, dT, self.command_counter self.command_counter = 0 self.command_counter_reset = now self.command_overflow = dT < 1.0 @@ -431,9 +429,7 @@ class PortalSessionHandler(SessionHandler): if session: # convert oob to the generic format if "oob" in kwargs: - #print "oobstruct_parser in:", kwargs["oob"] kwargs["oob"] = self.oobstruct_parser(kwargs["oob"]) - #print "oobstruct_parser out:", kwargs["oob"] session.data_out(text=text, **kwargs) PORTAL_SESSIONS = PortalSessionHandler() diff --git a/evennia/server/portal/ssl.py b/evennia/server/portal/ssl.py index 4ea623c97..291896a37 100644 --- a/evennia/server/portal/ssl.py +++ b/evennia/server/portal/ssl.py @@ -54,7 +54,6 @@ def verify_SSL_key_and_cert(keyfile, certfile): # default: #openssl req -new -x509 -key ssl.key -out ssl.cert -days 7300 exestring = "openssl req -new -x509 -key %s -out %s -days %s" % (keyfile, certfile, CERT_EXPIRE) - #print "exestring:", exestring try: #, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) subprocess.call(exestring) diff --git a/evennia/server/portal/telnet.py b/evennia/server/portal/telnet.py index 1bc3c2b7c..234db4cf1 100644 --- a/evennia/server/portal/telnet.py +++ b/evennia/server/portal/telnet.py @@ -165,7 +165,6 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): """ if data and data[0] == IAC or self.iaw_mode: try: - #print "IAC mode" super(TelnetProtocol, self).dataReceived(data) if len(data) == 1: self.iaw_mode = True @@ -196,12 +195,10 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): # if we get to this point the command should end with a linebreak. # We make sure to add it, to fix some clients messing this up. - #print "line data in:", repr(data) StatefulTelnetProtocol.dataReceived(self, data) def _write(self, data): "hook overloading the one used in plain telnet" - # print "_write (%s): %s" % (self.state, " ".join(str(ord(c)) for c in data)) data = data.replace('\n', '\r\n').replace('\r\r\n', '\r\n') #data = data.replace('\n', '\r\n') super(TelnetProtocol, self)._write(mccp_compress(self, data)) @@ -214,7 +211,6 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): line (str): Line to send. """ - #print "sendLine (%s):\n%s" % (self.state, line) #escape IAC in line mode, and correctly add \r\n line += self.delimiter line = line.replace(IAC, IAC + IAC).replace('\n', '\r\n') @@ -305,7 +301,6 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): if "oob" in kwargs and "OOB" in self.protocol_flags: # oob is a list of [(cmdname, arg, kwarg), ...] for cmdname, args, okwargs in kwargs["oob"]: - #print "telnet oob data_out:", cmdname, args, kwargs self.oob.data_out(cmdname, *args, **okwargs) # parse **kwargs, falling back to ttype if nothing is given explicitly @@ -318,15 +313,12 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session): echo = kwargs.get("echo", None) mxp = kwargs.get("mxp", self.protocol_flags.get("MXP", False)) - #print "telnet kwargs=%s, message=%s" % (kwargs, text) - #print "xterm256=%s, useansi=%s, raw=%s, nomarkup=%s, init_done=%s" % (xterm256, useansi, raw, nomarkup, ttype.get("init_done")) if raw: # no processing whatsoever self.sendLine(text) elif text: # we need to make sure to kill the color at the end in order # to match the webclient output. - #print "telnet data out:", self.protocol_flags, id(self.protocol_flags), id(self), "nomarkup: %s, xterm256: %s" % (nomarkup, xterm256) linetosend = ansi.parse_ansi(_RE_N.sub("", text) + "{n", strip_ansi=nomarkup, xterm256=xterm256, mxp=mxp) if mxp: linetosend = mxp_parse(linetosend) diff --git a/evennia/server/portal/telnet_oob.py b/evennia/server/portal/telnet_oob.py index 6b6753e99..708158793 100644 --- a/evennia/server/portal/telnet_oob.py +++ b/evennia/server/portal/telnet_oob.py @@ -160,7 +160,6 @@ class TelnetOOB(object): else: msdp_string = "%s%s%s" % (MSDP_VAR. cmdname, "".join( ["%s%s%s%s" % (MSDP_VAR, key, MSDP_VAL, val) for key, val in kwargs.items()])) - #print "encode msdp result:", cmdname, args, kwargs, "->", msdp_string return force_str(msdp_string) def encode_gmcp(self, cmdname, *args, **kwargs): @@ -194,7 +193,6 @@ class TelnetOOB(object): gmcp_string = "%s %s" % (cmdname, json.dumps(args)) elif kwargs: gmcp_string = "%s %s" % (cmdname, json.dumps(kwargs)) - #print "gmcp_encode", cmdname, args, kwargs, "->", gmcp_string return force_str(gmcp_string).strip() def decode_msdp(self, data): @@ -233,8 +231,6 @@ class TelnetOOB(object): parts = msdp_regex_val.split(varval) variables[parts[0]] = tuple(parts[1:]) if len(parts) > 1 else ("", ) - #print "OOB: MSDP decode:", data, "->", variables, arrays, tables - # send to the sessionhandler if data: for varname, var in variables.items(): @@ -263,7 +259,6 @@ class TelnetOOB(object): if hasattr(data, "__iter__"): data = "".join(data) - #print "decode_gmcp:", data if data: splits = data.split(None, 1) cmdname = splits[0] @@ -282,7 +277,6 @@ class TelnetOOB(object): args = tuple(struct) else: args = (struct,) - #print "gmcp decode:", data, "->", cmdname, args, kwargs self.protocol.data_in(oob=(cmdname, args, kwargs)) # access methods @@ -296,7 +290,6 @@ class TelnetOOB(object): args, kwargs (any): Arguments to OOB command. """ - #print "data_out:", encoded_oob if self.MSDP: encoded_oob = self.encode_msdp(cmdname, *args, **kwargs) self.protocol._write(IAC + SB + MSDP + encoded_oob + IAC + SE) diff --git a/evennia/server/portal/ttype.py b/evennia/server/portal/ttype.py index f60801c0d..fc54c5360 100644 --- a/evennia/server/portal/ttype.py +++ b/evennia/server/portal/ttype.py @@ -90,8 +90,6 @@ class Ttype(object): except TypeError: pass - #print "incoming TTYPE option:", option - if self.ttype_step == 0: # just start the request chain self.protocol.requestNegotiation(TTYPE, SEND) @@ -153,7 +151,6 @@ class Ttype(object): self.protocol.protocol_flags['TTYPE'][option.upper()] = True self.protocol.protocol_flags['TTYPE']['init_done'] = True - # print "TTYPE final:", self.protocol.protocol_flags['TTYPE'] # we must sync ttype once it'd done self.protocol.handshake_done() self.ttype_step += 1 diff --git a/evennia/server/server.py b/evennia/server/server.py index ba0dcbf77..f51305902 100644 --- a/evennia/server/server.py +++ b/evennia/server/server.py @@ -268,7 +268,6 @@ class Evennia(object): #update eventual changed defaults self.update_defaults() - #print "run_init_hooks:", ObjectDB.get_all_cached_instances() [o.at_init() for o in ObjectDB.get_all_cached_instances()] [p.at_init() for p in PlayerDB.get_all_cached_instances()] diff --git a/evennia/server/sessionhandler.py b/evennia/server/sessionhandler.py index 0d5163910..c2b80d507 100644 --- a/evennia/server/sessionhandler.py +++ b/evennia/server/sessionhandler.py @@ -607,7 +607,6 @@ class ServerSessionHandler(SessionHandler): if not _OOB_HANDLER: from evennia.server.oobhandler import OOB_HANDLER as _OOB_HANDLER funcname, args, kwargs = kwargs.pop("oob") - #print "OOB session.data_in:", funcname, args, kwargs if funcname: _OOB_HANDLER.execute_cmd(session, funcname, *args, **kwargs) diff --git a/evennia/typeclasses/attributes.py b/evennia/typeclasses/attributes.py index f52be219e..a8f2e7719 100644 --- a/evennia/typeclasses/attributes.py +++ b/evennia/typeclasses/attributes.py @@ -286,7 +286,6 @@ class AttributeHandler(object): ret = [] key = [k.strip().lower() for k in make_iter(key) if k] category = category.strip().lower() if category is not None else None - #print "cache:", self._cache.keys(), key if not key: # return all with matching category (or no category) catkey = "-%s" % category if category is not None else None diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index 8832c08f2..79550f994 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -455,7 +455,6 @@ class TypedObject(SharedMemoryModel): if hasattr(self.ndb, nattr): self.nattributes.remove(nattr) else: - #print "deleting attrs ..." self.attributes.clear() self.nattributes.clear() diff --git a/evennia/utils/ansi.py b/evennia/utils/ansi.py index 73d268498..adc0aef82 100644 --- a/evennia/utils/ansi.py +++ b/evennia/utils/ansi.py @@ -134,10 +134,8 @@ class ANSIParser(object): if convert: colval = 16 + (red * 36) + (green * 6) + blue - #print "RGB colours:", red, green, blue return "\033[%s8;5;%s%s%sm" % (3 + int(background), colval/100, (colval % 100)/10, colval%10) else: - #print "ANSI convert:", red, green, blue # xterm256 not supported, convert the rgb value to ansi instead if red == green and red == blue and red < 2: if background: diff --git a/evennia/utils/evform.py b/evennia/utils/evform.py index e1b5955ae..1208145f0 100644 --- a/evennia/utils/evform.py +++ b/evennia/utils/evform.py @@ -245,8 +245,6 @@ class EvForm(object): ix0 = match.end() else: break - #print "cell_coords:", cell_coords - #print "table_coords:", table_coords # get rectangles and assign EvCells for key, (iy, leftix, rightix) in cell_coords.items(): @@ -255,7 +253,6 @@ class EvForm(object): dy_up = 0 if iy > 0: for i in range(1,iy): - #print "dy_up:", [form[iy-i][ix] for ix in range(leftix, rightix)] if all(form[iy-i][ix] == cellchar for ix in range(leftix, rightix)): dy_up += 1 else: @@ -264,7 +261,6 @@ class EvForm(object): dy_down = 0 if iy < nform-1: for i in range(1,nform-iy-1): - #print "dy_down:", [form[iy+i][ix]for ix in range(leftix, rightix)] if all(form[iy+i][ix] == cellchar for ix in range(leftix, rightix)): dy_down += 1 else: @@ -279,13 +275,10 @@ class EvForm(object): # we have all the coordinates we need. Create EvCell. data = self.cells_mapping.get(key, "") #if key == "1": - # print "creating cell '%s' (%s):" % (key, data) - # print "iy=%s, iyup=%s, iydown=%s, leftix=%s, rightix=%s, width=%s, height=%s" % (iy, iyup, iydown, leftix, rightix, width, height) options = { "pad_left":0, "pad_right":0, "pad_top":0, "pad_bottom":0, "align":"l", "valign":"t", "enforce_size":True} options.update(custom_options) #if key=="4": - #print "options:", options mapping[key] = (iyup, leftix, width, height, EvCell(data, width=width, height=height,**options)) @@ -296,7 +289,6 @@ class EvForm(object): dy_up = 0 if iy > 0: for i in range(1,iy): - #print "dy_up:", [form[iy-i][ix] for ix in range(leftix, rightix)] if all(form[iy-i][ix] == tablechar for ix in range(leftix, rightix)): dy_up += 1 else: @@ -305,7 +297,6 @@ class EvForm(object): dy_down = 0 if iy < nform-1: for i in range(1,nform-iy-1): - #print "dy_down:", [form[iy+i][ix]for ix in range(leftix, rightix)] if all(form[iy+i][ix] == tablechar for ix in range(leftix, rightix)): dy_down += 1 else: @@ -319,13 +310,10 @@ class EvForm(object): # we have all the coordinates we need. Create Table. table = self.tables_mapping.get(key, None) - #print "creating table '%s' (%s):" % (key, data) - #print "iy=%s, iyup=%s, iydown=%s, leftix=%s, rightix=%s, width=%s, height=%s" % (iy, iyup, iydown, leftix, rightix, width, height) options = { "pad_left":0, "pad_right":0, "pad_top":0, "pad_bottom":0, "align":"l", "valign":"t", "enforce_size":True} options.update(custom_options) - #print "options:", options if table: table.reformat(width=width, height=height, **options) diff --git a/evennia/utils/evtable.py b/evennia/utils/evtable.py index e58a09f04..70d49977c 100644 --- a/evennia/utils/evtable.py +++ b/evennia/utils/evtable.py @@ -1224,9 +1224,6 @@ class EvTable(object): self._borders() # equalize widths within each column - #print [col.options for col in self.worktable] - #print [[cell.get_width() for cell in col] for col in self.worktable] - #print [[cell.get_height() for cell in col] for col in self.worktable] cwidths = [max(cell.get_width() for cell in col) for col in self.worktable] if self.width or self.maxwidth and self.maxwidth < sum(cwidths): @@ -1280,7 +1277,6 @@ class EvTable(object): # get minimum possible cell heights for each collumn cheights_min = [max(cell.get_min_height() for cell in (col[iy] for col in self.worktable)) for iy in xrange(nrowmax)] chmin = sum(cheights_min) - #print "cheights_min:", cheights_min if chmin > self.height: # we cannot shrink any more @@ -1308,7 +1304,6 @@ class EvTable(object): # we must tell cells to crop instead of expanding options["enforce_size"] = True - #print "cheights2:", cheights # reformat table (for vertical align) for ix, col in enumerate(self.worktable): @@ -1322,7 +1317,6 @@ class EvTable(object): # calculate actual table width/height in characters self.cwidth = sum(cwidths) self.cheight = sum(cheights) - #print "actual table width, height:", self.cwidth, self.cheight, self.width, self.height def _generate_lines(self): """ diff --git a/evennia/utils/idmapper/models.py b/evennia/utils/idmapper/models.py index d5da3c2e2..1020893be 100644 --- a/evennia/utils/idmapper/models.py +++ b/evennia/utils/idmapper/models.py @@ -60,12 +60,9 @@ class SharedMemoryModelBase(ModelBase): instance_key = cls._get_cache_key(args, kwargs) # depending on the arguments, we might not be able to infer the PK, so in that case we create a new instance - #print "SharedMemoryModelBase.__call__ 1: calledby:", calledby(3) - #print "SharedMemoryModelBase.__call__ 2: instance_key:", instance_key if instance_key is None: return new_instance() cached_instance = cls.get_cached_instance(instance_key) - #print "SharedMemoryModelBase.__call__ 3: cached_instance:", cached_instance if cached_instance is None: cached_instance = new_instance() cls.cache_instance(cached_instance, new=True) @@ -113,7 +110,6 @@ class SharedMemoryModelBase(ModelBase): "Helper method to create property wrappers with unique names (must be in separate call)" def _get(cls, fname): "Wrapper for getting database field" - #print "_get:", fieldname, wrappername,_GA(cls,fieldname) if _GA(cls, "_is_deleted"): raise ObjectDoesNotExist("Cannot access %s: Hosting object was already deleted." % fname) return _GA(cls, fieldname) @@ -195,12 +191,9 @@ class SharedMemoryModelBase(ModelBase): for fieldname, field in ((fname, field) for fname, field in attrs.items() if fname.startswith("db_") and type(field).__name__ != "ManyToManyField"): foreignkey = type(field).__name__ == "ForeignKey" - #print fieldname, type(field).__name__, field wrappername = "dbid" if fieldname == "id" else fieldname.replace("db_", "", 1) - #print fieldname, wrappername if wrappername not in attrs: # makes sure not to overload manually created wrappers on the model - #print "wrapping %s -> %s" % (fieldname, wrappername) create_wrapper(cls, fieldname, wrappername, editable=field.editable, foreignkey=foreignkey) return super(SharedMemoryModelBase, cls).__new__(cls, name, bases, attrs) @@ -451,9 +444,7 @@ def flush_cache(**kwargs): else: yield cls - #print "start flush ..." for cls in class_hierarchy([SharedMemoryModel]): - #print cls cls.flush_instance_cache() # run the python garbage collector return gc.collect() diff --git a/evennia/utils/prettytable.py b/evennia/utils/prettytable.py index 52c30703f..8b5144aa4 100644 --- a/evennia/utils/prettytable.py +++ b/evennia/utils/prettytable.py @@ -1008,8 +1008,6 @@ class PrettyTable(object): if self.rowcount == 0 and (not options["print_empty"] or not options["border"]): return "" - #print "prettytable:", self._rows - # Get the rows we need to print, taking into account slicing, sorting, etc. rows = self._get_rows(options) diff --git a/evennia/utils/tests.py b/evennia/utils/tests.py index 08886fbe9..5b5141438 100644 --- a/evennia/utils/tests.py +++ b/evennia/utils/tests.py @@ -174,7 +174,6 @@ class TestCrop(TestCase): class TestDedent(TestCase): def test_dedent(self): - #print "Did TestDedent run?" # Empty string, return empty string self.assertEqual("", utils.dedent("")) # No leading whitespace From f890c8bddb2ea95c56f925a58b4944b1ab476580 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 16:21:22 -0700 Subject: [PATCH 07/13] Update logger docs. --- evennia/utils/logger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/evennia/utils/logger.py b/evennia/utils/logger.py index 011cb275d..374925919 100644 --- a/evennia/utils/logger.py +++ b/evennia/utils/logger.py @@ -3,10 +3,10 @@ Logging facilities These are thin wrappers on top of Twisted's logging facilities; logs are all directed either to stdout (if Evennia is running in -interactive mode) or to game/logs. +interactive mode) or to $GAME_DIR/server/logs. The log_file() function uses its own threading system to log to -arbitrary files in game/logs. +arbitrary files in $GAME_DIR/server/logs. Note: All logging functions have two aliases, log_type() and log_typemsg(). This is for historical, back-compatible reasons. From acdf2573b0b8913e2f090acfce45e85040fc38e0 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Mon, 19 Oct 2015 01:11:00 +0000 Subject: [PATCH 08/13] Printing traces to the user is usually bad. This could, in theory, expose more information about how the server works than would be advised, benefiting potential attackers. --- evennia/commands/default/unloggedin.py | 6 ++---- evennia/contrib/email_login.py | 3 +-- evennia/contrib/menu_login.py | 3 +-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/evennia/commands/default/unloggedin.py b/evennia/commands/default/unloggedin.py index 4751c2d8f..22f61ae47 100644 --- a/evennia/commands/default/unloggedin.py +++ b/evennia/commands/default/unloggedin.py @@ -140,8 +140,7 @@ class CmdUnconnectedConnect(MuxCommand): # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, # we won't see any errors at all. - string = "%s\nThis is a bug. Please e-mail an admin if the problem persists." - session.msg(string % (traceback.format_exc())) + session.msg("An error occurred. Please e-mail an admin if the problem persists.") logger.log_errmsg(traceback.format_exc()) finally: return @@ -287,8 +286,7 @@ class CmdUnconnectedCreate(MuxCommand): # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, # we won't see any errors at all. - string = "%s\nThis is a bug. Please e-mail an admin if the problem persists." - session.msg(string % (traceback.format_exc())) + session.msg("An error occurred. Please e-mail an admin if the problem persists.") logger.log_errmsg(traceback.format_exc()) diff --git a/evennia/contrib/email_login.py b/evennia/contrib/email_login.py index cee8a1484..6ec9b3295 100644 --- a/evennia/contrib/email_login.py +++ b/evennia/contrib/email_login.py @@ -257,8 +257,7 @@ its and @/./+/-/_ only.") # this echoes the restrictions made by django's auth m # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, # we won't see any errors at all. - string = "%s\nThis is a bug. Please e-mail an admin if the problem persists." - session.msg(string % (traceback.format_exc())) + session.msg("An error occurred. Please e-mail an admin if the problem persists.") logger.log_errmsg(traceback.format_exc()) class CmdUnconnectedQuit(MuxCommand): diff --git a/evennia/contrib/menu_login.py b/evennia/contrib/menu_login.py index 7868aa998..f3176fd41 100644 --- a/evennia/contrib/menu_login.py +++ b/evennia/contrib/menu_login.py @@ -235,8 +235,7 @@ class CmdPasswordCreate(Command): # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, we # won't see any errors at all. - string = "%s\nThis is a bug. Please e-mail an admin if the problem persists." - self.caller.msg(string % (traceback.format_exc())) + self.caller.msg("An error occurred. Please e-mail an admin if the problem persists." logger.log_errmsg(traceback.format_exc()) From 48f1d0b26fd7a642da7b8309aa0511bccb7d0dce Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Sun, 18 Oct 2015 23:28:02 +0000 Subject: [PATCH 09/13] Remove commented out logger calls. --- evennia/objects/objects.py | 6 ------ evennia/server/portal/imc2.py | 2 -- 2 files changed, 8 deletions(-) diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index ac389bad5..616319b5d 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -549,7 +549,6 @@ class DefaultObject(ObjectDB): except Exception: logerr(errtxt % "at_before_move()") #emit_to_obj.msg(errtxt % "at_before_move()") - #logger.log_trace() return False # Save the old location @@ -570,7 +569,6 @@ class DefaultObject(ObjectDB): except Exception: logerr(errtxt % "at_object_leave()") #emit_to_obj.msg(errtxt % "at_object_leave()") - #logger.log_trace() return False if not quiet: @@ -580,7 +578,6 @@ class DefaultObject(ObjectDB): except Exception: logerr(errtxt % "at_announce_move()") #emit_to_obj.msg(errtxt % "at_announce_move()" ) - #logger.log_trace() return False # Perform move @@ -598,7 +595,6 @@ class DefaultObject(ObjectDB): except Exception: logerr(errtxt % "announce_move_to()") #emit_to_obj.msg(errtxt % "announce_move_to()") - #logger.log_trace() return False if move_hooks: @@ -609,7 +605,6 @@ class DefaultObject(ObjectDB): except Exception: logerr(errtxt % "at_object_receive()") #emit_to_obj.msg(errtxt % "at_object_receive()") - #logger.log_trace() return False # Execute eventual extra commands on this object after moving it @@ -620,7 +615,6 @@ class DefaultObject(ObjectDB): except Exception: logerr(errtxt % "at_after_move") #emit_to_obj.msg(errtxt % "at_after_move()") - #logger.log_trace() return False return True diff --git a/evennia/server/portal/imc2.py b/evennia/server/portal/imc2.py index c73edee0e..74b83eb31 100644 --- a/evennia/server/portal/imc2.py +++ b/evennia/server/portal/imc2.py @@ -296,8 +296,6 @@ class IMC2Bot(telnet.StatefulTelnetProtocol, Session): self._imc_login(line) return - #logger.log_infomsg("IMC2: RECV> %s" % line) - # Parse the packet and encapsulate it for easy access packet = pck.IMC2Packet(self.mudname, packet_str=line) From 50371b6abdb20ba784b6a38cf2829d7cf4391ab7 Mon Sep 17 00:00:00 2001 From: Griatch Date: Mon, 19 Oct 2015 23:32:00 +0200 Subject: [PATCH 10/13] Merged conflicts. --- evennia/commands/cmdhandler.py | 2 +- evennia/commands/cmdsethandler.py | 2 +- evennia/commands/default/system.py | 2 +- evennia/commands/default/unloggedin.py | 2 +- evennia/contrib/email_login.py | 2 +- evennia/contrib/menu_login.py | 2 +- evennia/help/manager.py | 2 +- evennia/locks/lockhandler.py | 2 +- evennia/objects/manager.py | 2 +- evennia/objects/models.py | 4 ++-- evennia/objects/objects.py | 14 +++++++------- evennia/players/players.py | 2 +- evennia/scripts/scripthandler.py | 2 +- evennia/scripts/scripts.py | 2 +- evennia/server/models.py | 2 +- evennia/server/portal/imc2.py | 12 ++++++------ evennia/server/portal/irc.py | 6 +++--- evennia/server/portal/rss.py | 4 ++-- evennia/server/serversession.py | 2 +- evennia/utils/create.py | 2 +- evennia/utils/dbserialize.py | 2 +- evennia/utils/idmapper/models.py | 4 ++-- evennia/utils/utils.py | 2 +- 23 files changed, 39 insertions(+), 39 deletions(-) diff --git a/evennia/commands/cmdhandler.py b/evennia/commands/cmdhandler.py index c66403de4..7a3ed55c2 100644 --- a/evennia/commands/cmdhandler.py +++ b/evennia/commands/cmdhandler.py @@ -576,7 +576,7 @@ def cmdhandler(called_by, raw_string, _testing=False, callertype="session", sess except NoCmdSets: # Critical error. - logger.log_errmsg("No cmdsets found: %s" % caller) + logger.log_err("No cmdsets found: %s" % caller) error_to.msg(_ERROR_NOCMDSETS, _nomulti=True) except Exception: diff --git a/evennia/commands/cmdsethandler.py b/evennia/commands/cmdsethandler.py index b4ea3ad88..35f10c1f6 100644 --- a/evennia/commands/cmdsethandler.py +++ b/evennia/commands/cmdsethandler.py @@ -183,7 +183,7 @@ def import_cmdset(path, cmdsetobj, emit_to_obj=None, no_logging=False): # returning an empty error cmdset errstring = errstring.strip() if not no_logging: - logger.log_errmsg(errstring) + logger.log_err(errstring) if emit_to_obj and not ServerConfig.objects.conf("server_starting_mode"): emit_to_obj.msg(errstring) err_cmdset = _ErrorCmdSet() diff --git a/evennia/commands/default/system.py b/evennia/commands/default/system.py index 331d29409..097fdb544 100644 --- a/evennia/commands/default/system.py +++ b/evennia/commands/default/system.py @@ -116,7 +116,7 @@ class CmdShutdown(MuxCommand): announcement = "\nServer is being SHUT DOWN!\n" if self.args: announcement += "%s\n" % self.args - logger.log_infomsg('Server shutdown by %s.' % self.caller.name) + logger.log_info('Server shutdown by %s.' % self.caller.name) SESSIONS.announce_all(announcement) SESSIONS.server.shutdown(mode='shutdown') SESSIONS.portal_shutdown() diff --git a/evennia/commands/default/unloggedin.py b/evennia/commands/default/unloggedin.py index 22f61ae47..9821bcb5a 100644 --- a/evennia/commands/default/unloggedin.py +++ b/evennia/commands/default/unloggedin.py @@ -479,7 +479,7 @@ def _create_player(session, playername, password, permissions, typeclass=None): pchannel = ChannelDB.objects.get_channel(settings.DEFAULT_CHANNELS[0]["key"]) if not pchannel.connect(new_player): string = "New player '%s' could not connect to public channel!" % new_player.key - logger.log_errmsg(string) + logger.log_err(string) return new_player diff --git a/evennia/contrib/email_login.py b/evennia/contrib/email_login.py index 6ec9b3295..3303fe994 100644 --- a/evennia/contrib/email_login.py +++ b/evennia/contrib/email_login.py @@ -224,7 +224,7 @@ its and @/./+/-/_ only.") # this echoes the restrictions made by django's auth m pchannel = ChannelDB.objects.get_channel(pchanneldef[0]) if not pchannel.connect(new_player): string = "New player '%s' could not connect to public channel!" % new_player.key - logger.log_errmsg(string) + logger.log_err(string) if MULTISESSION_MODE < 2: # if we only allow one character, create one with the same name as Player diff --git a/evennia/contrib/menu_login.py b/evennia/contrib/menu_login.py index f3176fd41..62eb59d43 100644 --- a/evennia/contrib/menu_login.py +++ b/evennia/contrib/menu_login.py @@ -235,7 +235,7 @@ class CmdPasswordCreate(Command): # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, we # won't see any errors at all. - self.caller.msg("An error occurred. Please e-mail an admin if the problem persists." + self.caller.msg("An error occurred. Please e-mail an admin if the problem persists.") logger.log_errmsg(traceback.format_exc()) diff --git a/evennia/help/manager.py b/evennia/help/manager.py index 38eb8ba84..7745eb988 100644 --- a/evennia/help/manager.py +++ b/evennia/help/manager.py @@ -126,7 +126,7 @@ class HelpEntryManager(models.Manager): topic.help_category = default_category topic.save() string = "Help database moved to category %s" % default_category - logger.log_infomsg(string) + logger.log_info(string) def search_help(self, ostring, help_category=None): """ diff --git a/evennia/locks/lockhandler.py b/evennia/locks/lockhandler.py index 037ae38aa..9bd591719 100644 --- a/evennia/locks/lockhandler.py +++ b/evennia/locks/lockhandler.py @@ -143,7 +143,7 @@ def _cache_lockfuncs(): for tup in (tup for tup in inspect.getmembers(mod) if callable(tup[1])): _LOCKFUNCS[tup[0]] = tup[1] else: - logger.log_errmsg("Couldn't load %s from PERMISSION_FUNC_MODULES." % modulepath) + logger.log_err("Couldn't load %s from PERMISSION_FUNC_MODULES." % modulepath) # # pre-compiled regular expressions diff --git a/evennia/objects/manager.py b/evennia/objects/manager.py index 8504f3225..4d77b7f23 100644 --- a/evennia/objects/manager.py +++ b/evennia/objects/manager.py @@ -207,7 +207,7 @@ class ObjectDBManager(TypedObjectManager): return [] except ValueError: from evennia.utils import logger - logger.log_errmsg("The property '%s' does not support search criteria of the type %s." % (property_name, type(property_value))) + logger.log_err("The property '%s' does not support search criteria of the type %s." % (property_name, type(property_value))) return [] @returns_typeclass_list diff --git a/evennia/objects/models.py b/evennia/objects/models.py index 8136145cd..eec5c7154 100644 --- a/evennia/objects/models.py +++ b/evennia/objects/models.py @@ -269,8 +269,8 @@ class ObjectDB(TypedObject): raise #RuntimeError(errmsg) except Exception as e: errmsg = "Error (%s): %s is not a valid location." % (str(e), location) - logger.log_errmsg(errmsg) - raise #Exception(errmsg) + logger.log_trace(errmsg) + raise def __location_del(self): "Cleanly delete the location reference" diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index 616319b5d..e060b9e99 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -17,7 +17,7 @@ from evennia.scripts.scripthandler import ScriptHandler from evennia.commands import cmdset, command from evennia.commands.cmdsethandler import CmdSetHandler from evennia.commands import cmdhandler -from evennia.utils.logger import log_trace, log_errmsg +from evennia.utils import logger from evennia.utils.utils import (variable_from_module, lazy_property, make_iter, to_str, to_unicode) @@ -432,13 +432,13 @@ class DefaultObject(ObjectDB): try: from_obj.at_msg_send(text=text, to_obj=self, **kwargs) except Exception: - log_trace() + logger.log_trace() try: if not self.at_msg_receive(text=text, **kwargs): # if at_msg_receive returns false, we abort message to this object return except Exception: - log_trace() + logger.log_trace() # session relay kwargs['_nomulti'] = kwargs.get('_nomulti', True) @@ -522,7 +522,7 @@ class DefaultObject(ObjectDB): "Simple log helper method" trc = traceback.format_exc() errstring = "%s%s" % (trc, string) - log_trace() + logger.log_trace() self.msg(errstring) errtxt = _("Couldn't perform move ('%s'). Contact an admin.") @@ -585,7 +585,7 @@ class DefaultObject(ObjectDB): self.location = destination except Exception: emit_to_obj.msg(errtxt % "location change") - log_trace() + logger.log_trace() return False if not quiet: @@ -642,7 +642,7 @@ class DefaultObject(ObjectDB): default_home = None except Exception: string = _("Could not find default home '(#%d)'.") - log_errmsg(string % default_home_id) + logger.log_err(string % default_home_id) default_home = None for obj in self.contents: @@ -658,7 +658,7 @@ class DefaultObject(ObjectDB): string += "now has a null location." obj.location = None obj.msg(_("Something went wrong! You are dumped into nowhere. Contact an admin.")) - log_errmsg(string % (obj.name, obj.dbid)) + logger.log_err(string % (obj.name, obj.dbid)) return if obj.has_player: diff --git a/evennia/players/players.py b/evennia/players/players.py index 961c0af23..0d880f8bf 100644 --- a/evennia/players/players.py +++ b/evennia/players/players.py @@ -673,7 +673,7 @@ class DefaultPlayer(PlayerDB): if _CONNECT_CHANNEL: _CONNECT_CHANNEL.tempmsg("[%s, %s]: %s" % (_CONNECT_CHANNEL.key, now, message)) else: - logger.log_infomsg("[%s]: %s" % (now, message)) + logger.log_info("[%s]: %s" % (now, message)) def at_post_login(self, sessid=None): """ diff --git a/evennia/scripts/scripthandler.py b/evennia/scripts/scripthandler.py index 305eefebf..16c5fbb76 100644 --- a/evennia/scripts/scripthandler.py +++ b/evennia/scripts/scripthandler.py @@ -74,7 +74,7 @@ class ScriptHandler(object): script = create.create_script(scriptclass, key=key, obj=self.obj, autostart=autostart) if not script: - logger.log_errmsg("Script %s could not be created and/or started." % scriptclass) + logger.log_err("Script %s could not be created and/or started." % scriptclass) return False return True diff --git a/evennia/scripts/scripts.py b/evennia/scripts/scripts.py index cf2d8971e..c7ddc8c72 100644 --- a/evennia/scripts/scripts.py +++ b/evennia/scripts/scripts.py @@ -207,7 +207,7 @@ class DefaultScript(ScriptBase): self.db_obj.msg(estring) except Exception: pass - logger.log_errmsg(estring) + logger.log_err(estring) def _step_callback(self): """ diff --git a/evennia/server/models.py b/evennia/server/models.py index 76cffd0fb..0f7f5f096 100644 --- a/evennia/server/models.py +++ b/evennia/server/models.py @@ -88,7 +88,7 @@ class ServerConfig(WeakSharedMemoryModel): "Setter. Allows for self.value = value" if utils.has_parent('django.db.models.base.Model', value): # we have to protect against storing db objects. - logger.log_errmsg("ServerConfig cannot store db objects! (%s)" % value) + logger.log_err("ServerConfig cannot store db objects! (%s)" % value) return self.db_value = pickle.dumps(value) self.save() diff --git a/evennia/server/portal/imc2.py b/evennia/server/portal/imc2.py index 74b83eb31..ca075d085 100644 --- a/evennia/server/portal/imc2.py +++ b/evennia/server/portal/imc2.py @@ -228,7 +228,7 @@ class IMC2Bot(telnet.StatefulTelnetProtocol, Session): # Only support Plain text passwords. # SERVER Sends: PW version= - logger.log_infomsg("IMC2: AUTH< %s" % line) + logger.log_info("IMC2: AUTH< %s" % line) line_split = line.split(' ') pw_present = line_split[0] == 'PW' @@ -236,21 +236,21 @@ class IMC2Bot(telnet.StatefulTelnetProtocol, Session): if "reject" in line_split: auth_message = _("IMC2 server rejected connection.") - logger.log_infomsg(auth_message) + logger.log_info(auth_message) return if pw_present: self.server_name = line_split[1] self.network_name = line_split[4] elif autosetup_present: - logger.log_infomsg(_("IMC2: Autosetup response found.")) + logger.log_info(_("IMC2: Autosetup response found.")) self.server_name = line_split[1] self.network_name = line_split[3] self.is_authenticated = True self.sequence = int(time()) # Log to stdout and notify over MUDInfo. - logger.log_infomsg('IMC2: Authenticated to %s' % self.factory.network) + logger.log_info('IMC2: Authenticated to %s' % self.factory.network) # Ask to see what other MUDs are connected. self._send_packet(pck.IMC2PacketKeepAliveRequest()) @@ -274,7 +274,7 @@ class IMC2Bot(telnet.StatefulTelnetProtocol, Session): self.uid = int(self.factory.uid) self.logged_in = True self.factory.sessionhandler.connect(self) - logger.log_infomsg("IMC2 bot connected to %s." % self.network) + logger.log_info("IMC2 bot connected to %s." % self.network) # Send authentication packet. The reply will be caught by lineReceived self._send_packet(pck.IMC2PacketAuthPlaintext()) @@ -461,7 +461,7 @@ class IMC2BotFactory(protocol.ReconnectingClientFactory): def start(self): "Connect session to sessionhandler" def errback(fail): - logger.log_errmsg(fail.value) + logger.log_err(fail.value) if self.port: service = internet.TCPClient(self.network, int(self.port), self) diff --git a/evennia/server/portal/irc.py b/evennia/server/portal/irc.py index e7a8e6845..bd05db43f 100644 --- a/evennia/server/portal/irc.py +++ b/evennia/server/portal/irc.py @@ -148,8 +148,8 @@ class IRCBot(irc.IRCClient, Session): self.uid = int(self.factory.uid) self.logged_in = True self.factory.sessionhandler.connect(self) - logger.log_infomsg("IRC bot '%s' connected to %s at %s:%s." % (self.nickname, self.channel, - self.network, self.port)) + logger.log_info("IRC bot '%s' connected to %s at %s:%s." % (self.nickname, self.channel, + self.network, self.port)) def disconnect(self, reason=None): """ @@ -276,7 +276,7 @@ class IRCBotFactory(protocol.ReconnectingClientFactory): connector (Connector): Represents the connection. """ - logger.log_infomsg("(re)connecting to %s" % self.channel) + logger.log_info("(re)connecting to %s" % self.channel) def clientConnectionFailed(self, connector, reason): """ diff --git a/evennia/server/portal/rss.py b/evennia/server/portal/rss.py index bda8f2035..061b305c0 100644 --- a/evennia/server/portal/rss.py +++ b/evennia/server/portal/rss.py @@ -94,7 +94,7 @@ class RSSReader(Session): def _errback(self, fail): "Report error" - logger.log_errmsg("RSS feed error: %s" % fail.value) + logger.log_err("RSS feed error: %s" % fail.value) def update(self, init=False): """ @@ -139,7 +139,7 @@ class RSSBotFactory(object): Called by portalsessionhandler. Starts te bot. """ def errback(fail): - logger.log_errmsg(fail.value) + logger.log_err(fail.value) # set up session and connect it to sessionhandler self.bot.init_session("rssbot", self.url, self.sessionhandler) diff --git a/evennia/server/serversession.py b/evennia/server/serversession.py index cf91408d4..66f930e46 100644 --- a/evennia/server/serversession.py +++ b/evennia/server/serversession.py @@ -305,7 +305,7 @@ class ServerSession(Session): cchan.msg("[%s]: %s" % (cchan.key, message)) except Exception: pass - logger.log_infomsg(message) + logger.log_info(message) def get_client_size(self): """ diff --git a/evennia/utils/create.py b/evennia/utils/create.py index fb2875d66..ff2a1dd3f 100644 --- a/evennia/utils/create.py +++ b/evennia/utils/create.py @@ -245,7 +245,7 @@ def create_help_entry(key, entrytext, category="General", locks=None): return new_help except IntegrityError: string = "Could not add help entry: key '%s' already exists." % key - logger.log_errmsg(string) + logger.log_err(string) return None except Exception: logger.log_trace() diff --git a/evennia/utils/dbserialize.py b/evennia/utils/dbserialize.py index 0e6f6caf7..9f2081d56 100644 --- a/evennia/utils/dbserialize.py +++ b/evennia/utils/dbserialize.py @@ -113,7 +113,7 @@ class _SaverMutable(object): elif self._db_obj: self._db_obj.value = self else: - logger.log_errmsg("_SaverMutable %s has no root Attribute to save to." % self) + logger.log_err("_SaverMutable %s has no root Attribute to save to." % self) def _convert_mutables(self, data): "converts mutables to Saver* variants and assigns .parent property" diff --git a/evennia/utils/idmapper/models.py b/evennia/utils/idmapper/models.py index 1020893be..66d0030aa 100644 --- a/evennia/utils/idmapper/models.py +++ b/evennia/utils/idmapper/models.py @@ -524,8 +524,8 @@ def conditional_flush(max_rmem, force=False): if ((now - LAST_FLUSH) < AUTO_FLUSH_MIN_INTERVAL) and not force: # too soon after last flush. - logger.log_warnmsg("Warning: Idmapper flush called more than "\ - "once in %s min interval. Check memory usage." % (AUTO_FLUSH_MIN_INTERVAL/60.0)) + logger.log_warn("Warning: Idmapper flush called more than "\ + "once in %s min interval. Check memory usage." % (AUTO_FLUSH_MIN_INTERVAL/60.0)) return if os.name == "nt": diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index 6bbecb06e..47eb25d25 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -1176,7 +1176,7 @@ def init_new_player(player): Deprecated. """ from evennia.utils import logger - logger.log_depmsg("evennia.utils.utils.init_new_player is DEPRECATED and should not be used.") + logger.log_dep("evennia.utils.utils.init_new_player is DEPRECATED and should not be used.") def string_similarity(string1, string2): From 9b17fa450d34859daff6af12fe2f935d934888c6 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Mon, 19 Oct 2015 03:11:31 +0000 Subject: [PATCH 11/13] Remove unnecessary assignment. --- evennia/locks/lockfuncs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evennia/locks/lockfuncs.py b/evennia/locks/lockfuncs.py index 9434c0656..f2ed6cb86 100644 --- a/evennia/locks/lockfuncs.py +++ b/evennia/locks/lockfuncs.py @@ -472,7 +472,7 @@ def tag(accessing_obj, accessed_obj, *args, **kwargs): a command), then accessing_obj.obj is used instead. """ if hasattr(accessing_obj, "obj"): - accessing_obj = accessing_obj = accessing_obj.obj + accessing_obj = accessing_obj.obj print "tag:", args, accessing_obj, accessing_obj.tags.get(*args) return accessing_obj.tags.get(*args) From 9ecda0cd89f66e3a45bdaff1eec9fa3c5b58fae0 Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Mon, 19 Oct 2015 08:25:58 +0000 Subject: [PATCH 12/13] Change default formatting behaviors to functions. Also add new functions to make it easy to get minimal changes. --- evennia/utils/evmenu.py | 176 +++++++++++++++++++++------------------- 1 file changed, 94 insertions(+), 82 deletions(-) diff --git a/evennia/utils/evmenu.py b/evennia/utils/evmenu.py index 071672b5f..541a53936 100644 --- a/evennia/utils/evmenu.py +++ b/evennia/utils/evmenu.py @@ -220,6 +220,80 @@ class EvMenuCmdSet(CmdSet): """ self.add(CmdEvMenuNode()) + +def dedent_strip_nodetext_formatter(nodetext, has_options): + return dedent(nodetext).strip() + + +def dedent_nodetext_formatter(nodetext, has_options): + return dedent(nodetext) + + +def evtable_options_formatter(optionlist): + if not optionlist: + return "" + + # column separation distance + colsep = 4 + + nlist = len(optionlist) + + # get the widest option line in the table. + table_width_max = -1 + table = [] + for key, desc in optionlist: + table_width_max = max(table_width_max, + max(m_len(p) for p in key.split("\n")) + + max(m_len(p) for p in desc.split("\n")) + colsep) + raw_key = strip_ansi(key) + if raw_key != key: + # already decorations in key definition + table.append(ANSIString(" {lc%s{lt%s{le: %s" % (raw_key, key, desc))) + else: + # add a default white color to key + table.append(ANSIString(" {lc%s{lt{w%s{n{le: %s" % (raw_key, raw_key, desc))) + + ncols = (_MAX_TEXT_WIDTH // table_width_max) + 1 # number of ncols + nlastcol = nlist % ncols # number of elements left in last row + + # get the amount of rows needed (start with 4 rows) + nrows = 4 + while nrows * ncols < nlist: + nrows += 1 + ncols = nlist // nrows # number of full columns + nlastcol = nlist % nrows # number of elements in last column + + # get the final column count + ncols = ncols + 1 if nlastcol > 0 else ncols + if ncols > 1: + # only extend if longer than one column + table.extend([" " for i in xrange(nrows - nlastcol)]) + + # build the actual table grid + table = [table[icol * nrows : (icol * nrows) + nrows] for icol in xrange(0, ncols)] + + # adjust the width of each column + for icol in xrange(len(table)): + col_width = max(max(m_len(p) for p in part.split("\n")) for part in table[icol]) + colsep + table[icol] = [pad(part, width=col_width + colsep, align="l") for part in table[icol]] + + # format the table into columns + return unicode(EvTable(table=table, border="none")) + + +def underline_node_formatter(nodetext, optionstext): + nodetext_width_max = max(m_len(line) for line in nodetext.split("\n")) + options_width_max = max(m_len(line) for line in optionstext.split("\n")) + total_width = max(options_width_max, nodetext_width_max) + separator1 = "_" * total_width + "\n\n" if nodetext_width_max else "" + separator2 = "\n" + "_" * total_width + "\n\n" if total_width else "" + return separator1 + nodetext + separator2 + optionstext + + +def null_node_formatter(nodetext, optionstext): + return nodetext + "\n\n" + optionstext + + #------------------------------------------------------------ # # Menu main class @@ -304,9 +378,20 @@ class EvMenu(object): self._startnode = startnode self._menutree = self._parse_menudata(menudata) - self._nodetext_formatter = nodetext_formatter - self._options_formatter = nodetext_formatter - self._node_formatter = node_formatter + if nodetext_formatter is not None: + self._nodetext_formatter = nodetext_formatter + else: + self._nodetext_formatter = dedent_strip_nodetext_formatter + + if options_formatter is not None: + self._options_formatter = options_formatter + else: + self._options_formatter = evtable_options_formatter + + if node_formatter is not None: + self._node_formatter = node_formatter + else: + self._node_formatter = underline_node_formatter if startnode not in self._menutree: raise EvMenuError("Start node '%s' not in menu tree!" % startnode) @@ -379,89 +464,16 @@ class EvMenu(object): growing to make use of the screen space. """ - # + # handle the node text - # + nodetext = self._nodetext_formatter(nodetext, len(optionlist)) - if self._nodetext_formatter: - # use custom formatter - nodetext = self._nodetext_formatter(nodetext, len(optionlist)) - else: - nodetext = dedent(nodetext).strip() - - nodetext_width_max = max(m_len(line) for line in nodetext.split("\n")) - - # # handle the options - # + optionstext = self._options_formatter(optionlist) - if self._options_formatter: - # use custom formatter - optionstext = self._options_formatter(optionlist) - elif optionlist: - # column separation distance - colsep = 4 - - nlist = len(optionlist) - - # get the widest option line in the table. - table_width_max = -1 - table = [] - for key, desc in optionlist: - table_width_max = max(table_width_max, - max(m_len(p) for p in key.split("\n")) + - max(m_len(p) for p in desc.split("\n")) + colsep) - raw_key = strip_ansi(key) - if raw_key != key: - # already decorations in key definition - table.append(ANSIString(" {lc%s{lt%s{le: %s" % (raw_key, key, desc))) - else: - # add a default white color to key - table.append(ANSIString(" {lc%s{lt{w%s{n{le: %s" % (raw_key, raw_key, desc))) - - ncols = (_MAX_TEXT_WIDTH // table_width_max) + 1 # number of ncols - nlastcol = nlist % ncols # number of elements left in last row - - # get the amount of rows needed (start with 4 rows) - nrows = 4 - while nrows * ncols < nlist: - nrows += 1 - ncols = nlist // nrows # number of full columns - nlastcol = nlist % nrows # number of elements in last column - - # get the final column count - ncols = ncols + 1 if nlastcol > 0 else ncols - if ncols > 1: - # only extend if longer than one column - table.extend([" " for i in xrange(nrows-nlastcol)]) - - # build the actual table grid - table = [table[icol*nrows:(icol*nrows) + nrows] for icol in xrange(0, ncols)] - - # adjust the width of each column - for icol in xrange(len(table)): - col_width = max(max(m_len(p) for p in part.split("\n")) for part in table[icol]) + colsep - table[icol] = [pad(part, width=col_width + colsep, align="l") for part in table[icol]] - - # format the table into columns - optionstext = unicode(EvTable(table=table, border="none")) - else: - optionstext = "" - - options_width_max = max(m_len(line) for line in optionstext.split("\n")) - - # # format the entire node - # - if self._node_formatter: - # use custom formatter - return self._node_formatter(nodetext, optionstext) - else: - # build the page - total_width = max(options_width_max, nodetext_width_max) - separator1 = "_" * total_width + "\n\n" if nodetext_width_max else "" - separator2 = "\n" + "_" * total_width + "\n\n" if total_width else "" - return separator1 + nodetext + separator2 + optionstext + return self._node_formatter(nodetext, optionstext) + def _execute_node(self, nodename, raw_string): """ @@ -768,7 +780,7 @@ def test_start_node(caller): def test_look_node(caller): - text = "Looking again will take you back to the previous message." + text = "" options = {"key": ("{yL{nook", "l"), "desc": "Go back to the previous menu.", "goto": "test_start_node"} From f3498f480afd72559bc507341d5a1ae70ded821d Mon Sep 17 00:00:00 2001 From: Ahmed Charles Date: Mon, 19 Oct 2015 08:45:12 +0000 Subject: [PATCH 13/13] If the option has a blank key and desc, do not show it. Without this, it's impossible to have empty input go back to the current node, without having an entry show up in the list. Trying to use _default results in needed an additional node. --- evennia/utils/evmenu.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/evennia/utils/evmenu.py b/evennia/utils/evmenu.py index 541a53936..55da3e32a 100644 --- a/evennia/utils/evmenu.py +++ b/evennia/utils/evmenu.py @@ -242,6 +242,8 @@ def evtable_options_formatter(optionlist): table_width_max = -1 table = [] for key, desc in optionlist: + if not (key or desc): + continue table_width_max = max(table_width_max, max(m_len(p) for p in key.split("\n")) + max(m_len(p) for p in desc.split("\n")) + colsep)