예제 #1
0
    def run_init_hooks(self):
        """
        Called every server start
        """
        from src.objects.models import ObjectDB
        #from src.players.models import PlayerDB

        #update eventual changed defaults
        self.update_defaults()

        #print "run_init_hooks:", 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()]

        with open(SERVER_RESTART, 'r') as f:
            mode = f.read()
        if mode in ('True', 'reload'):
            from src.server.oobhandler import OOB_HANDLER
            OOB_HANDLER.restore()

        from src.scripts.tickerhandler import TICKER_HANDLER
        TICKER_HANDLER.restore()

        if SERVER_STARTSTOP_MODULE:
            # call correct server hook based on start file value
            if mode in ('True', 'reload'):
                # True was the old reload flag, kept for compatibilty
                SERVER_STARTSTOP_MODULE.at_server_reload_start()
            elif mode in ('reset', 'shutdown'):
                SERVER_STARTSTOP_MODULE.at_server_cold_start()
                # clear eventual lingering session storages
                ObjectDB.objects.clear_all_sessids()
            # always call this regardless of start type
            SERVER_STARTSTOP_MODULE.at_server_start()
예제 #2
0
    def data_in(self, text=None, **kwargs):
        """
        Send User->Evennia. This will in effect
        execute a command string on the server.

        Especially handled keywords:

        oob - this should hold a dictionary of oob command calls from
              the oob-supporting protocol.
        """
        if text:
            # this is treated as a command input
            text = to_unicode(text)
            # handle the 'idle' command
            if text.strip() == IDLE_COMMAND:
                self.update_session_counters(idle=True)
                return
            if self.player:
                # nick replacement
                puppet = self.player.get_puppet(self.sessid)
                if puppet:
                    text = puppet.nicks.nickreplace(text,
                                                    categories=("inputline",
                                                                "channel"),
                                                    include_player=True)
                else:
                    text = self.player.nicks.nickreplace(
                        text,
                        categories=("inputline", "channels"),
                        include_player=False)
            cmdhandler.cmdhandler(self,
                                  text,
                                  callertype="session",
                                  sessid=self.sessid)
            self.update_session_counters()
        if "oob" in kwargs:
            # handle oob instructions
            global _OOB_HANDLER
            if not _OOB_HANDLER:
                from src.server.oobhandler import OOB_HANDLER as _OOB_HANDLER
            oobstruct = self.sessionhandler.oobstruct_parser(
                kwargs.pop("oob", None))
            #print "session.data_in: oobstruct:",oobstruct
            for (funcname, args, kwargs) in oobstruct:
                if funcname:
                    _OOB_HANDLER.execute_cmd(self, funcname, *args, **kwargs)
예제 #3
0
    def data_in(self, text=None, **kwargs):
        """
        Send User->Evennia. This will in effect
        execute a command string on the server.

        Especially handled keywords:

        oob - this should hold a dictionary of oob command calls from
              the oob-supporting protocol.
        """
        #explicitly check for None since text can be an empty string, which is
        #also valid
        if text is not None:
            # this is treated as a command input
            #text = to_unicode(escape_control_sequences(text), encoding=self.encoding)
            # handle the 'idle' command
            if text.strip() == IDLE_COMMAND:
                self.update_session_counters(idle=True)
                return
            if self.player:
                # nick replacement
                puppet = self.player.get_puppet(self.sessid)
                if puppet:
                    text = puppet.nicks.nickreplace(text,
                                  categories=("inputline", "channel"), include_player=True)
                else:
                    text = self.player.nicks.nickreplace(text,
                                categories=("inputline", "channels"), include_player=False)
            cmdhandler(self, text, callertype="session", sessid=self.sessid)
            self.update_session_counters()
        if "oob" in kwargs:
            # handle oob instructions
            global _OOB_HANDLER
            if not _OOB_HANDLER:
                from src.server.oobhandler import OOB_HANDLER as _OOB_HANDLER
            oobstruct = self.sessionhandler.oobstruct_parser(kwargs.pop("oob", None))
            #print "session.data_in: oobstruct:",oobstruct
            for (funcname, args, kwargs) in oobstruct:
                if funcname:
                    _OOB_HANDLER.execute_cmd(self, funcname, *args, **kwargs)
