Close included files after reading
[mudpy.git] / mudpy / misc.py
index 6d61085..f111b9e 100644 (file)
@@ -475,7 +475,19 @@ class Universe:
 
     def get_time(self):
         """Convenience method to get the elapsed time counter."""
-        return self.groups["internal"]["counters"].get("elapsed")
+        try:
+            return self.groups["internal"]["counters"].get("elapsed", 0)
+        except KeyError:
+            return 0
+
+    def set_time(self, elapsed):
+        """Convenience method to set the elapsed time counter."""
+        try:
+            self.groups["internal"]["counters"].set("elapsed", elapsed)
+        except KeyError:
+            # add an element for counters if it doesn't exist
+            Element("internal.counters", universe)
+            self.groups["internal"]["counters"].set("elapsed", elapsed)
 
     def add_group(self, group, fallback=None):
         """Set up group tracking/metadata."""
@@ -643,6 +655,8 @@ class User:
                 old_user.connection = self.connection
                 old_user.last_address = old_user.address
                 old_user.address = self.address
+                old_user.telopts = self.telopts
+                old_user.adjust_echoing()
 
                 # take this one out of the list and delete
                 self.remove()
@@ -693,7 +707,7 @@ class User:
         if "$_(time)" in prompt:
             prompt = prompt.replace(
                 "$_(time)",
-                str(universe.groups["internal"]["counters"].get("elapsed")))
+                str(universe.get_time()))
 
         # Append a single space for clear separation from user input
         if prompt[-1] != " ":
@@ -1357,14 +1371,14 @@ def replace_macros(user, text, is_input=False):
         elif macro.startswith("inc:"):
             incfile = mudpy.data.find_file(macro[4:], universe=universe)
             if os.path.exists(incfile):
-                incfd = codecs.open(incfile, "r", "utf-8")
                 replacement = ""
-                for line in incfd:
-                    if line.endswith("\n") and not line.endswith("\r\n"):
-                        line = line.replace("\n", "\r\n")
-                    replacement += line
-                # lose the trailing eol
-                replacement = replacement[:-2]
+                with codecs.open(incfile, "r", "utf-8") as incfd:
+                    for line in incfd:
+                        if line.endswith("\n") and not line.endswith("\r\n"):
+                            line = line.replace("\n", "\r\n")
+                        replacement += line
+                    # lose the trailing eol
+                    replacement = replacement[:-2]
             else:
                 replacement = ""
                 log("Couldn't read included " + incfile + " file.", 7)
@@ -1407,22 +1421,8 @@ def first_word(text, separator=" "):
 def on_pulse():
     """The things which should happen on each pulse, aside from reloads."""
 
-    # open the listening socket if it hasn't been already
-    if not hasattr(universe, "listening_socket"):
-        universe.initialize_server_socket()
-
-    # assign a user if a new connection is waiting
-    user = check_for_connection(universe.listening_socket)
-    if user:
-        universe.userlist.append(user)
-
-    # iterate over the connected users
-    for user in universe.userlist:
-        user.pulse()
-
-    # add an element for counters if it doesn't exist
-    if "counters" not in universe.groups.get("internal", {}):
-        Element("internal.counters", universe)
+    # increase the elapsed increment counter
+    universe.set_time(universe.get_time() + 1)
 
     # update the log every now and then
     if not universe.groups["internal"]["counters"].get("mark"):
@@ -1450,16 +1450,22 @@ def on_pulse():
             ) - 1
         )
 
+    # open the listening socket if it hasn't been already
+    if not hasattr(universe, "listening_socket"):
+        universe.initialize_server_socket()
+
+    # assign a user if a new connection is waiting
+    user = check_for_connection(universe.listening_socket)
+    if user:
+        universe.userlist.append(user)
+
+    # iterate over the connected users
+    for user in universe.userlist:
+        user.pulse()
+
     # pause for a configurable amount of time (decimal seconds)
     time.sleep(universe.contents["mudpy.timing"].get("increment"))
 
-    # increase the elapsed increment counter
-    universe.groups["internal"]["counters"].set(
-        "elapsed", universe.groups["internal"]["counters"].get(
-            "elapsed", 0
-        ) + 1
-    )
-
 
 def reload_data():
     """Reload all relevant objects."""