Added at_server_start() and at_server_stop() hooks to allow users to safely initialize their custom systems whenever the server restarts.

This commit is contained in:
Griatch 2012-03-07 20:32:04 +01:00
parent 7818ca077a
commit 309c03ce43
7 changed files with 81 additions and 33 deletions

View file

@ -0,0 +1,30 @@
"""
This module contains functions that are imported and called by the
server whenever it changes its running status. At the point these
functions are run, all applicable hooks on individual objects have
already been executed. The main purpose of this is module is to have a
safe place to initialize eventual custom modules that your game needs
to start up or load.
The module should define at least these global functions:
at_server_start()
at_server_stop()
The module used is defined by settings.AT_SERVER_STARTSTOP_MODULE.
"""
def at_server_start():
"""
This is called every time the server starts up (also after a
reload or reset).
"""
pass
def at_server_stop():
"""
This is called just before a server is shut down, reloaded or
reset.
"""
pass

View file

@ -1,20 +1,23 @@
# """
# This module holds textual connection screen definitions. All global This module holds textual connection screen definitions. All global
# string variables (only) in this module are read by Evennia and string variables (only) in this module are read by Evennia and
# assumed to define a Connection screen. You can change which module is assumed to define a Connection screen.
# used with settings.CONNECTION_SCREEN_MODULE.
# The names of the string variables doesn't matter (except they
# The names of the string variables doesn't matter (except they shouldn't start with _), but each should hold a string defining a
# shouldn't start with _), but each should hold a string defining a connection screen - as seen when first connecting to the game
# connection screen - as seen when first connecting to the game (before having logged in).
# (before having logged in).
# OBS - If there are more than one string variable viable in this
# OBS - If there are more than one string variable viable in this module, a random one is picked!
# module, a random one is picked!
# After adding new connection screens to this module you must either
# After adding new connection screens to this module you must either reboot or reload the server to make them available.
# reboot or reload the server to make them available.
# You can change which module is used with
settings.CONNECTION_SCREEN_MODULE.
"""
from src.utils import utils from src.utils import utils
from src.commands.connection_screen import DEFAULT_SCREEN from src.commands.connection_screen import DEFAULT_SCREEN

View file

@ -15,6 +15,7 @@ arguments should be handled (excess ones calling magic (*args,
eventual tracebacks by logging the error and returning False. eventual tracebacks by logging the error and returning False.
See many more examples of lock functions in src.locks.lockfuncs. See many more examples of lock functions in src.locks.lockfuncs.
""" """
def myfalse(accessing_obj, accessed_obj, *args, **kwargs): def myfalse(accessing_obj, accessed_obj, *args, **kwargs):

View file

@ -1,14 +1,14 @@
# """
# Example module holding functions for out-of-band protocols to Example module holding functions for out-of-band protocols to
# import and map to given commands from the client. This module import and map to given commands from the client. This module
# is selected by settings.OOB_FUNC_MODULE. is selected by settings.OOB_FUNC_MODULE.
#
# All functions defined global in this module will be available All functions defined global in this module will be available
# for the oob system to call. They will be called with a session/character for the oob system to call. They will be called with a session/character
# as first argument (depending on if the session is logged in or not), as first argument (depending on if the session is logged in or not),
# following by any number of extra arguments. The return value will following by any number of extra arguments. The return value will
# be packed and returned to the oob protocol and can be on any form. be packed and returned to the oob protocol and can be on any form.
# """
def testoob(character, *args, **kwargs): def testoob(character, *args, **kwargs):
"Simple test function" "Simple test function"

View file

@ -54,7 +54,7 @@ from src.settings_default import *
################################################### ###################################################
################################################### ###################################################
# Evennia in-game parsers # Evennia pluggable modules
################################################### ###################################################
################################################### ###################################################

View file

