X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=lib%2Fmudpy%2Fmisc.py;h=bcb50c2e86234db48243420d0caed5f6f251d13d;hp=2bec9bf60c233f9c6c7315bd553b496d13f9b41a;hb=fed4b3699b4dd18ce6b4436da41645fd25dddb23;hpb=9b6a261f10c05915d03283e8191a8ee03829a8ff diff --git a/lib/mudpy/misc.py b/lib/mudpy/misc.py index 2bec9bf..bcb50c2 100644 --- a/lib/mudpy/misc.py +++ b/lib/mudpy/misc.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- """Miscellaneous functions for the mudpy engine.""" -# Copyright (c) 2004-2014 Jeremy Stanley . Permission +# Copyright (c) 2004-2015 Jeremy Stanley . Permission # to use, copy, modify, and distribute this software is granted under # terms provided in the LICENSE file distributed with this software. @@ -384,11 +383,15 @@ class Universe: filename = os.path.join(self.startdir, filename) self.filename = filename if load: - self.load() + # make sure to preserve any accumulated log entries during load + self.setup_loglines += self.load() def load(self): """Load universe data from persistent storage.""" + # it's possible for this to enter before logging configuration is read + pending_loglines = [] + # the files dict must exist and filename needs to be read-only if not hasattr( self, "files" @@ -410,9 +413,13 @@ class Universe: # make a list of inactive avatars inactive_avatars = [] for account in self.categories["account"].values(): - inactive_avatars += [ - (self.contents[x]) for x in account.getlist("avatars") - ] + for avatar in account.get("avatars"): + try: + inactive_avatars.append(self.contents[avatar]) + except KeyError: + pending_loglines.append(( + "Missing avatar \"%s\", possible data corruption" % + avatar, 6)) for user in self.userlist: if user.avatar in inactive_avatars: inactive_avatars.remove(user.avatar) @@ -432,6 +439,7 @@ class Universe: for element in self.contents.values(): element.update_location() element.clean_contents() + return pending_loglines def new(self): """Create a new, empty Universe (the Big Bang).""" @@ -832,14 +840,14 @@ class User: if self.output_queue: try: self.connection.send(self.output_queue[0]) - del self.output_queue[0] except BrokenPipeError: if self.account and self.account.get("name"): account = self.account.get("name") else: account = "an unknown user" - log("Broken pipe sending to %s." % account, 7) self.state = "disconnecting" + log("Broken pipe sending to %s." % account, 7) + del self.output_queue[0] def enqueue_input(self): """Process and enqueue any new input.""" @@ -968,11 +976,14 @@ class User: def list_avatar_names(self): """List names of assigned avatars.""" - return [ - universe.contents[avatar].get( - "name" - ) for avatar in self.account.getlist("avatars") - ] + avatars = [] + for avatar in self.account.get("avatars"): + try: + avatars.append(universe.contents[avatar].get("name")) + except KeyError: + log("Missing avatar \"%s\", possible data corruption." % + avatar, 6) + return avatars def broadcast(message, add_prompt=True): @@ -992,10 +1003,8 @@ def log(message, level=0): syslog_name = universe.categories["internal"]["logging"].get("syslog") timestamp = time.asctime()[4:19] - # turn the message into a list of lines - lines = filter( - lambda x: x != "", [(x.rstrip()) for x in message.split("\n")] - ) + # turn the message into a list of nonempty lines + lines = [x for x in [(x.rstrip()) for x in message.split("\n")] if x != ""] # send the timestamp and line to a file if file_name: @@ -1047,7 +1056,7 @@ def get_loglines(level, start, stop): """Return a specific range of loglines filtered by level.""" # filter the log lines - loglines = filter(lambda x: x[0] >= level, universe.loglines) + loglines = [x for x in universe.loglines if x[0] >= level] # we need these in several places total_count = str(len(universe.loglines)) @@ -2032,7 +2041,9 @@ def command_say(actor, parameters): universe.categories["internal"]["language"].get( "default_punctuation")) action = "" - for mark in actions.keys(): + + # reverse sort punctuation options so the longest match wins + for mark in sorted(actions.keys(), reverse=True): if not literal and message.endswith(mark): action = actions[mark] break @@ -2194,8 +2205,8 @@ def command_show(actor, parameters): level = int(arguments[1]) else: level = -1 - elif 0 <= actor.owner.account.get("loglevel") <= 9: - level = actor.owner.account.get("loglevel") + elif 0 <= actor.owner.account.get("loglevel", 0) <= 9: + level = actor.owner.account.get("loglevel", 0) else: level = 1 if level > -1 and start > -1 and stop > -1: @@ -2456,6 +2467,11 @@ def setup(): global universe universe = Universe(conffile, True) + # report any loglines which accumulated during setup + for logline in universe.setup_loglines: + log(*logline) + universe.setup_loglines = [] + # log an initial message log("Started mudpy with command line: " + " ".join(sys.argv))