"""An element of the universe."""
- def __init__(self, key, universe, origin=None, old_style=False):
+ def __init__(self, key, universe, origin=None):
"""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
# keep track of what universe it's loading into
self.universe = universe
- # clone attributes if this is replacing another element
- 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)
- if self.owner:
- self.owner.avatar = self
-
- # i guess this is a new element then
- else:
+ # set of facet keys from the universe
+ self.facethash = dict()
- # set of facet keys from the universe
- self.facethash = dict()
+ # not owned by a user by default (used for avatars)
+ self.owner = None
- # not owned by a user by default (used for avatars)
- self.owner = None
-
- # no contents in here by default
- self.contents = {}
+ # no contents in here by default
+ self.contents = {}
- # parse out appropriate category and subkey names, add to list
- if self.key.find(":") > 0:
- self.category, self.subkey = self.key.split(":", 1)
- else:
- self.category = "other"
- self.subkey = self.key
- if self.category not in self.universe.categories:
- self.universe.categories[self.category] = {}
+ if self.key.find(".") > 0:
+ self.category, self.subkey = self.key.split(".")[-2:]
+ else:
+ self.category = "other"
+ self.subkey = self.key
+ if self.category not in self.universe.categories:
+ self.universe.categories[self.category] = {}
- # get an appropriate origin
- if not origin:
- self.universe.add_category(self.category)
- origin = self.universe.files[
- self.universe.origins[self.category]["fallback"]]
+ # get an appropriate origin
+ if not origin:
+ self.universe.add_category(self.category)
+ origin = self.universe.files[
+ self.universe.origins[self.category]["fallback"]]
# record or reset a pointer to the origin file
self.origin = self.universe.files[origin.source]
- # add a data section to the origin if necessary
- if self.key not in self.origin.data:
- self.origin.data[self.key] = {}
-
# add or replace this element in the universe
self.universe.contents[self.key] = self
self.universe.categories[self.category][self.subkey] = self
def reload(self):
"""Create a new element and replace this one."""
- Element(self.key, self.universe, self.origin, old_style=self.old_style)
+ Element(self.key, self.universe, self.origin)
del(self)
def destroy(self):
"""Remove an element from the universe and destroy it."""
- del(self.origin.data[self.key])
+ for facet in dict(self.facethash):
+ self.remove_facet(facet)
del self.universe.categories[self.category][self.subkey]
del self.universe.contents[self.key]
del self
def facets(self):
"""Return a list of non-inherited facets for this element."""
- if self.old_style:
- try:
- return self.origin.data[self.key].keys()
- except (AttributeError, KeyError):
- return []
- else:
- return self.facethash
+ return self.facethash
def has_facet(self, facet):
"""Return whether the non-inherited facet exists."""
def remove_facet(self, facet):
"""Remove a facet from the element."""
- if self.has_facet(facet):
- del(self.origin.data[self.key][facet])
- self.origin.modified = True
+ if ".".join((self.key, facet)) in self.origin.data:
+ del self.origin.data[".".join((self.key, facet))]
+ if facet in self.facethash:
+ del self.facethash[facet]
+ self.origin.modified = True
def ancestry(self):
"""Return a list of the element's inheritance lineage."""
if default is None:
default = ""
try:
- if self.old_style:
- return self.origin.data[self.key][facet]
- else:
- return self.origin.data[".".join((self.key, facet))]
+ return self.origin.data[".".join((self.key, facet))]
except (KeyError, TypeError):
pass
if self.has_facet("inherit"):
"disallowed")
if facet in ["loglevel"]:
value = int(value)
+ elif facet in ["administrator"]:
+ value = bool(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:
- 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[facet] = self.origin.data[node]
+ node = ".".join((self.key, facet))
+ self.origin.data[node] = value
+ self.facethash[facet] = self.origin.data[node]
self.origin.modified = True
def append(self, facet, value):
def portals(self):
"""Map the portal directions for an area to neighbors."""
portals = {}
- if re.match(r"""^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(",")]
+ for x in self.key.split(".")[-1].split(",")]
offsets = dict(
(x,
self.universe.contents["mudpy.movement.%s" % x].get("vector")
for portal in self.get("gridlinks"):
adjacent = map(lambda c, o: c + o,
coordinates, offsets[portal])
- neighbor = "area:" + ",".join(
+ neighbor = "area." + ",".join(
[(str(x)) for x in adjacent]
)
if neighbor in self.universe.contents:
def authenticate(self):
"""Flag the user as authenticated and disconnect duplicates."""
if self.state is not "authenticated":
- log("User " + self.account.get("name") + " logged in.", 2)
self.authenticated = True
if ("mudpy.limit" in universe.contents and self.account.subkey in
universe.contents["mudpy.limit"].get("admins")):
- self.account.set("administrator", "True")
+ self.account.set("administrator", True)
+ log("Administrator %s authenticated." %
+ self.account.get("name"), 2)
+ else:
+ # log("User %s authenticated." % self.account.get("name"), 2)
+ log("User %s authenticated." % self.account.subkey, 2)
def show_menu(self):
"""Send the user their current menu."""
def new_avatar(self):
"""Instantiate a new, unconfigured avatar for this user."""
counter = 0
- while "avatar:" + self.account.get("name") + ":" + str(
- counter
- ) in universe.categories.get("actor", {}).keys():
+ while ("avatar_%s_%s" % (self.account.get("name"), counter)
+ in universe.categories.get("actor", {}).keys()):
counter += 1
self.avatar = Element(
- "actor:avatar:" + self.account.get("name") + ":" + str(
- counter
- ),
- universe, old_style=True
- )
- self.avatar.append("inherit", "archetype:avatar")
+ "actor.avatar_%s_%s" % (self.account.get("name"), counter),
+ universe)
+ self.avatar.append("inherit", "archetype.avatar")
self.account.append("avatars", self.avatar.key)
def delete_avatar(self, avatar):
# add an element for counters if it doesn't exist
if "counters" not in universe.categories.get("internal", {}):
- Element("internal:counters", universe, old_style=True)
+ Element("internal.counters", universe)
# update the log every now and then
if not universe.categories["internal"]["counters"].get("mark"):
# otherwise, this could be a brand new user
else:
- user.account = Element("account:" + name, universe, old_style=True)
+ user.account = Element("account.%s" % name, universe)
user.account.set("name", name)
log("New user: " + name, 2)
user.state = "checking_new_account_name"
message += "$(eol) $(grn)" + category + "$(nrm)"
elif arguments[0] == "files":
message = "These are the current files containing the universe:$(eol)"
- filenames = list(universe.files.keys())
- filenames.sort()
+ filenames = sorted(universe.files)
for filename in filenames:
if universe.files[filename].is_writeable():
status = "rw"
else:
status = "ro"
- message += ("$(eol) $(red)(" + status + ") $(grn)" + filename
- + "$(nrm)")
+ message += ("$(eol) $(red)(%s) $(grn)%s$(nrm)" %
+ (status, filename))
+ if universe.files[filename].flags:
+ message += (" $(yel)[%s]$(nrm)" %
+ ",".join(universe.files[filename].flags))
elif arguments[0] == "category":
if len(arguments) != 2:
message = "You must specify one category."
if len(arguments) != 2:
message = "You must specify one file."
elif arguments[1] in universe.files:
- message = ('These are the elements in the "' + arguments[1]
+ message = ('These are the nodes in the "' + arguments[1]
+ '" file:$(eol)')
- elements = universe.files[arguments[1]].data.keys()
- elements.sort()
+ elements = sorted(universe.files[arguments[1]].data)
for element in elements:
message += "$(eol) $(grn)" + element + "$(nrm)"
else:
- message = 'Category "' + arguments[1] + '" does not exist.'
+ message = 'File "%s" does not exist.' % arguments[1]
elif arguments[0] == "element":
if len(arguments) != 2:
message = "You must specify one element."
+ '"):$(eol)')
facets = element.facets()
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])))
+ message += ("$(eol) $(grn)%s: $(red)%s$(nrm)" %
+ (facet, str(facets[facet])))
else:
message = 'Element "' + arguments[1] + '" does not exist.'
elif arguments[0] == "result":
' 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, old_style=True)
+ Element(element, universe, filename)
log(logline, 6)
elif len(arguments) > 2:
message = "You can only specify an element and a filename."