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:
if re.match("""^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])
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):
"""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
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)
# 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")):
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"
# 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(
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"
# 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()
# 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"
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
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]
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)
"""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.")
"""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)
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)