예제 #4
0
 def data_in(self, text=None, **kwargs):
     """
     Send User->Evennia. This will in effect
     execute a command string on the server.
     Eventual extra data moves through oob_data_in
     """
     if text:
         # this is treated as a command input
         text = to_str(text)
         # handle the 'idle' command
         if text.strip() == IDLE_COMMAND:
             self.update_session_counters(idle=True)
             return
         if self.player:
             # nick replacement
             nicks = self.player.db_attributes.filter(db_category__in=("nick_inputline", "nick_channel"))
             puppet = self.player.get_puppet(self.sessid)
             if puppet:
                 # merge, give prio to the lowest level (puppet)
                 nicks = list(puppet.db_attributes.filter(db_category__in=("nick_inputline", "nick_channel"))) + list(nicks)
             raw_list = text.split(None)
             raw_list = [" ".join(raw_list[:i + 1])
                           for i in range(len(raw_list)) if raw_list[:i + 1]]
             for nick in nicks:
                 if nick.db_key in raw_list:
                     text = text.replace(nick.db_key, nick.db_strvalue, 1)
                     break
         cmdhandler.cmdhandler(self, text, callertype="session", sessid=self.sessid)
         self.update_session_counters()
     if "oob" in kwargs:
         # handle oob instructions
         global _OOB_HANDLER
         if not _OOB_HANDLER:
             from src.server.oobhandler import OOB_HANDLER as _OOB_HANDLER
         oobstruct = self.sessionhandler.oobstruct_parser(kwargs.pop("oob", None))
         for (funcname, args, kwargs) in oobstruct:
             if funcname:
                 _OOB_HANDLER.execute_cmd(self, funcname, *args, **kwargs)
예제 #5
0
    def shutdown(self, mode=None, _reactor_stopping=False):
        """
        Shuts down the server from inside it.

        mode - sets the server restart mode.
               'reload' - server restarts, no "persistent" scripts
                          are stopped, at_reload hooks called.
               'reset' - server restarts, non-persistent scripts stopped,
                         at_shutdown hooks called.
               'shutdown' - like reset, but server will not auto-restart.
               None - keep currently set flag from flag file.
        _reactor_stopping - this is set if server is stopped by a kill
                            command OR this method was already called
                             once - in both cases the reactor is
                             dead/stopping already.
        """
        if _reactor_stopping and hasattr(self, "shutdown_complete"):
            # this means we have already passed through this method
            # once; we don't need to run the shutdown procedure again.
            defer.returnValue(None)

        mode = self.set_restart_mode(mode)
        # call shutdown hooks on all cached objects

        from src.objects.models import ObjectDB
        #from src.players.models import PlayerDB
        from src.server.models import ServerConfig

        if mode == 'reload':
            # call restart hooks
            yield [(o.typeclass, o.at_server_reload())
                                   for o in ObjectDB.get_all_cached_instances()]
            yield [(p.typeclass, p.at_server_reload())
                                   for p in PlayerDB.get_all_cached_instances()]
            yield [(s.typeclass, s.pause(), s.at_server_reload())
                                   for s in ScriptDB.get_all_cached_instances()]
            yield self.sessions.all_sessions_portal_sync()
            ServerConfig.objects.conf("server_restart_mode", "reload")

            from src.server.oobhandler import OOB_HANDLER
            OOB_HANDLER.save()
            from src.scripts.tickerhandler import TICKER_HANDLER
            TICKER_HANDLER.save()

            if SERVER_STARTSTOP_MODULE:
                SERVER_STARTSTOP_MODULE.at_server_reload_stop()

        else:
            if mode == 'reset':
                # don't unset the is_connected flag on reset, otherwise
                # same as shutdown
                yield [(o.typeclass, o.at_server_shutdown())
                                   for o in ObjectDB.get_all_cached_instances()]
                yield [(p.typeclass, p.at_server_shutdown())
                                       for p in PlayerDB.get_all_cached_instances()]
            else:  # shutdown
                yield [_SA(p, "is_connected", False)
                                   for p in PlayerDB.get_all_cached_instances()]
                yield [(o.typeclass, o.at_server_shutdown())
                                   for o in ObjectDB.get_all_cached_instances()]
                yield [(p.typeclass, p.unpuppet_all(), p.at_server_shutdown())
                                       for p in PlayerDB.get_all_cached_instances()]
            yield [(s.typeclass, s.at_server_shutdown())
                                   for s in ScriptDB.get_all_cached_instances()]
            yield ObjectDB.objects.clear_all_sessids()
            ServerConfig.objects.conf("server_restart_mode", "reset")

            if SERVER_STARTSTOP_MODULE:
                SERVER_STARTSTOP_MODULE.at_server_cold_stop()

        # stopping time
        from src.utils import gametime
        gametime.save()

        if SERVER_STARTSTOP_MODULE:
            SERVER_STARTSTOP_MODULE.at_server_stop()
        # if _reactor_stopping is true, reactor does not need to
        # be stopped again.
        if os.name == 'nt' and os.path.exists(SERVER_PIDFILE):
            # for Windows we need to remove pid files manually
            os.remove(SERVER_PIDFILE)
        if not _reactor_stopping:
            # this will also send a reactor.stop signal, so we set a
            # flag to avoid loops.
            self.shutdown_complete = True
            reactor.callLater(0, reactor.stop)