Fix signaling names, add .signals to flat API.

This commit is contained in:
Griatch 2019-07-02 15:46:14 +02:00
parent 71e23ed93d
commit febe08c885
5 changed files with 52 additions and 19 deletions

View file

@ -102,6 +102,7 @@ EvForm = None
EvEditor = None EvEditor = None
EvMore = None EvMore = None
ANSIString = None ANSIString = None
signals = None
# Handlers # Handlers
SESSION_HANDLER = None SESSION_HANDLER = None
@ -168,6 +169,7 @@ def _init():
global search_help, search_tag, search_message global search_help, search_tag, search_message
global create_object, create_script, create_account, create_channel global create_object, create_script, create_account, create_channel
global create_message, create_help_entry global create_message, create_help_entry
global signals
global settings, lockfuncs, logger, utils, gametime, ansi, spawn, managers global settings, lockfuncs, logger, utils, gametime, ansi, spawn, managers
global contrib, TICKER_HANDLER, MONITOR_HANDLER, SESSION_HANDLER global contrib, TICKER_HANDLER, MONITOR_HANDLER, SESSION_HANDLER
global CHANNEL_HANDLER, TASK_HANDLER global CHANNEL_HANDLER, TASK_HANDLER
@ -179,6 +181,7 @@ def _init():
global BASE_ROOM_TYPECLASS, BASE_EXIT_TYPECLASS, BASE_CHANNEL_TYPECLASS global BASE_ROOM_TYPECLASS, BASE_EXIT_TYPECLASS, BASE_CHANNEL_TYPECLASS
global BASE_SCRIPT_TYPECLASS, BASE_GUEST_TYPECLASS global BASE_SCRIPT_TYPECLASS, BASE_GUEST_TYPECLASS
# Parent typeclasses
from .accounts.accounts import DefaultAccount from .accounts.accounts import DefaultAccount
from .accounts.accounts import DefaultGuest from .accounts.accounts import DefaultGuest
from .objects.objects import DefaultObject from .objects.objects import DefaultObject
@ -229,6 +232,7 @@ def _init():
from .utils.evform import EvForm from .utils.evform import EvForm
from .utils.eveditor import EvEditor from .utils.eveditor import EvEditor
from .utils.ansi import ANSIString from .utils.ansi import ANSIString
from .server import signals
# handlers # handlers
from .scripts.tickerhandler import TICKER_HANDLER from .scripts.tickerhandler import TICKER_HANDLER

View file

@ -206,7 +206,6 @@ Command {self} has no defined `func()` - showing on-command variables: No child
{variables} {variables}
""" """
self.caller.msg(string) self.caller.msg(string)
return
# a simple test command to show the available properties # a simple test command to show the available properties
string = "-" * 50 string = "-" * 50
string += "\n|w%s|n - Command variables from evennia:\n" % self.key string += "\n|w%s|n - Command variables from evennia:\n" % self.key

View file

@ -22,7 +22,7 @@ from evennia.utils.logger import log_trace
from evennia.utils.utils import (variable_from_module, is_iter, from evennia.utils.utils import (variable_from_module, is_iter,
make_iter, delay, callables_from_module) make_iter, delay, callables_from_module)
from evennia.server.signals import SIGNAL_ACCOUNT_POST_LOGIN, SIGNAL_ACCOUNT_POST_LOGOUT from evennia.server.signals import SIGNAL_ACCOUNT_POST_LOGIN, SIGNAL_ACCOUNT_POST_LOGOUT
from evennia.server.signals import SIGNAL_ACCOUNT_POST_CONNECT, SIGNAL_ACCOUNT_POST_DISCONNECT from evennia.server.signals import SIGNAL_ACCOUNT_POST_FIRST_LOGIN, SIGNAL_ACCOUNT_POST_LAST_LOGOUT
from evennia.utils.inlinefuncs import parse_inlinefunc from evennia.utils.inlinefuncs import parse_inlinefunc
from codecs import decode as codecs_decode from codecs import decode as codecs_decode
@ -520,8 +520,8 @@ class ServerSessionHandler(SessionHandler):
"uid": session.uid}) "uid": session.uid})
account.at_post_login(session=session) account.at_post_login(session=session)
if nsess < 2: if nsess < 2:
SIGNAL_ACCOUNT_POST_LOGIN.send(sender=account, session=session) SIGNAL_ACCOUNT_POST_FIRST_LOGIN.send(sender=account, session=session)
SIGNAL_ACCOUNT_POST_CONNECT.send(sender=account, session=session) SIGNAL_ACCOUNT_POST_LOGIN.send(sender=account, session=session)
def disconnect(self, session, reason="", sync_portal=True): def disconnect(self, session, reason="", sync_portal=True):
""" """
@ -550,10 +550,10 @@ class ServerSessionHandler(SessionHandler):
session.log(string) session.log(string)
if nsess == 0: if nsess == 0:
SIGNAL_ACCOUNT_POST_LOGOUT.send(sender=session.account, session=session) SIGNAL_ACCOUNT_POST_LAST_LOGOUT.send(sender=session.account, session=session)
session.at_disconnect(reason) session.at_disconnect(reason)
SIGNAL_ACCOUNT_POST_DISCONNECT.send(sender=session.account, session=session) SIGNAL_ACCOUNT_POST_LOGOUT.send(sender=session.account, session=session)
sessid = session.sessid sessid = session.sessid
if sessid in self and not hasattr(self, "_disconnect_all"): if sessid in self and not hasattr(self, "_disconnect_all"):
del self[sessid] del self[sessid]

