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
+ for component in command.get("action").split("."):
+ try:
+ action = getattr(action, component)
+ ran = True
+ except AttributeError:
+ log('Could not find action function for command "%s"')
+ 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()))
+
+ # 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