Use raw strings when escape sequences are needed
[mudpy.git] / mudpy / misc.py
index 6c720d5..822beeb 100644 (file)
@@ -154,6 +154,8 @@ class Element:
 
     def set(self, facet, value):
         """Set values."""
+        if facet in ["loglevel"]:
+            value = int(value)
         if not self.has_facet(facet) or not self.get(facet) == value:
             if self.old_style:
                 if self.key not in self.origin.data:
@@ -297,12 +299,13 @@ class Element:
     def portals(self):
         """Map the portal directions for an area to neighbors."""
         portals = {}
-        if re.match("""^area:-?\d+,-?\d+,-?\d+$""", self.key):
+        if re.match(r"""^area:-?\d+,-?\d+,-?\d+$""", self.key):
             coordinates = [(int(x))
                            for x in self.key.split(":")[1].split(",")]
-            offsets = dict((x,
-                self.universe.contents["mudpy.movement.%s" % x].get("vector")
-                ) for x in self.universe.directions)
+            offsets = dict(
+                (x,
+                 self.universe.contents["mudpy.movement.%s" % x].get("vector")
+                 ) for x in self.universe.directions)
             for portal in self.get("gridlinks"):
                 adjacent = map(lambda c, o: c + o,
                                coordinates, offsets[portal])
@@ -650,8 +653,8 @@ class User:
         if self.state is not "authenticated":
             log("User " + self.account.get("name") + " logged in.", 2)
             self.authenticated = True
-            if self.account.subkey in universe.contents["mudpy.limit"].get(
-                    "admins"):
+            if ("mudpy.limit" in universe.contents and self.account.subkey in
+                    universe.contents["mudpy.limit"].get("admins")):
                 self.account.set("administrator", "True")
 
     def show_menu(self):
@@ -973,9 +976,14 @@ def log(message, level=0):
     """Log a message."""
 
     # a couple references we need
-    file_name = universe.contents["mudpy.log"].get("file")
-    max_log_lines = universe.contents["mudpy.log"].get("lines")
-    syslog_name = universe.contents["mudpy.log"].get("syslog")
+    if "mudpy.log" in universe.contents:
+        file_name = universe.contents["mudpy.log"].get("file", "")
+        max_log_lines = universe.contents["mudpy.log"].get("lines", 0)
+        syslog_name = universe.contents["mudpy.log"].get("syslog", "")
+    else:
+        file_name = ""
+        max_log_lines = 0
+        syslog_name = ""
     timestamp = time.asctime()[4:19]
 
     # turn the message into a list of nonempty lines
@@ -992,7 +1000,8 @@ def log(message, level=0):
         file_descriptor.close()
 
     # send the timestamp and line to standard output
-    if universe.contents["mudpy.log"].get("stdout"):
+    if ("mudpy.log" in universe.contents and
+            universe.contents["mudpy.log"].get("stdout")):
         for line in lines:
             print(timestamp + " " + line)
 
@@ -1709,6 +1718,12 @@ def handler_checking_password(user):
     # get the next waiting line of input
     input_data = user.input_queue.pop(0)
 
+    if "mudpy.limit" in universe.contents:
+        max_password_tries = universe.contents["mudpy.limit"].get(
+            "password_tries", 3)
+    else:
+        max_password_tries = 3
+
     # does the hashed input equal the stored hash?
     if mudpy.password.verify(input_data, user.account.get("passhash")):
 
@@ -1718,8 +1733,7 @@ def handler_checking_password(user):
             user.state = "main_utility"
 
     # if at first your hashes don't match, try, try again
-    elif user.password_tries < universe.contents["mudpy.limit"].get(
-            "password_tries") - 1:
+    elif user.password_tries < max_password_tries - 1:
         user.password_tries += 1
         user.error = "incorrect"
 
@@ -1737,6 +1751,12 @@ def handler_entering_new_password(user):
     # get the next waiting line of input
     input_data = user.input_queue.pop(0)
 
