From caa7347fabd20763ece2ce6b3dee4b92fa6e612a Mon Sep 17 00:00:00 2001 From: Griatch Date: Mon, 28 Nov 2022 21:40:20 +0100 Subject: [PATCH] Add AT_EXIT_TRAVERSE signal. Resolve #2687 --- CHANGELOG.md | 1 + docs/source/Components/Signals.md | 1 + evennia/objects/objects.py | 2 ++ evennia/server/signals.py | 22 ++++++++++------------ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28e672077f..b994358757 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -219,6 +219,7 @@ Increase requirements: Django 4.1+, Twisted 22.10+ Python 3.9, 3.10, 3.11. Post the given left indent but crops/fills to the width. Used in EvCells. - `EvTable` now supports passing `EvColumn`s as a list directly, (`EvTable(table=[colA,colB])`) - Add `tags=` search criterion to `DefaultObject.search`. +- Add `AT_EXIT_TRAVERSE` signal, firing when an exit is traversed. ## Evennia 0.9.5 diff --git a/docs/source/Components/Signals.md b/docs/source/Components/Signals.md index 19de67b3dc..1d458e862d 100644 --- a/docs/source/Components/Signals.md +++ b/docs/source/Components/Signals.md @@ -93,6 +93,7 @@ Extra - `SIGNAL_SCRIPT_POST_CREATE` - fires when a script is first created, after any hooks. - `SIGNAL_CHANNEL_POST_CREATE` - fires when a Channel is first created, after any hooks. - `SIGNAL_HELPENTRY_POST_CREATE` - fires when a help entry is first created. +- `SIGNAL_EXIT_TRAVERSED` - fires when an exit is traversed, just after `at_traverse` hook. The `sender` is the exit itself, `traverser=` keyword hold the one traversing the exit. The `evennia.signals` module also gives you conveneient access to the default Django signals (these use a diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index f23393a44c..ff13c5469f 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -18,6 +18,7 @@ from evennia.commands.cmdsethandler import CmdSetHandler from evennia.objects.manager import ObjectManager from evennia.objects.models import ObjectDB from evennia.scripts.scripthandler import ScriptHandler +from evennia.server.signals import SIGNAL_EXIT_TRAVERSED from evennia.typeclasses.attributes import ModelAttributeBackend, NickHandler from evennia.typeclasses.models import TypeclassBase from evennia.utils import ansi, create, funcparser, logger, search @@ -2886,6 +2887,7 @@ class ExitCommand(_COMMAND_DEFAULT_CLASS): if self.obj.access(self.caller, "traverse"): # we may traverse the exit. self.obj.at_traverse(self.caller, self.obj.destination) + SIGNAL_EXIT_TRAVERSED.send(sender=self.obj, traverser=self.caller) else: # exit is locked if self.obj.db.err_traverse: diff --git a/evennia/server/signals.py b/evennia/server/signals.py index 499e82418d..2fcc4b6d67 100644 --- a/evennia/server/signals.py +++ b/evennia/server/signals.py @@ -87,13 +87,17 @@ SIGNAL_HELPENTRY_POST_CREATE = Signal() # first created, after all hooks. SIGNAL_CHANNEL_POST_CREATE = Signal() +# The sender is the exit used when traversing, as well as 'traverser', for the one traversing +# Called just after at_traverse hook. +SIGNAL_EXIT_TRAVERSED = Signal() + # Django default signals (https://docs.djangoproject.com/en/2.2/topics/signals/) from django.core.signals import request_finished # " ends. from django.core.signals import request_started # Sent when HTTP request begins. -from django.db.backends.signals import ( # Sent when making initial connection to database +from django.db.backends.signals import ( connection_created, -) +) # Sent when making initial connection to database from django.db.models.signals import m2m_changed # Sent when a ManyToManyField changes. from django.db.models.signals import post_delete # after " from django.db.models.signals import post_init # end @@ -101,15 +105,9 @@ from django.db.models.signals import post_migrate # after " from django.db.models.signals import post_save # after " from django.db.models.signals import pre_delete # Sent before an object is deleted. from django.db.models.signals import pre_migrate # Sent before migration starts +from django.db.models.signals import pre_save # Sent before a typeclass' .save is called. from django.db.models.signals import ( - pre_save, # Sent before a typeclass' .save is called. -) -from django.db.models.signals import ( # Sent at start of typeclass __init__ (before at_init) pre_init, -) -from django.test.signals import ( - setting_changed, # Sent when setting changes from override -) -from django.test.signals import ( - template_rendered, # Sent when test system renders template -) +) # Sent at start of typeclass __init__ (before at_init) +from django.test.signals import setting_changed # Sent when setting changes from override +from django.test.signals import template_rendered # Sent when test system renders template