[docs] def func(self):
"""implement method"""
@@ -3645,20 +3688,8 @@
return
# find script or object to operate on
-
scripts, obj = None, None
-
if self.rhs:
-
obj_query = self.lhs
-
script_query = self.rhs
-
elif self.rhs is not None:
-
# an empty "="
-
obj_query = self.lhs
-
script_query = None
-
else:
-
obj_query = None
-
script_query = self.args
-
-
scripts = self._search_script(script_query) if script_query else None
-
objects = caller.search(obj_query, quiet=True) if obj_query else None
+
scripts = self._search_script() if self.typeclass_query else None
+
objects = caller.search(self.obj_query, quiet=True) if self.obj_query else None
obj = objects[0] if objects else None
if not self.switches:
@@ -3667,7 +3698,7 @@
# we have an object
if self.rhs:
# creation mode
-
if obj.scripts.add(self.rhs, autostart=True):
+
if obj.scripts.add(self.typeclass_query, key=self.key_query, autostart=True):
caller.msg(
f"Script |w{self.rhs}|n successfully added and "
f"started on {obj.get_display_name(caller)}."
@@ -3695,7 +3726,9 @@
else:
# create global script
try:
-
new_script = create.create_script(self.args)
+
new_script = create.create_script(
+
typeclass=self.typeclass_query, key=self.key_query
+
)
except ImportError:
logger.log_trace()
new_script = None
diff --git a/docs/latest/_modules/evennia/commands/default/tests.html b/docs/latest/_modules/evennia/commands/default/tests.html
index 52025f2807..167f282588 100644
--- a/docs/latest/_modules/evennia/commands/default/tests.html
+++ b/docs/latest/_modules/evennia/commands/default/tests.html
@@ -106,13 +106,10 @@
import datetime
from unittest.mock import MagicMock, Mock, patch
+
import evennia
from anything import Anything
from django.conf import settings
from django.test import override_settings
-
from parameterized import parameterized
-
from twisted.internet import task
-
-
import evennia
from evennia import (
DefaultCharacter,
DefaultExit,
@@ -124,14 +121,7 @@
from evennia.commands import cmdparser
from evennia.commands.cmdset import CmdSet
from evennia.commands.command import Command, InterruptCommand
-
from evennia.commands.default import (
-
account,
-
admin,
-
batchprocess,
-
building,
-
comms,
-
general,
-
)
+
from evennia.commands.default import account, admin, batchprocess, building, comms, general
from evennia.commands.default import help as help_module
from evennia.commands.default import syscommands, system, unloggedin
from evennia.commands.default.cmdset_character import CharacterCmdSet
@@ -140,6 +130,8 @@
from evennia.utils import create, gametime, utils
from evennia.utils.test_resources import BaseEvenniaCommandTest # noqa
from evennia.utils.test_resources import BaseEvenniaTest, EvenniaCommandTest
+
from parameterized import parameterized
+
from twisted.internet import task
# ------------------------------------------------------------
# Command testing
@@ -538,7 +530,7 @@
args = f"/pause {self.task.get_id()}"
wanted_msg = "Pause task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
-
self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+
self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
self.assertTrue(self.task.paused)
self.task_handler.clock.advance(self.timedelay + 1)
@@ -547,7 +539,7 @@
self.assertTrue(self.task.exists())
wanted_msg = "Unpause task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
-
self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+
self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
# verify task continues after unpause
self.task_handler.clock.advance(1)
@@ -557,7 +549,7 @@
args = f"/do_task {self.task.get_id()}"
wanted_msg = "Do_task task 1 with completion date"
cmd_result = self.call(system.CmdTasks(), args, wanted_msg)
-
self.assertRegex(cmd_result, " \(func_test_cmd_tasks\) ")
+
self.assertRegex(cmd_result, r" \(func_test_cmd_tasks\) ")
self.char1.execute_cmd("y")
self.assertFalse(self.task.exists())
@@ -565,7 +557,7 @@
[docs] def test_script_multi_delete(self):
-
script1 = create.create_script()
-
script2 = create.create_script()
-
script3 = create.create_script()
+
script1 = create.create_script(key="script1")
+
script2 = create.create_script(key="script2")
+
script3 = create.create_script(key="script3")
self.call(
building.CmdScripts(),
"/delete #{}-#{}".format(script1.id, script3.id),
(
-
f"Global Script Deleted - #{script1.id} (evennia.scripts.scripts.DefaultScript)|"
-
f"Global Script Deleted - #{script2.id} (evennia.scripts.scripts.DefaultScript)|"
-
f"Global Script Deleted - #{script3.id} (evennia.scripts.scripts.DefaultScript)"
+
f"Global Script Deleted - script1 (evennia.scripts.scripts.DefaultScript)|"
+
f"Global Script Deleted - script2 (evennia.scripts.scripts.DefaultScript)|"
+
f"Global Script Deleted - script3 (evennia.scripts.scripts.DefaultScript)"
),
inputs=["y"],
)
diff --git a/docs/latest/_modules/evennia/objects/models.html b/docs/latest/_modules/evennia/objects/models.html
index f3c336c1ae..2ba117e623 100644
--- a/docs/latest/_modules/evennia/objects/models.html
+++ b/docs/latest/_modules/evennia/objects/models.html
@@ -112,7 +112,6 @@
from django.core.exceptions import ObjectDoesNotExist
from django.core.validators import validate_comma_separated_integer_list
from django.db import models
-
from evennia.objects.manager import ObjectDBManager
from evennia.typeclasses.models import TypedObject
from evennia.utils import logger
@@ -163,8 +162,18 @@
objects = self.load()
self._pkcache = {obj.pk: True for obj in objects}
for obj in objects:
-
for ctype in obj._content_types:
-
self._typecache[ctype][obj.pk] = True
+ [docs] def get(self, exclude=None, content_type=None):
"""
diff --git a/docs/latest/_modules/evennia/scripts/scripthandler.html b/docs/latest/_modules/evennia/scripts/scripthandler.html
index cbe1d4e58b..579fe6dab2 100644
--- a/docs/latest/_modules/evennia/scripts/scripthandler.html
+++ b/docs/latest/_modules/evennia/scripts/scripthandler.html
@@ -99,7 +99,6 @@
"""
from django.utils.translation import gettext as _
-
from evennia.scripts.models import ScriptDB
from evennia.utils import create, logger
@@ -165,18 +164,27 @@
Script: The newly created Script.
"""
-
if self.obj.__dbclass__.__name__ == "AccountDB":
-
# we add to an Account, not an Object
-
script = create.create_script(
-
scriptclass, key=key, account=self.obj, autostart=autostart
-
)
-
elif isinstance(scriptclass, str) or callable(scriptclass):
+
if isinstance(scriptclass, str) or callable(scriptclass):
# a str or class to use create before adding to an Object. We wait to autostart
# so we can differentiate a failing creation from a script that immediately starts/stops.
-
script = create.create_script(scriptclass, key=key, obj=self.obj, autostart=False)
+
if self.obj.__dbclass__.__name__ == "AccountDB":
+
# we add to an Account, not an Object
+
script = create.create_script(
+
scriptclass, key=key, account=self.obj, autostart=False
+
)
+
else:
+
script = create.create_script(scriptclass, key=key, obj=self.obj, autostart=False)
else:
# already an instantiated class
script = scriptclass
+
if script.db_obj and script.db_obj != self.obj:
+
logger.log_err(
+
f"Script instance {script} already belongs to "
+
f"another object: {script.db_obj}."
+
)
+
return None
+
script.db_obj = self.obj
+
script.save()
if not script:
logger.log_err(f"Script {scriptclass} failed to be created.")
diff --git a/docs/latest/_modules/evennia/scripts/scripts.html b/docs/latest/_modules/evennia/scripts/scripts.html
index 92d3c810e0..72714f0120 100644
--- a/docs/latest/_modules/evennia/scripts/scripts.html
+++ b/docs/latest/_modules/evennia/scripts/scripts.html
@@ -98,13 +98,12 @@
"""
from django.utils.translation import gettext as _
-
from twisted.internet.defer import Deferred, maybeDeferred
-
from twisted.internet.task import LoopingCall
-
from evennia.scripts.manager import ScriptManager
from evennia.scripts.models import ScriptDB
from evennia.typeclasses.models import TypeclassBase
from evennia.utils import create, logger
+
from twisted.internet.defer import Deferred, maybeDeferred
+
from twisted.internet.task import LoopingCall
__all__ = ["DefaultScript", "DoNothing", "Store"]
@@ -515,7 +514,12 @@
updates = []
if not cdict.get("key"):
if not self.db_key:
-
self.db_key = "#%i" % self.dbid
+
if hasattr(self, "key"):
+
# take key from the object typeclass
+
self.db_key = self.key
+
else:
+
# no key set anywhere, use class+dbid as key
+
self.db_key = f"{self.__class__.__name__}(#{self.dbid})"
updates.append("db_key")
elif self.db_key != cdict["key"]:
self.db_key = cdict["key"]
diff --git a/docs/latest/_modules/evennia/typeclasses/attributes.html b/docs/latest/_modules/evennia/typeclasses/attributes.html
index c1ff260210..827c30f6e8 100644
--- a/docs/latest/_modules/evennia/typeclasses/attributes.html
+++ b/docs/latest/_modules/evennia/typeclasses/attributes.html
@@ -109,7 +109,6 @@
from django.conf import settings
from django.db import models
from django.utils.encoding import smart_str
-
from evennia.locks.lockhandler import LockHandler
from evennia.utils.dbserialize import from_pickle, to_pickle
from evennia.utils.idmapper.models import SharedMemoryModel
@@ -234,6 +233,8 @@
# Value and locks are special. We must call the wrappers.
if key == "value":
self.value = value
+
elif key == "strvalue":
+
self.db_strvalue = value
elif key == "lock_storage":
self.lock_storage = value
else:
diff --git a/docs/latest/_modules/evennia/utils/containers.html b/docs/latest/_modules/evennia/utils/containers.html
index b844378e5c..672fd84bba 100644
--- a/docs/latest/_modules/evennia/utils/containers.html
+++ b/docs/latest/_modules/evennia/utils/containers.html
@@ -106,7 +106,7 @@
from django.conf import settings
from django.db.utils import OperationalError, ProgrammingError
-
+
from evennia.scripts.models import ScriptDB
from evennia.utils import logger
from evennia.utils.utils import callables_from_module, class_from_module
@@ -309,7 +309,7 @@
"""
if not self.loaded:
self.load_data()
-
out_value = default
+
script_found = None
if key in self.loaded_data:
if key not in self.typeclass_storage:
# this means we are trying to load in a loop
@@ -322,8 +322,12 @@
script_found = self._load_script(key)
if script_found:
out_value = script_found
+
else:
+
# script not found in settings, see if one exists in database (not
+
# auto-started/recreated)
+
script_found = ScriptDB.objects.filter(db_key__iexact=key, db_obj__isnull=True).first()
-
return out_value
+ script - list all scripts
-script foo.bar.Script - create a new global Script
-script/pause foo.bar.Script - pause global script
-script scriptname|#dbref - examine named existing global script
-script/delete #dbref[-#dbref] - delete script or range by #dbref
+script - list all scripts
+script key:foo.bar.Script - create a new global Script with typeclass
+script/pause foo.bar.Script - pause global script
+script typeclass|name|#dbref - examine named existing global script
+script/delete #dbref[-#dbref] - delete script or range by #dbref
script myobj = - list all scripts on object
script myobj = foo.bar.Script - create and assign script to object
script/stop myobj = name|#dbref - stop named script on object
@@ -2082,7 +2089,7 @@ objects.