+    if "mudpy.limit" in universe.contents:
+        max_password_tries = universe.contents["mudpy.limit"].get(
+            "password_tries", 3)
+    else:
+        max_password_tries = 3
+
     # make sure the password is strong--at least one upper, one lower and
     # one digit, seven or more characters in length
     if len(input_data) > 6 and len(
@@ -1752,8 +1772,7 @@ def handler_entering_new_password(user):
         user.state = "verifying_new_password"
 
     # the password was weak, try again if you haven't tried too many times
-    elif user.password_tries < universe.contents["mudpy.limit"].get(
-            "password_tries") - 1:
+    elif user.password_tries < max_password_tries - 1:
         user.password_tries += 1
         user.error = "weak"
 
@@ -1772,6 +1791,12 @@ def handler_verifying_new_password(user):
     # get the next waiting line of input
     input_data = user.input_queue.pop(0)
 
+    if "mudpy.limit" in universe.contents:
+        max_password_tries = universe.contents["mudpy.limit"].get(
+            "password_tries", 3)
+    else:
+        max_password_tries = 3
+
     # hash the input and match it to storage
     if mudpy.password.verify(input_data, user.account.get("passhash")):
         user.authenticate()
@@ -1782,8 +1807,7 @@ def handler_verifying_new_password(user):
 
     # go back to entering the new password as long as you haven't tried
     # too many times
-    elif user.password_tries < universe.contents["mudpy.limit"].get(
-            "password_tries") - 1:
+    elif user.password_tries < max_password_tries - 1:
         user.password_tries += 1
         user.error = "differs"
         user.state = "entering_new_password"
@@ -1997,12 +2021,13 @@ def command_say(actor, parameters):
     if message:
 
         # match the punctuation used, if any, to an action
-        actions = universe.contents["mudpy.linguistic"].get(
-            "actions"
-        )
-        default_punctuation = (
-            universe.contents["mudpy.linguistic"].get(
-                "default_punctuation"))
+        if "mudpy.linguistic" in universe.contents:
+            actions = universe.contents["mudpy.linguistic"].get("actions", {})
+            default_punctuation = (universe.contents["mudpy.linguistic"].get(
+                "default_punctuation", "."))
+        else:
+            actions = {}
+            default_punctuation = "."
         action = ""
 
         # reverse sort punctuation options so the longest match wins
@@ -2026,9 +2051,10 @@ def command_say(actor, parameters):
             message = message[0].lower() + message[1:]
 
             # iterate over all words in message, replacing typos
-            typos = universe.contents["mudpy.linguistic"].get(
-                "typos"
-            )
+            if "mudpy.linguistic" in universe.contents:
+                typos = universe.contents["mudpy.linguistic"].get("typos", {})
+            else:
+                typos = {}
             words = message.split()
             for index in range(len(words)):
                 word = words[index]
@@ -2152,21 +2178,21 @@ def command_show(actor, parameters):
                            "$(eol)$(bld)%s$(nrm)" % e)
     elif arguments[0] == "log":
         if len(arguments) == 4:
-            if re.match("^\d+$", arguments[3]) and int(arguments[3]) >= 0:
+            if re.match(r"^\d+$", arguments[3]) and int(arguments[3]) >= 0:
                 stop = int(arguments[3])
             else:
                 stop = -1
         else:
             stop = 0
         if len(arguments) >= 3:
-            if re.match("^\d+$", arguments[2]) and int(arguments[2]) > 0:
+            if re.match(r"^\d+$", arguments[2]) and int(arguments[2]) > 0:
                 start = int(arguments[2])
             else:
                 start = -1
         else:
             start = 10
         if len(arguments) >= 2:
-            if (re.match("^\d+$", arguments[1])
+            if (re.match(r"^\d+$", arguments[1])
                     and 0 <= int(arguments[1]) <= 9):
                 level = int(arguments[1])
             else:
@@ -2258,11 +2284,17 @@ def command_set(actor, parameters):
             if element not in universe.contents:
                 message = "The \"" + element + "\" element does not exist."
             else:
-                universe.contents[element].set(facet, value)
-                message = ("You have successfully (re)set the \"" + facet
-                           + "\" facet of element \"" + element
-                           + "\". Try \"show element " +
-                           element + "\" for verification.")
+                try:
+                    universe.contents[element].set(facet, value)
+                except ValueError:
+                    message = ("Value \"%s\" of type \"%s\" cannot be coerced "
+                               "to the correct datatype for facet \"%s\"." %
+                               (value, type(value), facet))
+                else:
+                    message = ("You have successfully (re)set the \"" + facet
+                               + "\" facet of element \"" + element
+                               + "\". Try \"show element " +
+                               element + "\" for verification.")
     actor.send(message)
 
 
@@ -2312,7 +2344,8 @@ def daemonize(universe):
     """Fork and disassociate from everything."""
 
     # only if this is what we're configured to do
-    if universe.contents["mudpy.process"].get("daemon"):
+    if "mudpy.process" in universe.contents and universe.contents[
+            "mudpy.process"].get("daemon"):
 
         # log before we start forking around, so the terminal gets the message
         log("Disassociating from the controlling terminal.")
@@ -2349,7 +2382,10 @@ def create_pidfile(universe):
     """Write a file containing the current process ID."""
     pid = str(os.getpid())
     log("Process ID: " + pid)
-    file_name = universe.contents["mudpy.process"].get("pidfile")
+    if "mudpy.process" in universe.contents:
+        file_name = universe.contents["mudpy.process"].get("pidfile", "")
+    else:
+        file_name = ""
     if file_name:
         if not os.path.isabs(file_name):
             file_name = os.path.join(universe.startdir, file_name)
@@ -2361,7 +2397,10 @@ def create_pidfile(universe):
 
 def remove_pidfile(universe):
     """Remove the file containing the current process ID."""
-    file_name = universe.contents["mudpy.process"].get("pidfile")
+    if "mudpy.process" in universe.contents:
+        file_name = universe.contents["mudpy.process"].get("pidfile", "")
+    else:
+        file_name = ""
     if file_name:
         if not os.path.isabs(file_name):
             file_name = os.path.join(universe.startdir, file_name)