Log missing avatars
[mudpy.git] / lib / mudpy / misc.py
index 2bec9bf..ead6f54 100644 (file)
@@ -384,11 +384,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 +414,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 +440,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)."""
@@ -968,11 +977,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):
@@ -2456,6 +2468,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))