@ -27,7 +27,7 @@ from src.scripts.models import ScriptDB
from src.server.models import ServerConfig from src.server.models import ServerConfig
from src.server import initial_setup from src.server import initial_setup
from src.utils.utils import get_evennia_version from src.utils.utils import get_evennia_version, mod_import
from src.comms import channelhandler from src.comms import channelhandler
from src.server.sessionhandler import SESSIONS from src.server.sessionhandler import SESSIONS
@ -35,8 +35,12 @@ if os.name == 'nt':
# For Windows we need to handle pid files manually. # For Windows we need to handle pid files manually.
SERVER_PIDFILE = os.path.join(settings.GAME_DIR, 'server.pid') SERVER_PIDFILE = os.path.join(settings.GAME_DIR, 'server.pid')
# a file with a flag telling the server to restart after shutdown or not.
SERVER_RESTART = os.path.join(settings.GAME_DIR, 'server.restart') SERVER_RESTART = os.path.join(settings.GAME_DIR, 'server.restart')
# module containing hook methods
SERVER_HOOK_MODULE = mod_import(settings.AT_SERVER_STARTSTOP_MODULE)
# i18n # i18n
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@ -158,6 +162,9 @@ class Evennia(object):
[(o.typeclass, o.at_init()) for o in ObjectDB.get_all_cached_instances()] [(o.typeclass, o.at_init()) for o in ObjectDB.get_all_cached_instances()]
[(p.typeclass, p.at_init()) for p in PlayerDB.get_all_cached_instances()] [(p.typeclass, p.at_init()) for p in PlayerDB.get_all_cached_instances()]
# call server hook.
SERVER_HOOK_MODULE.at_server_start()
def terminal_output(self): def terminal_output(self):
""" """
Outputs server startup info to the terminal. Outputs server startup info to the terminal.
@ -221,12 +228,14 @@ class Evennia(object):
[(o.typeclass, o.at_server_shutdown()) for o in ObjectDB.get_all_cached_instances()] [(o.typeclass, o.at_server_shutdown()) for o in ObjectDB.get_all_cached_instances()]
else: # shutdown else: # shutdown
[(o.typeclass, o.at_disconnect(), o.at_server_shutdown()) for o in ObjectDB.get_all_cached_instances()] [(o.typeclass, o.at_disconnect(), o.at_server_shutdown()) for o in ObjectDB.get_all_cached_instances()]
[(p.typeclass, p.at_server_shutdown()) for p in PlayerDB.get_all_cached_instances()] [(p.typeclass, p.at_server_shutdown()) for p in PlayerDB.get_all_cached_instances()]
[(s.typeclass, s.at_server_shutdown()) for s in ScriptDB.get_all_cached_instances()] [(s.typeclass, s.at_server_shutdown()) for s in ScriptDB.get_all_cached_instances()]
ServerConfig.objects.conf("server_restart_mode", "reset") ServerConfig.objects.conf("server_restart_mode", "reset")
if not _abrupt: if not _abrupt:
SERVER_HOOK_MODULE.at_server_stop()
reactor.callLater(0, reactor.stop) reactor.callLater(0, reactor.stop)
if os.name == 'nt' and os.path.exists(SERVER_PIDFILE): if os.name == 'nt' and os.path.exists(SERVER_PIDFILE):
# for Windows we need to remove pid files manually # for Windows we need to remove pid files manually

View file

@ -142,7 +142,7 @@ DATABASE_HOST = ''
DATABASE_PORT = '' DATABASE_PORT = ''
################################################### ###################################################
# Evennia in-game parsers # Evennia pluggable modules
################################################### ###################################################
# An alternate command parser module to use # An alternate command parser module to use
@ -163,9 +163,14 @@ CONNECTION_SCREEN_MODULE = "game.gamesrc.conf.connection_screens"
# the server's initial setup sequence (the very first startup of the system). # the server's initial setup sequence (the very first startup of the system).
# The check will fail quietly if module doesn't exist or fails to load. # The check will fail quietly if module doesn't exist or fails to load.
AT_INITIAL_SETUP_HOOK_MODULE = "game.gamesrc.conf.at_initial_setup" AT_INITIAL_SETUP_HOOK_MODULE = "game.gamesrc.conf.at_initial_setup"
# Module holding at_server_start(), at_server_reload() and
# at_server_stop() methods. These methods will be called every time
# the server starts, reloads and resets/stops.
AT_SERVER_STARTSTOP_MODULE = "game.gamesrc.conf.at_server_startstop"
# Module holding server-side functions for out-of-band protocols to call. # Module holding server-side functions for out-of-band protocols to call.
OOB_FUNC_MODULE = "game.gamesrc.conf.oobfuncs" OOB_FUNC_MODULE = "game.gamesrc.conf.oobfuncs"
################################################### ###################################################
# Default command sets # Default command sets
################################################### ###################################################