"""Miscellaneous functions for the mudpy engine."""
-# Copyright (c) 2004-2015 Jeremy Stanley <fungi@yuggoth.org>. Permission
+# Copyright (c) 2004-2016 Jeremy Stanley <fungi@yuggoth.org>. Permission
# to use, copy, modify, and distribute this software is granted under
# terms provided in the LICENSE file distributed with this software.
"""An element of the universe."""
- def __init__(self, key, universe, filename=None):
+ def __init__(self, key, universe, filename=None, old_style=False):
"""Set up a new element."""
+ # TODO(fungi): This can be removed after the transition is complete
+ self.old_style = old_style
+
# keep track of our key name
self.key = key
self.universe = universe
# clone attributes if this is replacing another element
- if self.key in self.universe.contents:
+ if self.old_style and self.key in self.universe.contents:
old_element = self.universe.contents[self.key]
for attribute in vars(old_element).keys():
exec("self." + attribute + " = old_element." + attribute)
# i guess this is a new element then
else:
+ # set of facet keys from the universe
+ self.facethash = dict()
+
# not owned by a user by default (used for avatars)
self.owner = None
def reload(self):
"""Create a new element and replace this one."""
- Element(self.key, self.universe, self.origin.filename)
+ Element(self.key, self.universe, self.origin.filename,
+ old_style=self.old_style)
del(self)
def destroy(self):
def facets(self):
"""Return a list of non-inherited facets for this element."""
- try:
- return self.origin.data[self.key].keys()
- except (AttributeError, KeyError):
- return []
+ if self.old_style:
+ try:
+ return self.origin.data[self.key].keys()
+ except (AttributeError, KeyError):
+ return []
+ else:
+ return self.facethash
def has_facet(self, facet):
"""Return whether the non-inherited facet exists."""
if default is None:
default = ""
try:
- return self.origin.data[self.key][facet]
+ if self.old_style:
+ return self.origin.data[self.key][facet]
+ else:
+ return self.origin.data[".".join((self.key, facet))]
except (KeyError, TypeError):
pass
if self.has_facet("inherit"):
def set(self, facet, value):
"""Set values."""
if not self.has_facet(facet) or not self.get(facet) == value:
- if self.key not in self.origin.data:
- self.origin.data[self.key] = {}
- self.origin.data[self.key][facet] = value
+ if self.old_style:
+ if self.key not in self.origin.data:
+ self.origin.data[self.key] = {}
+ self.origin.data[self.key][facet] = value
+ else:
+ node = ".".join((self.key, facet))
+ self.origin.data[node] = value
+ self.facethash[node] = self.origin.data[node]
self.origin.modified = True
def append(self, facet, value):
if self.state is not "authenticated":
log("User " + self.account.get("name") + " logged in.", 2)
self.authenticated = True
- if self.account.subkey in universe.categories[
- "internal"
- ][
- "limits"
- ].get(
- "default_admins"
- ):
+ if self.account.subkey in universe.contents["mudpy.limit"].get(
+ "admins"):
self.account.set("administrator", "True")
def show_menu(self):
# log non-printable characters remaining
if mudpy.telnet.is_enabled(self, mudpy.telnet.TELOPT_BINARY,
mudpy.telnet.HIM):
- asciiline = b"".join(
- filter(lambda x: b" " <= x <= b"~", line))
+ asciiline = bytes([x for x in line if 32 <= x <= 126])
if line != asciiline:
logline = "Non-ASCII characters from "
if self.account and self.account.get("name"):
"actor:avatar:" + self.account.get("name") + ":" + str(
counter
),
- universe
+ universe, old_style=True
)
self.avatar.append("inherit", "archetype:avatar")
self.account.append("avatars", self.avatar.key)
"""Log a message."""
# a couple references we need
- file_name = universe.categories["internal"]["logging"].get("file")
- max_log_lines = universe.categories["internal"]["logging"].get(
- "max_log_lines"
- )
- syslog_name = universe.categories["internal"]["logging"].get("syslog")
+ 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")
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:
file_descriptor.close()
# send the timestamp and line to standard output
- if universe.categories["internal"]["logging"].get("stdout"):
+ if universe.contents["mudpy.log"].get("stdout"):
for line in lines:
print(timestamp + " " + line)
"""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))
return text
-def escape_macros(text):
+def escape_macros(value):
"""Escapes replacement macros in text."""
- return text.replace("$(", "$_(")
+ if type(value) is str:
+ return value.replace("$(", "$_(")
+ else:
+ return value
def first_word(text, separator=" "):
# add an element for counters if it doesn't exist
if "counters" not in universe.categories["internal"]:
universe.categories["internal"]["counters"] = Element(
- "internal:counters", universe
+ "internal:counters", universe, old_style=True
)
# update the log every now and then
# otherwise, this could be a brand new user
else:
- user.account = Element("account:" + name, universe)
+ user.account = Element("account:" + name, universe, old_style=True)
user.account.set("name", name)
log("New user: " + name, 2)
user.state = "checking_new_account_name"
user.state = "main_utility"
# if at first your hashes don't match, try, try again
- elif user.password_tries < universe.categories[
- "internal"
- ][
- "limits"
- ].get(
- "password_tries"
- ) - 1:
+ elif user.password_tries < universe.contents["mudpy.limit"].get(
+ "password_tries") - 1:
user.password_tries += 1
user.error = "incorrect"
user.state = "verifying_new_password"
# the password was weak, try again if you haven't tried too many times
- elif user.password_tries < universe.categories[
- "internal"
- ][
- "limits"
- ].get(
- "password_tries"
- ) - 1:
+ elif user.password_tries < universe.contents["mudpy.limit"].get(
+ "password_tries") - 1:
user.password_tries += 1
user.error = "weak"
# go back to entering the new password as long as you haven't tried
# too many times
- elif user.password_tries < universe.categories[
- "internal"
- ][
- "limits"
- ].get(
- "password_tries"
- ) - 1:
+ elif user.password_tries < universe.contents["mudpy.limit"].get(
+ "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.categories["internal"]["language"].get(
+ actions = universe.contents["mudpy.linguistic"].get(
"actions"
)
default_punctuation = (
- universe.categories["internal"]["language"].get(
+ universe.contents["mudpy.linguistic"].get(
"default_punctuation"))
action = ""
message = message[0].lower() + message[1:]
# iterate over all words in message, replacing typos
- typos = universe.categories["internal"]["language"].get(
+ typos = universe.contents["mudpy.linguistic"].get(
"typos"
)
words = message.split()
elif arguments[0] == "element":
if len(arguments) != 2:
message = "You must specify one element."
- elif arguments[1] in universe.contents:
- element = universe.contents[arguments[1]]
+ elif arguments[1].strip(".") in universe.contents:
+ element = universe.contents[arguments[1].strip(".")]
message = ("These are the properties of the \"" + arguments[1]
+ "\" element (in \"" + element.origin.filename
+ "\"):$(eol)")
facets = element.facets()
- facets.sort()
- for facet in facets:
- message += ("$(eol) $(grn)" + facet + ": $(red)"
- + escape_macros(element.get(facet)) + "$(nrm)")
+ for facet in sorted(facets):
+ if element.old_style:
+ message += ("$(eol) $(grn)%s: $(red)%s$(nrm)" %
+ (facet, escape_macros(element.get(facet))))
+ else:
+ message += ("$(eol) $(grn)%s: $(red)%s$(nrm)" %
+ (facet, str(facets[facet])))
else:
message = "Element \"" + arguments[1] + "\" does not exist."
elif arguments[0] == "result":
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:
" Warning: \"" + filename + "\" is not yet "
"included in any other file and will not be read "
"on startup unless this is remedied.")
- Element(element, universe, filename)
+ Element(element, universe, filename, old_style=True)
log(logline, 6)
elif len(arguments) > 2:
message = "You can only specify an element and a filename."