X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Fmisc.py;h=4e32cccd5e99073b7f718bb3a7bbfc7eedb3086d;hp=470fb967a2c3bcd64ccb3632a12aa7e5a8e78850;hb=31bd5bdf5962b81cd22df5173775d7886405be80;hpb=ec299a43ba206f4b5426dad9590d400d42ea3e28 diff --git a/mudpy/misc.py b/mudpy/misc.py index 470fb96..4e32ccc 100644 --- a/mudpy/misc.py +++ b/mudpy/misc.py @@ -1,6 +1,6 @@ """Miscellaneous functions for the mudpy engine.""" -# Copyright (c) 2004-2016 Jeremy Stanley . Permission +# Copyright (c) 2004-2017 Jeremy Stanley . Permission # to use, copy, modify, and distribute this software is granted under # terms provided in the LICENSE file distributed with this software. @@ -164,7 +164,7 @@ class Element: else: node = ".".join((self.key, facet)) self.origin.data[node] = value - self.facethash[node] = self.origin.data[node] + self.facethash[facet] = self.origin.data[node] self.origin.modified = True def append(self, facet, value): @@ -299,7 +299,7 @@ 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( @@ -347,6 +347,7 @@ class Universe: self.contents = {} self.default_origins = {} self.directions = set() + self.loading = False self.loglines = [] self.private_files = [] self.reload_flag = False @@ -375,6 +376,9 @@ class Universe: def load(self): """Load universe data from persistent storage.""" + # while loading, it's safe to update elements from read-only files + self.loading = True + # it's possible for this to enter before logging configuration is read pending_loglines = [] @@ -404,7 +408,7 @@ class Universe: inactive_avatars.append(self.contents[avatar]) except KeyError: pending_loglines.append(( - "Missing avatar \"%s\", possible data corruption" % + 'Missing avatar "%s", possible data corruption' % avatar, 6)) for user in self.userlist: if user.avatar in inactive_avatars: @@ -425,6 +429,10 @@ class Universe: for element in self.contents.values(): element.update_location() element.clean_contents() + + # done loading, so disallow updating elements from read-only files + self.loading = False + return pending_loglines def new(self): @@ -536,9 +544,8 @@ class User: def check_idle(self): """Warn or disconnect idle users as appropriate.""" idletime = universe.get_time() - self.last_input - linkdead_dict = universe.categories["internal"]["time"].get( - "linkdead" - ) + linkdead_dict = universe.contents[ + "mudpy.timing.idle.disconnect"].facets() if self.state in linkdead_dict: linkdead_state = self.state else: @@ -560,7 +567,7 @@ class User: log(logline, 2) self.state = "disconnecting" self.menu_seen = False - idle_dict = universe.categories["internal"]["time"].get("idle") + idle_dict = universe.contents["mudpy.timing.idle.warn"].facets() if self.state in idle_dict: idle_state = self.state else: @@ -961,7 +968,7 @@ class User: try: avatars.append(universe.contents[avatar].get("name")) except KeyError: - log("Missing avatar \"%s\", possible data corruption." % + log('Missing avatar "%s", possible data corruption.' % avatar, 6) return avatars @@ -1308,7 +1315,7 @@ def replace_macros(user, text, is_input=False): replacement = replacement[:-2] else: replacement = "" - log("Couldn't read included " + incfile + " file.", 6) + log("Couldn't read included " + incfile + " file.", 7) # if we get here, log and replace it with null else: @@ -1371,9 +1378,7 @@ def on_pulse(): if not universe.categories["internal"]["counters"].get("mark"): log(str(len(universe.userlist)) + " connection(s)") universe.categories["internal"]["counters"].set( - "mark", universe.categories["internal"]["time"].get( - "frequency_log" - ) + "mark", universe.contents["mudpy.timing"].get("status") ) else: universe.categories["internal"]["counters"].set( @@ -1386,9 +1391,7 @@ def on_pulse(): if not universe.categories["internal"]["counters"].get("save"): universe.save() universe.categories["internal"]["counters"].set( - "save", universe.categories["internal"]["time"].get( - "frequency_save" - ) + "save", universe.contents["mudpy.timing"].get("save") ) else: universe.categories["internal"]["counters"].set( @@ -1398,8 +1401,7 @@ def on_pulse(): ) # pause for a configurable amount of time (decimal seconds) - time.sleep(universe.categories["internal"] - ["time"].get("increment")) + time.sleep(universe.contents["mudpy.timing"].get("increment")) # increase the elapsed increment counter universe.categories["internal"]["counters"].set( @@ -1892,7 +1894,7 @@ def command_reload(actor): log( "User " + actor.owner.account.get("name") + " reloaded the world.", - 8 + 6 ) # set a flag to reload @@ -1977,8 +1979,8 @@ def command_help(actor, parameters): else: output += " $(grn)" output += item + "$(nrm) - " + description + "$(eol)" - output += ("$(eol)Enter \"help COMMAND\" for help on a command " - "named \"COMMAND\".") + output += ('$(eol)Enter "help COMMAND" for help on a command ' + 'named "COMMAND".') # send the accumulated output to the user actor.send(output) @@ -2008,13 +2010,13 @@ def command_say(actor, parameters): # if the message is wrapped in quotes, remove them and leave contents # intact - if parameters.startswith("\"") and parameters.endswith("\""): + if parameters.startswith('"') and parameters.endswith('"'): message = parameters[1:-1] literal = True # otherwise, get rid of stray quote marks on the ends of the message else: - message = parameters.strip("\"'`") + message = parameters.strip('''"'`''') literal = False # the user entered a message @@ -2072,9 +2074,9 @@ def command_say(actor, parameters): # tell the area if message: actor.echo_to_location( - actor.get("name") + " " + action + "s, \"" + message + "\"" + actor.get("name") + " " + action + 's, "' + message + '"' ) - actor.send("You " + action + ", \"" + message + "\"") + actor.send("You " + action + ', "' + message + '"') # there was no message else: @@ -2125,8 +2127,8 @@ def command_show(actor, parameters): if len(arguments) != 2: message = "You must specify one category." elif arguments[1] in universe.categories: - message = ("These are the elements in the \"" + arguments[1] - + "\" category:$(eol)") + message = ('These are the elements in the "' + arguments[1] + + '" category:$(eol)') elements = [ ( universe.categories[arguments[1]][x].key @@ -2136,27 +2138,27 @@ def command_show(actor, parameters): for element in elements: message += "$(eol) $(grn)" + element + "$(nrm)" else: - message = "Category \"" + arguments[1] + "\" does not exist." + message = 'Category "' + arguments[1] + '" does not exist.' elif arguments[0] == "file": 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] - + "\" file:$(eol)") + message = ('These are the elements in the "' + arguments[1] + + '" file:$(eol)') elements = universe.files[arguments[1]].data.keys() elements.sort() for element in elements: message += "$(eol) $(grn)" + element + "$(nrm)" else: - message = "Category \"" + arguments[1] + "\" does not exist." + message = 'Category "' + arguments[1] + '" does not exist.' elif arguments[0] == "element": if len(arguments) != 2: message = "You must specify one element." 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)") + message = ('These are the properties of the "' + arguments[1] + + '" element (in "' + element.origin.filename + + '"):$(eol)') facets = element.facets() for facet in sorted(facets): if element.old_style: @@ -2166,7 +2168,7 @@ def command_show(actor, parameters): message += ("$(eol) $(grn)%s: $(red)%s$(nrm)" % (facet, str(facets[facet]))) else: - message = "Element \"" + arguments[1] + "\" does not exist." + message = 'Element "' + arguments[1] + '" does not exist.' elif arguments[0] == "result": if len(arguments) < 2: message = "You need to specify an expression." @@ -2178,21 +2180,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: @@ -2207,7 +2209,7 @@ def command_show(actor, parameters): message = ("When specified, level must be 0-9 (default 1), " "start and stop must be >=1 (default 10 and 1).") else: - message = "I don't know what \"" + parameters + "\" is." + message = '''I don't know what "''' + parameters + '" is.' actor.send(message) @@ -2224,10 +2226,10 @@ def command_create(actor, parameters): if len(arguments) == 2: element, filename = arguments if element in universe.contents: - message = "The \"" + element + "\" element already exists." + message = 'The "' + element + '" element already exists.' else: - message = ("You create \"" + - element + "\" within the universe.") + message = ('You create "' + + element + '" within the universe.') logline = actor.owner.account.get( "name" ) + " created an element: " + element @@ -2235,7 +2237,7 @@ def command_create(actor, parameters): logline += " in file " + filename if filename not in universe.files: message += ( - " Warning: \"" + filename + "\" is not yet " + ' 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) @@ -2252,11 +2254,11 @@ def command_destroy(actor, parameters): message = "You must specify an element to destroy." else: if parameters not in universe.contents: - message = "The \"" + parameters + "\" element does not exist." + message = 'The "' + parameters + '" element does not exist.' else: universe.contents[parameters].destroy() - message = ("You destroy \"" + parameters - + "\" within the universe.") + message = ('You destroy "' + parameters + + '" within the universe.') log( actor.owner.account.get( "name" @@ -2273,28 +2275,28 @@ def command_set(actor, parameters): else: arguments = parameters.split(" ", 2) if len(arguments) == 1: - message = ("What facet of element \"" + arguments[0] - + "\" would you like to set?") + message = ('What facet of element "' + arguments[0] + + '" would you like to set?') elif len(arguments) == 2: - message = ("What value would you like to set for the \"" + - arguments[1] + "\" facet of the \"" + arguments[0] - + "\" element?") + message = ('What value would you like to set for the "' + + arguments[1] + '" facet of the "' + arguments[0] + + '" element?') else: element, facet, value = arguments if element not in universe.contents: - message = "The \"" + element + "\" element does not exist." + message = 'The "' + element + '" element does not exist.' else: 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\"." % + 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.") + message = ('You have successfully (re)set the "' + facet + + '" facet of element "' + element + + '". Try "show element ' + + element + '" for verification.') actor.send(message) @@ -2305,23 +2307,23 @@ def command_delete(actor, parameters): else: arguments = parameters.split(" ") if len(arguments) == 1: - message = ("What facet of element \"" + arguments[0] - + "\" would you like to delete?") + message = ('What facet of element "' + arguments[0] + + '" would you like to delete?') elif len(arguments) != 2: message = "You may only specify an element and a facet." else: element, facet = arguments if element not in universe.contents: - message = "The \"" + element + "\" element does not exist." + message = 'The "' + element + '" element does not exist.' elif facet not in universe.contents[element].facets(): - message = ("The \"" + element + "\" element has no \"" + facet - + "\" facet.") + message = ('The "' + element + '" element has no "' + facet + + '" facet.') else: universe.contents[element].remove_facet(facet) - message = ("You have successfully deleted the \"" + facet - + "\" facet of element \"" + element - + "\". Try \"show element " + - element + "\" for verification.") + message = ('You have successfully deleted the "' + facet + + '" facet of element "' + element + + '". Try "show element ' + + element + '" for verification.') actor.send(message) @@ -2330,7 +2332,7 @@ def command_error(actor, input_data): # 90% of the time use a generic error if random.randrange(10): - message = "I'm not sure what \"" + input_data + "\" means..." + message = '''I'm not sure what "''' + input_data + '''" means...''' # 10% of the time use the classic diku error else: