Add tag to catch link-dead puppet. Resolve #2829, #2737

This commit is contained in:
Griatch 2022-10-29 20:54:57 +02:00
parent 5c6a4200c2
commit da68598b63
16 changed files with 741 additions and 643 deletions

View file

@ -7,39 +7,36 @@ the networking features. (this is done automatically by
evennia/server/server_runner.py).
"""
import time
import sys
import os
import sys
import time
import traceback
from twisted.web import static
import django
from twisted.application import internet, service
from twisted.internet import reactor, defer
from twisted.internet import defer, reactor
from twisted.internet.task import LoopingCall
from twisted.logger import globalLogPublisher
import django
from twisted.web import static
django.setup()
import evennia
import importlib
import evennia
evennia._init()
from django.conf import settings
from django.db import connection
from django.db.utils import OperationalError
from django.conf import settings
from django.utils.translation import gettext as _
from evennia.accounts.models import AccountDB
from evennia.scripts.models import ScriptDB
from evennia.server.models import ServerConfig
from evennia.utils.utils import get_evennia_version, mod_import, make_iter
from evennia.utils import logger
from evennia.server.sessionhandler import SESSIONS
from django.utils.translation import gettext as _
from evennia.utils import logger
from evennia.utils.utils import get_evennia_version, make_iter, mod_import
_SA = object.__setattr__
@ -108,6 +105,7 @@ _MAINTENANCE_COUNT = 0
_FLUSH_CACHE = None
_IDMAPPER_CACHE_MAXSIZE = settings.IDMAPPER_CACHE_MAXSIZE
_GAMETIME_MODULE = None
_DEFAULTOBJECT = None
_IDLE_TIMEOUT = settings.IDLE_TIMEOUT
_LAST_SERVER_TIME_SNAPSHOT = 0
@ -120,11 +118,12 @@ def _server_maintenance():
"""
global EVENNIA, _MAINTENANCE_COUNT, _FLUSH_CACHE, _GAMETIME_MODULE
global _LAST_SERVER_TIME_SNAPSHOT
global _OBJECTDB
if not _FLUSH_CACHE:
from evennia.utils.idmapper.models import conditional_flush as _FLUSH_CACHE
if not _GAMETIME_MODULE:
from evennia.objects.models import ObjectDB as _OBJECTDB
from evennia.utils import gametime as _GAMETIME_MODULE
from evennia.utils.idmapper.models import conditional_flush as _FLUSH_CACHE
_MAINTENANCE_COUNT += 1
@ -167,6 +166,20 @@ def _server_maintenance():
for session in to_disconnect:
SESSIONS.disconnect(session, reason=reason)
# run unpuppet hooks for objects that are marked as being puppeted,
# but which lacks an account (indicates a broken unpuppet operation
# such as a server crash)
if _MAINTENANCE_COUNT > 1:
unpuppet_count = 0
for obj in _OBJECTDB.objects.get_by_tag(key="puppeted", category="account"):
if not obj.has_account:
obj.at_pre_unpuppet()
obj.at_post_unpuppet(None, reason=_(" (connection lost)"))
obj.tags.remove("puppeted", category="account")
unpuppet_count += 1
if unpuppet_count:
logger.log_msg(f"Ran unpuppet-hooks for {unpuppet_count} link-dead puppets.")
# ------------------------------------------------------------
# Evennia Main Server object
@ -280,8 +293,8 @@ class Evennia:
): # can't use any() since mismatches may be [0] which reads as False for any()
# we have a changed default. Import relevant objects and
# run the update
from evennia.objects.models import ObjectDB
from evennia.comms.models import ChannelDB
from evennia.objects.models import ObjectDB
# from evennia.accounts.models import AccountDB
for i, prev, curr in (
@ -372,8 +385,8 @@ class Evennia:
"""
from evennia.comms.models import ChannelDB
from evennia.accounts.models import AccountDB
from evennia.comms.models import ChannelDB
from evennia.utils.create import create_channel
superuser = AccountDB.objects.get(id=1)
@ -709,10 +722,10 @@ if WEBSERVER_ENABLED:
from evennia.server.webserver import (
DjangoWebRoot,
WSGIWebServer,
Website,
LockableThreadPool,
PrivateStaticRoot,
Website,
WSGIWebServer,
)
# start a thread pool and define the root url (/) as a wsgi resource