diff --git a/evennia/accounts/accounts.py b/evennia/accounts/accounts.py index 17f17ad9b8..02061ab34b 100644 --- a/evennia/accounts/accounts.py +++ b/evennia/accounts/accounts.py @@ -33,6 +33,7 @@ from evennia.server.signals import ( SIGNAL_ACCOUNT_POST_CREATE, SIGNAL_OBJECT_POST_PUPPET, SIGNAL_OBJECT_POST_UNPUPPET, + SIGNAL_ACCOUNT_POST_LOGIN_FAIL, ) from evennia.server.throttle import Throttle from evennia.typeclasses.attributes import ModelAttributeBackend, NickHandler @@ -673,6 +674,7 @@ class DefaultAccount(AccountDB, metaclass=TypeclassBase): if session: account = AccountDB.objects.get_account_from_name(username) if account: + SIGNAL_ACCOUNT_POST_LOGIN_FAIL.send(sender=account, session=session) account.at_failed_login(session) return None, errors diff --git a/evennia/server/signals.py b/evennia/server/signals.py index 6bf8b1a968..21a3bcca9b 100644 --- a/evennia/server/signals.py +++ b/evennia/server/signals.py @@ -21,6 +21,7 @@ without necessitating a full takeover of hooks that may be in high demand. """ from django.dispatch import Signal +from collections import defaultdict # The sender is the created Account. This is triggered at the very end of # Account.create() after the Account is created. Note that this will *not* fire @@ -91,6 +92,9 @@ SIGNAL_CHANNEL_POST_CREATE = Signal() # Called just after at_traverse hook. SIGNAL_EXIT_TRAVERSED = Signal() +# Used as a generic event emitter. Use to make your own signals easily in one place! +SIGNALS_CUSTOM: dict[str, Signal] = defaultdict(Signal) + # Django default signals (https://docs.djangoproject.com/en/4.1/topics/signals/) from django.core.signals import request_finished # " ends.