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()
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)
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)
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)
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)