def _server_maintenance(): """ This maintenance function handles repeated checks and updates that the server needs to do. It is called every minute. """ global EVENNIA, _MAINTENANCE_COUNT, _FLUSH_CACHE, _GAMETIME_MODULE global _LAST_SERVER_TIME_SNAPSHOT if not _FLUSH_CACHE: from evennia.utils.idmapper.models import conditional_flush as _FLUSH_CACHE if not _GAMETIME_MODULE: from evennia.utils import gametime as _GAMETIME_MODULE _MAINTENANCE_COUNT += 1 now = time.time() if _MAINTENANCE_COUNT == 1: # first call after a reload _GAMETIME_MODULE.SERVER_START_TIME = now _GAMETIME_MODULE.SERVER_RUNTIME = ServerConfig.objects.conf( "runtime", default=0.0) _LAST_SERVER_TIME_SNAPSHOT = now else: # adjust the runtime not with 60s but with the actual elapsed time # in case this may varies slightly from 60s. _GAMETIME_MODULE.SERVER_RUNTIME += now - _LAST_SERVER_TIME_SNAPSHOT _LAST_SERVER_TIME_SNAPSHOT = now # update game time and save it across reloads _GAMETIME_MODULE.SERVER_RUNTIME_LAST_UPDATED = now ServerConfig.objects.conf("runtime", _GAMETIME_MODULE.SERVER_RUNTIME) if _MAINTENANCE_COUNT % 300 == 0: # check cache size every 5 minutes _FLUSH_CACHE(_IDMAPPER_CACHE_MAXSIZE) if _MAINTENANCE_COUNT % 3600 == 0: # validate scripts every hour evennia.ScriptDB.objects.validate() if _MAINTENANCE_COUNT % 3700 == 0: # validate channels off-sync with scripts evennia.CHANNEL_HANDLER.update() if _MAINTENANCE_COUNT % (3600 * 7) == 0: # drop database connection every 7 hrs to avoid default timeouts on MySQL # (see https://github.com/evennia/evennia/issues/1376) connection.close() # handle idle timeouts if _IDLE_TIMEOUT > 0: reason = _("idle timeout exceeded") to_disconnect = [] for session in (sess for sess in SESSIONS.values() if (now - sess.cmd_last) > _IDLE_TIMEOUT): if not session.account or not session.account.access( session.account, "noidletimeout", default=False): to_disconnect.append(session) for session in to_disconnect: SESSIONS.disconnect(session, reason=reason)
def disconnect_session_from_player(self, session): """ Access method for disconnecting a given session from the player (connection happens automatically in the sessionhandler) Args: session (Session): Session to disconnect. """ global _SESSIONS if not _SESSIONS: from evennia.server.sessionhandler import SESSIONS as _SESSIONS _SESSIONS.disconnect(session)
def disconnect_session_from_account(self, session, reason=None): """ Access method for disconnecting a given session from the account (connection happens automatically in the sessionhandler) Args: session (Session): Session to disconnect. reason (str, optional): Eventual reason for the disconnect. """ global _SESSIONS if not _SESSIONS: from evennia.server.sessionhandler import SESSIONS as _SESSIONS _SESSIONS.disconnect(session, reason)
def _server_maintenance(): """ This maintenance function handles repeated checks and updates that the server needs to do. It is called every minute. """ global EVENNIA, _MAINTENANCE_COUNT, _FLUSH_CACHE, _GAMETIME_MODULE if not _FLUSH_CACHE: from evennia.utils.idmapper.models import conditional_flush as _FLUSH_CACHE if not _GAMETIME_MODULE: from evennia.utils import gametime as _GAMETIME_MODULE _MAINTENANCE_COUNT += 1 now = time.time() if _MAINTENANCE_COUNT == 1: # first call after a reload _GAMETIME_MODULE.SERVER_START_TIME = now _GAMETIME_MODULE.SERVER_RUNTIME = ServerConfig.objects.conf( "runtime", default=0.0) else: _GAMETIME_MODULE.SERVER_RUNTIME += 60.0 # update game time and save it across reloads _GAMETIME_MODULE.SERVER_RUNTIME_LAST_UPDATED = now ServerConfig.objects.conf("runtime", _GAMETIME_MODULE.SERVER_RUNTIME) if _MAINTENANCE_COUNT % 300 == 0: # check cache size every 5 minutes _FLUSH_CACHE(_IDMAPPER_CACHE_MAXSIZE) if _MAINTENANCE_COUNT % 3600 == 0: # validate scripts every hour evennia.ScriptDB.objects.validate() if _MAINTENANCE_COUNT % 3700 == 0: # validate channels off-sync with scripts evennia.CHANNEL_HANDLER.update() # handle idle timeouts if _IDLE_TIMEOUT > 0: reason = _("idle timeout exceeded") for session in (sess for sess in SESSIONS.values() if (now - sess.cmd_last) > _IDLE_TIMEOUT): if not session.account or not \ session.account.access(session.account, "noidletimeout", default=False): SESSIONS.disconnect(session, reason=reason)
def _server_maintenance(): """ This maintenance function handles repeated checks and updates that the server needs to do. It is called every minute. """ global EVENNIA, _MAINTENANCE_COUNT, _FLUSH_CACHE, _GAMETIME_MODULE if not _FLUSH_CACHE: from evennia.utils.idmapper.models import conditional_flush as _FLUSH_CACHE if not _GAMETIME_MODULE: from evennia.utils import gametime as _GAMETIME_MODULE _MAINTENANCE_COUNT += 1 now = time.time() if _MAINTENANCE_COUNT == 1: # first call after a reload _GAMETIME_MODULE.SERVER_START_TIME = now _GAMETIME_MODULE.SERVER_RUNTIME = ServerConfig.objects.conf("runtime", default=0.0) else: _GAMETIME_MODULE.SERVER_RUNTIME += 60.0 # update game time and save it across reloads _GAMETIME_MODULE.SERVER_RUNTIME_LAST_UPDATED = now ServerConfig.objects.conf("runtime", _GAMETIME_MODULE.SERVER_RUNTIME) if _MAINTENANCE_COUNT % 300 == 0: # check cache size every 5 minutes _FLUSH_CACHE(_IDMAPPER_CACHE_MAXSIZE) if _MAINTENANCE_COUNT % 3600 == 0: # validate scripts every hour evennia.ScriptDB.objects.validate() if _MAINTENANCE_COUNT % 3700 == 0: # validate channels off-sync with scripts evennia.CHANNEL_HANDLER.update() # handle idle timeouts if _IDLE_TIMEOUT > 0: reason = _("idle timeout exceeded") for session in (sess for sess in SESSIONS.values() if (now - sess.cmd_last) > _IDLE_TIMEOUT): if not session.account or not \ session.account.access(session.account, "noidletimeout", default=False): SESSIONS.disconnect(session, reason=reason)