View file

@ -20,8 +20,10 @@ that may be in high demand.
""" """
from django.dispatch import Signal from django.dispatch import Signal
# The sender is the created Account. This is triggered at the very end of Account.create() # The sender is the created Account. This is triggered at the very end of
# after the Account is created. # Account.create() after the Account is created. Note that this will *not* fire
# if calling create.create_account alone, since going through the Account.create()
# is the most expected route.
SIGNAL_ACCOUNT_POST_CREATE = Signal(providing_args=['ip', ]) SIGNAL_ACCOUNT_POST_CREATE = Signal(providing_args=['ip', ])
# The Sender is the renamed Account. This is triggered by the username setter in AccountDB. # The Sender is the renamed Account. This is triggered by the username setter in AccountDB.
@ -29,22 +31,25 @@ SIGNAL_ACCOUNT_POST_RENAME = Signal(providing_args=['old_name', 'new_name'])
# The Sender is the connecting Account. This is triggered when an Account connects cold; # The Sender is the connecting Account. This is triggered when an Account connects cold;
# that is, it had no other sessions connected. # that is, it had no other sessions connected.
SIGNAL_ACCOUNT_POST_FIRST_LOGIN = Signal(providing_args=['session', ])
# The sender is the connecting Account. This is triggered whenever a session authenticates
# to an Account regardless of existing sessions. It then firest after FIRST_LOGIN signal
SIGNAL_ACCOUNT_POST_LOGIN = Signal(providing_args=['session', ]) SIGNAL_ACCOUNT_POST_LOGIN = Signal(providing_args=['session', ])
# The Sender is the Account attempting to authenticate. This is triggered whenever a # The Sender is the Account attempting to authenticate. This is triggered whenever a
# session tries to login to an Account but fails. # session tries to login to an Account but fails.
SIGNAL_ACCOUNT_POST_LOGIN_FAIL = Signal(providing_args=['session', ]) SIGNAL_ACCOUNT_POST_LOGIN_FAIL = Signal(providing_args=['session', ])
# The sender is the connecting Account. This is triggered whenever a session authenticates
# to an Account regardless of existing sessions.
SIGNAL_ACCOUNT_POST_CONNECT = Signal(providing_args=['session', ])
# The sender is the Account. This is triggered when an Account's final session disconnects.
SIGNAL_ACCOUNT_POST_LOGOUT = Signal(providing_args=['session', ])
# The sender is the disconnecting Account. This is triggered whenever a session disconnects # The sender is the disconnecting Account. This is triggered whenever a session disconnects
# from the account, regardless of how many it started with or remain. # from the account, regardless of how many it started with or remain.
SIGNAL_ACCOUNT_POST_DISCONNECT = Signal(providing_args=['session', ]) SIGNAL_ACCOUNT_POST_LOGOUT = Signal(providing_args=['session', ])
# The sender is the Account. This is triggered when an Account's final session disconnects.
SIGNAL_ACCOUNT_POST_LAST_LOGOUT = Signal(providing_args=['session', ])
# The sender is an Object. This is triggered when Object has been created, after all hooks.
SIGNAL_OBJECT_POST_CREATE = Signal()
# The sender is the Object being puppeted. This is triggered after all puppeting hooks have # The sender is the Object being puppeted. This is triggered after all puppeting hooks have
# been called. The Object has already been puppeted by this point. # been called. The Object has already been puppeted by this point.
@ -54,11 +59,21 @@ SIGNAL_OBJECT_POST_PUPPET = Signal(providing_args=['session', 'account'])
# The Object is no longer puppeted by this point. # The Object is no longer puppeted by this point.
SIGNAL_OBJECT_POST_UNPUPPET = Signal(providing_args=['session', 'account']) SIGNAL_OBJECT_POST_UNPUPPET = Signal(providing_args=['session', 'account'])
# The sender is the Typed Object being released. This isn't necessarily an Object; # The sender is the Typed Object being renamed. This isn't necessarily an Object;
# it could be a script. It fires whenever the value of the Typed object's 'key' # it could be a script. It fires whenever the value of the Typed object's 'key'
# changes. Will need to use isinstance() or other filtering on things that use this. # changes. Will need to use isinstance() or other filtering on things that use this.
SIGNAL_TYPED_OBJECT_POST_RENAME = Signal(providing_args=['old_key', 'new_key']) SIGNAL_TYPED_OBJECT_POST_RENAME = Signal(providing_args=['old_key', 'new_key'])
# The sender is the created Script. This is called after the Script was first created,
# after all hooks.
SIGNAL_SCRIPT_POST_CREATE = Signal()
# The sender is a newly created help entry. This called after the entry was first created.
SIGNAL_HELPENTRY_POST_CREATE = Signal()
# The sender is a newly created Channel. This is called after the Channel was
# first created, after all hooks.
SIGNAL_CHANNEL_POST_CREATE = Signal()
# Django default signals (https://docs.djangoproject.com/en/2.2/topics/signals/) # Django default signals (https://docs.djangoproject.com/en/2.2/topics/signals/)
@ -69,9 +84,9 @@ from django.db.models.signals import (
post_delete, # after " post_delete, # after "
m2m_changed, # Sent when a ManyToManyField changes. m2m_changed, # Sent when a ManyToManyField changes.
pre_migrate, # Sent before migration starts pre_migrate, # Sent before migration starts
post_migrate, # after " post_migrate, # after "
pre_init, # Sent at start of typeclass __init__ (before at_init) pre_init, # Sent at start of typeclass __init__ (before at_init)
post_init, # end post_init, # end
) )
from django.core.signals import ( from django.core.signals import (
request_started, # Sent when HTTP request begins. request_started, # Sent when HTTP request begins.

View file

@ -25,6 +25,7 @@ from django.conf import settings
from django.db import IntegrityError from django.db import IntegrityError
from django.utils import timezone from django.utils import timezone
from evennia.utils import logger from evennia.utils import logger
from evennia.server import signals
from evennia.utils.utils import make_iter, class_from_module, dbid_to_obj from evennia.utils.utils import make_iter, class_from_module, dbid_to_obj
# delayed imports # delayed imports
@ -135,6 +136,9 @@ def create_object(typeclass=None, key=None, location=None, home=None,
# at_first_save hook on the typeclass, where the _createdict can be # at_first_save hook on the typeclass, where the _createdict can be
# used. # used.
new_object.save() new_object.save()
signals.SIGNAL_OBJECT_POST_CREATE.send(sender=new_object)
return new_object return new_object
@ -235,6 +239,8 @@ def create_script(typeclass=None, key=None, obj=None, account=None, locks=None,
# `start_delay=False` - the script will run once and immediately stop before save is over. # `start_delay=False` - the script will run once and immediately stop before save is over.
return None return None
signals.SIGNAL_SCRIPT_POST_CREATE.send(sender=new_script)
return new_script return new_script
@ -288,6 +294,8 @@ def create_help_entry(key, entrytext, category="General", locks=None, aliases=No
logger.log_trace() logger.log_trace()
return None return None
signals.SIGNAL_HELPENTRY_POST_CREATE.send(sender=new_help)
# alias # alias
help_entry = create_help_entry help_entry = create_help_entry
@ -387,6 +395,9 @@ def create_channel(key, aliases=None, desc=None,
# at_first_save hook on the typeclass, where the _createdict can be # at_first_save hook on the typeclass, where the _createdict can be
# used. # used.
new_channel.save() new_channel.save()
signals.SIGNAL_CHANNEL_POST_CREATE.send(sender=new_channel)
return new_channel return new_channel
@ -483,6 +494,10 @@ def create_account(key, email, password,
# at_first_save hook on the typeclass, where the _createdict # at_first_save hook on the typeclass, where the _createdict
# can be used. # can be used.
new_account.save() new_account.save()
# note that we don't send a signal here, that is sent from the Account.create helper method
# instead.
return new_account return new_account