X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Fmisc.py;h=1b2be37d803ebd8dc59ca04150e850611bdd63b6;hp=501d5b40498ccc3e2bd0dab25a4a1ffb92352de7;hb=7cf99ffc8b6c2f69c6b13ec8c811c3327fd425e2;hpb=de65a162dc402df0e052c9a6e79a533a00036902 diff --git a/mudpy/misc.py b/mudpy/misc.py index 501d5b4..1b2be37 100644 --- a/mudpy/misc.py +++ b/mudpy/misc.py @@ -457,10 +457,8 @@ class Universe: self.listening_socket.listen(1) # note that we're now ready for user connections - log( - "Listening for Telnet connections on: " + - host + ":" + str(port) - ) + log("Listening for Telnet connections on %s port %s" % ( + host, str(port))) def get_time(self): """Convenience method to get the elapsed time counter.""" @@ -1486,8 +1484,10 @@ def find_command(command_name): command = universe.groups["command"][command_name] else: for candidate in sorted(universe.groups["command"]): - if candidate.startswith(command_name): - # the command matches the start of a command word + if candidate.startswith(command_name) and not universe.groups[ + "command"][candidate].get("administrative"): + # the command matches the start of a command word and is not + # restricted to administrators command = universe.groups["command"][candidate] break return command @@ -1887,11 +1887,32 @@ def handler_active(user): command = find_command(command_name) # if it's allowed, do it + ran = False if actor.can_run(command): - exec(command.get("action")) - - # otherwise, give an error - elif command_name: + # dereference the relative object path for the requested function + action = mudpy + action_fname = command.get("action", command.key) + for component in action_fname.split("."): + try: + action = getattr(action, component) + ran = True + except AttributeError: + log('Could not find action function "%s" for command "%s"' + % (action_fname, command_name)) + action = None + break + if action: + try: + action(actor, parameters) + except Exception: + log('Command string "%s" from user %s raised an ' + 'exception...\n%s' % ( + input_data, actor.owner.account.get("name"), + traceback.format_exc())) + mudpy.command.error(actor, input_data) + + # if the command was not run, give an error + if not ran: mudpy.command.error(actor, input_data) # if no input, just idle back with a prompt