1 # Copyright (c) 2005 MUDpy, The Fungi <fungi@yuggoth.org>, all rights reserved.
2 # Licensed per terms in the LICENSE file distributed with this software.
4 # persistent variables are stored in ini-style files supported by ConfigParser
7 # need to know the directory separator
10 # hack to load all modules in the muff package
12 for module in muff.__all__:
13 exec("import " + module)
16 """An element of the universe."""
17 def __init__(self, key, origin, universe):
18 """Default values for the in-memory element variables."""
20 if not origin.startswith(os.sep):
21 origin = os.getcwd() + os.sep + origin
23 universe.contents[key] = self
25 category = key.split(":", 1)
26 if category[0] in universe.categories:
27 exec("universe." + category[0] + "s[category[1]] = self")
28 if not origin in universe.files.keys():
29 DataFile(origin, universe)
30 if not universe.files[origin].data.has_section(key):
31 universe.files[origin].data.add_section(key)
33 """Return a list of facets for this element."""
34 return universe.files[self.origin].data.options(self.key)
36 """Retrieve values."""
37 if facet in dir(self): return self.facet
40 return universe.files[self.origin].data.get(self.key, facet)
43 def getint(self, facet):
44 """Convenience method to coerce return values as type int."""
45 value = self.get(facet)
46 if not value: value = 0
47 elif type(value) is str: value = value.rstrip("L")
49 def set(self, facet, value):
51 if facet in universe.files[self.origin].data.options(self.key):
52 universe.files[self.origin].data.set(self.key, facet, repr(value))
53 else: self.facet = value
54 def rec(self, facet, value):
55 """Add initial values to the record."""
56 universe.files[self.origin].data.set(self.key, facet, value)
59 """A file containing universe elements."""
60 def __init__(self, filename, universe):
61 filedir = os.sep.join(filename.split(os.sep)[:-1])
62 data = ConfigParser.SafeConfigParser()
64 self.filename = filename
66 universe.files[filename] = self
67 for section in data.sections():
68 if section == "include":
69 for option in data.options(section):
70 includefile = data.get(section, option)
71 if not includefile.startswith(os.sep):
72 includefile = filedir + os.sep + includefile
73 DataFile(includefile, universe)
75 Element(section, filename, universe)
77 basedir = os.sep.join(self.filename.split(os.sep)[:-1])
78 if not os.access(basedir, os.F_OK): os.makedirs(basedir)
79 file_descriptor = file(self.filename, "w")
80 self.data.write(file_descriptor)
81 file_descriptor.flush()
82 file_descriptor.close()
89 self.categories = [ "account", "actor", "command", "internal", "item", "menu", "room" ]
90 for item in self.categories: exec("self." + item + "s = {}")
91 for item in [ "avatars", "commands", "internals", "universe" ]:
92 filename = muffconf.get("files", item)
93 if not filename.startswith(os.sep): filename = os.getcwd() + os.sep + filename
94 DataFile(filename, self)
96 for key in self.files.keys(): self.files[key].save()
98 def element_exists(key): return key in universe.contents.keys()
100 # reload the muffconf module if the files:data setting does not exist
102 if muffconf.has_section("files"): pass
103 except AttributeError:
106 # if there is no universe, create an empty one
107 if not "universe" in dir(): universe = Universe()