X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Fmisc.py;h=3968039fff7d240a8ca2b05e5aa91bd69984b4bc;hp=fd4e0ac1c9185453513f00959d731484295394bf;hb=2c533eb48672110a04d6c4850d3e103d6294ee8d;hpb=c7ee3d6c896f1534d8da46e973700a26b9feb706 diff --git a/mudpy/misc.py b/mudpy/misc.py index fd4e0ac..3968039 100644 --- a/mudpy/misc.py +++ b/mudpy/misc.py @@ -184,6 +184,15 @@ class Element: prepend_padding ) + def is_restricted(self): + """Boolean check whether command is administrative or debugging.""" + return( + self.get("administrative", False) or self.get("debugging", False)) + + def is_admin(self): + """Boolean check whether an actor is controlled by an admin owner.""" + return(self.owner and self.owner.is_admin()) + def can_run(self, command): """Check if the user can run this command object.""" @@ -191,12 +200,16 @@ class Element: if command not in self.universe.groups["command"].values(): return(False) + # debugging commands are not allowed outside debug mode + if command.get("debugging") and not self.universe.debug_mode(): + return(False) + # avatars of administrators can run any command - if self.owner and self.owner.account.get("administrator"): + if self.is_admin(): return(True) # everyone can run non-administrative commands - if not command.get("administrative"): + if not command.is_restricted(): return(True) # otherwise the command cannot be run by this actor @@ -473,6 +486,10 @@ class Universe: if fallback not in self.files: mudpy.data.Data(fallback, self, flags=flags) + def debug_mode(self): + """Boolean method to indicate whether unsafe debugging is enabled.""" + return self.groups["mudpy"]["limit"].get("debug", False) + class User: @@ -995,6 +1012,10 @@ class User: avatar, 6) return avatars + def is_admin(self): + """Boolean check whether user's account is an admin.""" + return(self.account.get("administrator", False)) + def broadcast(message, add_prompt=True): """Send a message to all connected users.""" @@ -1049,9 +1070,10 @@ def log(message, level=0): # display to connected administrators for user in universe.userlist: - if user.state == "active" and user.account.get( - "administrator" - ) and user.account.get("loglevel", 0) <= level: + if ( + user.state == "active" + and user.is_admin() + and user.account.get("loglevel", 0) <= level): # iterate over every line in the message full_message = "" for line in lines: @@ -1497,7 +1519,7 @@ def find_command(command_name): else: for candidate in sorted(universe.groups["command"]): if candidate.startswith(command_name) and not universe.groups[ - "command"][candidate].get("administrative"): + "command"][candidate].is_restricted(): # the command matches the start of a command word and is not # restricted to administrators command = universe.groups["command"][candidate]