Added a simple quell command to contrib/ for showing how to use a command to launch other commands (in this case with a lower permission than you normally do (including bypassing superuser status).

This commit is contained in:
Griatch 2011-11-03 18:23:45 +01:00
parent e7b46c89b4
commit b6303808ec
3 changed files with 92 additions and 7 deletions

80
contrib/misc_commands.py Normal file
View file

@ -0,0 +1,80 @@
"""
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, import this module to
game.gamesrc.commands.basecmdset.py (or your own equivalent) 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()
try:
ret = self.caller.execute_cmd(cmd)
except Exception, e:
self.caller.msg(str(e))
self.caller.permissions = oldperm
self.caller.player.user.is_superuser = old_superuser
self.caller.player.user.save()
return ret

View file

@ -22,7 +22,8 @@ from src.commands.cmdset import CmdSet
from src.commands.default import cmdset_default, cmdset_unloggedin, cmdset_ooc
from game.gamesrc.commands.basecommand import Command
from contrib import menusystem, lineeditor
#from contrib import menusystem, lineeditor
from contrib import misc_commands
class DefaultCmdSet(cmdset_default.DefaultCmdSet):
"""
@ -48,7 +49,7 @@ class DefaultCmdSet(cmdset_default.DefaultCmdSet):
#
#self.add(menusystem.CmdMenuTest())
#self.add(lineeditor.CmdEditor())
self.add(misc_commands.CmdQuell())
class UnloggedinCmdSet(cmdset_unloggedin.UnloggedinCmdSet):
"""

View file

@ -1,11 +1,16 @@
from weakref import WeakValueDictionary, ref
"""
This is mostly unmodified from the original idmapper.
Evennia changes:
The cache mechanism was changed from a WeakValueDictionary to a
normal dictionary. The old way caused very hard-to-diagnose bugs
over long periods of time (which Evennia requires)
"""
from django.db.models.base import Model, ModelBase
from manager import SharedMemoryManager
TCACHE = {} # test cache, for debugging /Griatch
class SharedMemoryModelBase(ModelBase):
#def __new__(cls, name, bases, attrs):
# super_new = super(ModelBase, cls).__new__
@ -120,7 +125,6 @@ class SharedMemoryModel(Model):
"""
cls._flush_cached_by_key(instance._get_pk_val())
#key = "%s-%s" % (cls, instance.pk)
#del TCACHE[key]
#print "uncached: %s (%s: %s) (total cached: %s)" % (instance, cls.__name__, len(cls.__instance_cache__), len(TCACHE))
flush_cached_instance = classmethod(flush_cached_instance)