evennia/contrib/misc_commands.py

85 lines
3.1 KiB
Python

"""
Evennia misc commands
Contribution - Griatch 2011
This module offers some miscellaneous commands that may be useful
depending on the game you run or the style of administration you
prefer. Alternatively they can be looked at for inspiration.
To make available in the game, make sure to follow the instructions
in game/gamesrc/commands/examples.py (copy the template up one level
and re-point the relevant settings to this new module - if you already
have such a module, you can of course use that). Next import this module into
this custom module and add the command class(es) you want to the default
command set. You need to reload the server to make them recognized.
"""
from django.conf import settings
from src.commands.default.muxcommand import MuxCommand
PERMISSION_HIERARCHY = settings.PERMISSION_HIERARCHY
PERMISSION_HIERARCHY_LOWER = [perm.lower() for perm in PERMISSION_HIERARCHY]
class CmdQuell(MuxCommand):
"""
Quelling permissions
Usage:
quell <command> [=permission level]
This is an admin command that allows to execute another command as
another (lower) permission level than what you currently
have. This is useful for testing. Also superuser flag will be
deactivated by this command. If no permission level is given,
the command will be executed as the lowest level available in
settings.PERMISSION_HIERARCHY.
"""
key = "quell"
locks = "cmd:perm(all)"
help_category = "General"
def func(self):
"Perform the command"
if not self.args:
self.caller.msg("Usage: quell <command> [=permission level]")
return
cmd = self.lhs
perm = self.rhs
if not PERMISSION_HIERARCHY:
self.caller.msg("settings.PERMISSION_HIERARCHY is not defined. Add a hierarchy to use this command.")
return
if perm:
if not perm.lower() in PERMISSION_HIERARCHY_LOWER:
self.caller.msg("Unknown permission. Permission hierarchy is: [%s]" % ", ".join(PERMISSION_HIERARCHY))
return
if not self.caller.locks.check_lockstring(self.caller, "dummy:perm(%s)" % perm):
self.caller.msg("You cannot use a permission higher than the one you have.")
return
else:
perm = PERMISSION_HIERARCHY_LOWER[0]
# replace permission
oldperm = self.caller.permissions
old_superuser = self.caller.player.user.is_superuser
newperm = [perm] + [perm for perm in oldperm if perm not in PERMISSION_HIERARCHY_LOWER]
self.caller.permissions = newperm
self.caller.player.user.is_superuser = False
self.caller.player.user.save()
def callback(ret):
self.caller.msg(ret)
def errback(err):
self.caller.msg(err)
# this returns a deferred, so we need to assign callbacks
self.caller.execute_cmd(cmd).addCallbacks(callback, errback)
self.caller.permissions = oldperm
self.caller.player.user.is_superuser = old_superuser
self.caller.player.user.save()
return