Spawner/olc mechanism working
This commit is contained in:
parent
0cdf208b22
commit
0dde856e3e
2 changed files with 51 additions and 8 deletions
|
|
@ -14,7 +14,8 @@ from evennia.utils.utils import inherits_from, class_from_module
|
||||||
from evennia.utils.eveditor import EvEditor
|
from evennia.utils.eveditor import EvEditor
|
||||||
from evennia.utils.evmore import EvMore
|
from evennia.utils.evmore import EvMore
|
||||||
from evennia.utils.spawner import (spawn, search_prototype, list_prototypes,
|
from evennia.utils.spawner import (spawn, search_prototype, list_prototypes,
|
||||||
store_prototype, build_metaproto, validate_prototype)
|
store_prototype, build_metaproto, validate_prototype,
|
||||||
|
delete_prototype, PermissionError)
|
||||||
from evennia.utils.ansi import raw
|
from evennia.utils.ansi import raw
|
||||||
|
|
||||||
COMMAND_DEFAULT_CLASS = class_from_module(settings.COMMAND_DEFAULT_CLASS)
|
COMMAND_DEFAULT_CLASS = class_from_module(settings.COMMAND_DEFAULT_CLASS)
|
||||||
|
|
@ -2777,9 +2778,6 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS):
|
||||||
locks = "cmd:perm(spawn) or perm(Builder)"
|
locks = "cmd:perm(spawn) or perm(Builder)"
|
||||||
help_category = "Building"
|
help_category = "Building"
|
||||||
|
|
||||||
def parser(self):
|
|
||||||
super(CmdSpawn, self).parser()
|
|
||||||
|
|
||||||
def func(self):
|
def func(self):
|
||||||
"""Implements the spawner"""
|
"""Implements the spawner"""
|
||||||
|
|
||||||
|
|
@ -2867,7 +2865,28 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS):
|
||||||
tags=self.lhslist)), exit_on_lastpage=True)
|
tags=self.lhslist)), exit_on_lastpage=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if 'delete' in self.switches:
|
||||||
|
# remove db-based prototype
|
||||||
|
matchstring = _search_show_prototype(self.args)
|
||||||
|
if matchstring:
|
||||||
|
question = "\nDo you want to continue deleting? [Y]/N"
|
||||||
|
string = "|rDeleting prototype:|n\n{}".format(matchstring)
|
||||||
|
answer = yield(string + question)
|
||||||
|
if answer.lower() in ["n", "no"]:
|
||||||
|
caller.msg("|rDeletion cancelled.|n")
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
success = delete_prototype(caller, self.args)
|
||||||
|
except PermissionError as err:
|
||||||
|
caller.msg("|rError deleting:|R {}|n".format(err))
|
||||||
|
caller.msg("Deletion {}.".format(
|
||||||
|
'successful' if success else 'failed (does the prototype exist?)'))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
caller.msg("Could not find prototype '{}'".format(key))
|
||||||
|
|
||||||
if 'save' in self.switches:
|
if 'save' in self.switches:
|
||||||
|
# store a prototype to the database store
|
||||||
if not self.args or not self.rhs:
|
if not self.args or not self.rhs:
|
||||||
caller.msg(
|
caller.msg(
|
||||||
"Usage: @spawn/save <key>[;desc[;tag,tag[,...][;lockstring]]] = <prototype_dict>")
|
"Usage: @spawn/save <key>[;desc[;tag,tag[,...][;lockstring]]] = <prototype_dict>")
|
||||||
|
|
@ -2902,6 +2921,7 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS):
|
||||||
|
|
||||||
# check for existing prototype,
|
# check for existing prototype,
|
||||||
old_matchstring = _search_show_prototype(key)
|
old_matchstring = _search_show_prototype(key)
|
||||||
|
|
||||||
if old_matchstring:
|
if old_matchstring:
|
||||||
string += "\n|yExisting saved prototype found:|n\n{}".format(old_matchstring)
|
string += "\n|yExisting saved prototype found:|n\n{}".format(old_matchstring)
|
||||||
question = "\n|yDo you want to replace the existing prototype?|n [Y]/N"
|
question = "\n|yDo you want to replace the existing prototype?|n [Y]/N"
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,9 @@ _READONLY_PROTOTYPES = {}
|
||||||
_READONLY_PROTOTYPE_MODULES = {}
|
_READONLY_PROTOTYPE_MODULES = {}
|
||||||
|
|
||||||
|
|
||||||
|
class PermissionError(RuntimeError):
|
||||||
|
pass
|
||||||
|
|
||||||
# storage of meta info about the prototype
|
# storage of meta info about the prototype
|
||||||
MetaProto = namedtuple('MetaProto', ['key', 'desc', 'locks', 'tags', 'prototype'])
|
MetaProto = namedtuple('MetaProto', ['key', 'desc', 'locks', 'tags', 'prototype'])
|
||||||
|
|
||||||
|
|
@ -199,14 +202,16 @@ def store_prototype(caller, key, prototype, desc="", tags=None, locks="", delete
|
||||||
stored_prototype = PersistentPrototype.objects.filter(db_key=key)
|
stored_prototype = PersistentPrototype.objects.filter(db_key=key)
|
||||||
|
|
||||||
if stored_prototype:
|
if stored_prototype:
|
||||||
|
# edit existing prototype
|
||||||
stored_prototype = stored_prototype[0]
|
stored_prototype = stored_prototype[0]
|
||||||
if not stored_prototype.access(caller, 'edit'):
|
if not stored_prototype.access(caller, 'edit'):
|
||||||
raise PermissionError("{} does not have permission to "
|
raise PermissionError("{} does not have permission to "
|
||||||
"edit prototype {}".format(caller, key))
|
"edit prototype {}.".format(caller, key))
|
||||||
|
|
||||||
if delete:
|
if delete:
|
||||||
|
# delete prototype
|
||||||
stored_prototype.delete()
|
stored_prototype.delete()
|
||||||
return
|
return True
|
||||||
|
|
||||||
if desc:
|
if desc:
|
||||||
stored_prototype.desc = desc
|
stored_prototype.desc = desc
|
||||||
|
|
@ -216,13 +221,33 @@ def store_prototype(caller, key, prototype, desc="", tags=None, locks="", delete
|
||||||
stored_prototype.locks.add(locks)
|
stored_prototype.locks.add(locks)
|
||||||
if prototype:
|
if prototype:
|
||||||
stored_prototype.attributes.add("prototype", prototype)
|
stored_prototype.attributes.add("prototype", prototype)
|
||||||
|
elif delete:
|
||||||
|
# didn't find what to delete
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
|
# create a new prototype
|
||||||
stored_prototype = create_script(
|
stored_prototype = create_script(
|
||||||
PersistentPrototype, key=key, desc=desc, persistent=True,
|
PersistentPrototype, key=key, desc=desc, persistent=True,
|
||||||
locks=locks, tags=tags, attributes=[("prototype", prototype)])
|
locks=locks, tags=tags, attributes=[("prototype", prototype)])
|
||||||
return stored_prototype
|
return stored_prototype
|
||||||
|
|
||||||
|
|
||||||
|
def delete_prototype(caller, key):
|
||||||
|
"""
|
||||||
|
Delete a stored prototype
|
||||||
|
|
||||||
|
Args:
|
||||||
|
caller (Account or Object): Caller aiming to delete a prototype.
|
||||||
|
key (str): The persistent prototype to delete.
|
||||||
|
Returns:
|
||||||
|
success (bool): If deletion worked or not.
|
||||||
|
Raises:
|
||||||
|
PermissionError: If 'edit' lock was not passed.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return store_prototype(caller, key, None, delete=True)
|
||||||
|
|
||||||
|
|
||||||
def search_persistent_prototype(key=None, tags=None, return_metaprotos=False):
|
def search_persistent_prototype(key=None, tags=None, return_metaprotos=False):
|
||||||
"""
|
"""
|
||||||
Find persistent (database-stored) prototypes based on key and/or tags.
|
Find persistent (database-stored) prototypes based on key and/or tags.
|
||||||
|
|
@ -550,8 +575,6 @@ def spawn(*prototypes, **kwargs):
|
||||||
# get available protparents
|
# get available protparents
|
||||||
protparents = get_protparents()
|
protparents = get_protparents()
|
||||||
|
|
||||||
print("protparents: {}".format(protparents))
|
|
||||||
|
|
||||||
# overload module's protparents with specifically given protparents
|
# overload module's protparents with specifically given protparents
|
||||||
protparents.update(kwargs.get("prototype_parents", {}))
|
protparents.update(kwargs.get("prototype_parents", {}))
|
||||||
for key, prototype in protparents.items():
|
for key, prototype in protparents.items():
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue