def at_post_portal_sync(self): """ This is called just after the portal has finished syncing back data to the server after reconnecting. """ # one of reload, reset or shutdown mode = self.getset_restart_mode() from evennia.scripts.monitorhandler import MONITOR_HANDLER MONITOR_HANDLER.restore(mode == 'reload') from evennia.scripts.tickerhandler import TICKER_HANDLER TICKER_HANDLER.restore(mode == 'reload') # after sync is complete we force-validate all scripts # (this also starts any that didn't yet start) ScriptDB.objects.validate(init_mode=mode) # start the task handler from evennia.scripts.taskhandler import TASK_HANDLER TASK_HANDLER.load() TASK_HANDLER.create_delays() # delete the temporary setting ServerConfig.objects.conf("server_restart_mode", delete=True)
def at_post_portal_sync(self, mode): """ This is called just after the portal has finished syncing back data to the server after reconnecting. Args: mode (str): One of reload, reset or shutdown. """ from evennia.scripts.monitorhandler import MONITOR_HANDLER MONITOR_HANDLER.restore(mode == 'reload') from evennia.scripts.tickerhandler import TICKER_HANDLER TICKER_HANDLER.restore(mode == 'reload') # after sync is complete we force-validate all scripts # (this also starts any that didn't yet start) ScriptDB.objects.validate(init_mode=mode) # start the task handler from evennia.scripts.taskhandler import TASK_HANDLER TASK_HANDLER.load() TASK_HANDLER.create_delays() # delete the temporary setting ServerConfig.objects.conf("server_restart_mode", delete=True)
def test_disable_stale_removal(self): # manual removal of stale tasks. timedelay = self.timedelay _TASK_HANDLER.stale_timeout = 0 for pers in (False, True): t = utils.delay(timedelay, dummy_func, self.char1.dbref, persistent=pers) t.cancel() self.assertFalse(t.active()) _TASK_HANDLER.clock.advance(timedelay) # make time pass if pers: self.assertTrue(t.get_id() in _TASK_HANDLER.to_save) self.assertTrue(t.get_id() in _TASK_HANDLER.tasks) # Make task handler's now time, after the stale timeout _TASK_HANDLER._now = datetime.now() + timedelta(seconds=_TASK_HANDLER.stale_timeout + timedelay + 1) t2 = utils.delay(timedelay, dummy_func, self.char1.dbref) if pers: self.assertTrue(t.get_id() in _TASK_HANDLER.to_save) self.assertTrue(t.get_id() in _TASK_HANDLER.tasks) self.assertEqual(self.char1.ndb.dummy_var, False) # manual removal should still work _TASK_HANDLER.clean_stale_tasks() # cleanup of stale tasks in in the save method if pers: self.assertFalse(t.get_id() in _TASK_HANDLER.to_save) self.assertFalse(t.get_id() in _TASK_HANDLER.tasks) _TASK_HANDLER.clear()
def test_active(self): timedelay = self.timedelay t = utils.delay(timedelay, dummy_func, self.char1.dbref) self.assertTrue(_TASK_HANDLER.active(t.get_id())) self.assertTrue(t.active()) _TASK_HANDLER.clock.advance(timedelay) # make time pass self.assertFalse(_TASK_HANDLER.active(t.get_id())) self.assertFalse(t.active())
def at_post_portal_sync(self, mode): """ This is called just after the portal has finished syncing back data to the server after reconnecting. Args: mode (str): One of reload, reset or shutdown. """ from evennia.scripts.monitorhandler import MONITOR_HANDLER MONITOR_HANDLER.restore(mode == "reload") from evennia.scripts.tickerhandler import TICKER_HANDLER TICKER_HANDLER.restore(mode == "reload") # after sync is complete we force-validate all scripts # (this also starts any that didn't yet start) ScriptDB.objects.validate(init_mode=mode) # start the task handler from evennia.scripts.taskhandler import TASK_HANDLER TASK_HANDLER.load() TASK_HANDLER.create_delays() # check so default channels exist from evennia.comms.models import ChannelDB from evennia.accounts.models import AccountDB from evennia.utils.create import create_channel god_account = AccountDB.objects.get(id=1) # mudinfo mudinfo_chan = settings.CHANNEL_MUDINFO if not mudinfo_chan: raise RuntimeError("settings.CHANNEL_MUDINFO must be defined.") if not ChannelDB.objects.filter(db_key=mudinfo_chan["key"]): channel = create_channel(**mudinfo_chan) channel.connect(god_account) # connectinfo connectinfo_chan = settings.CHANNEL_MUDINFO if connectinfo_chan: if not ChannelDB.objects.filter(db_key=mudinfo_chan["key"]): channel = create_channel(**connectinfo_chan) # default channels for chan_info in settings.DEFAULT_CHANNELS: if not ChannelDB.objects.filter(db_key=chan_info["key"]): channel = create_channel(**chan_info) channel.connect(god_account) # delete the temporary setting ServerConfig.objects.conf("server_restart_mode", delete=True)
def test_auto_stale_task_removal(self): # automated removal of stale tasks. timedelay = self.timedelay for pers in (False, True): t = utils.delay(timedelay, dummy_func, self.char1.dbref, persistent=pers) t.cancel() self.assertFalse(t.active()) _TASK_HANDLER.clock.advance(timedelay) # make time pass if pers: self.assertTrue(t.get_id() in _TASK_HANDLER.to_save) self.assertTrue(t.get_id() in _TASK_HANDLER.tasks) # Make task handler's now time, after the stale timeout _TASK_HANDLER._now = datetime.now() + timedelta(seconds=_TASK_HANDLER.stale_timeout + timedelay + 1) # add a task to test automatic removal t2 = utils.delay(timedelay, dummy_func, self.char1.dbref) if pers: self.assertFalse(t.get_id() in _TASK_HANDLER.to_save) self.assertFalse(t.get_id() in _TASK_HANDLER.tasks) self.assertEqual(self.char1.ndb.dummy_var, False) _TASK_HANDLER.clear()
def test_server_restart(self): # emulate a server restart timedelay = self.timedelay utils.delay(timedelay, dummy_func, self.char1.dbref, persistent=True) _TASK_HANDLER.clear(False) # remove all tasks from task handler, do not save this change. _TASK_HANDLER.clock.advance(timedelay) # advance twisted reactor time past callback time self.assertEqual(self.char1.ndb.dummy_var, False) # task has not run _TASK_HANDLER.load() # load persistent tasks from database. _TASK_HANDLER.create_delays() # create new deffered instances from persistent tasks _TASK_HANDLER.clock.advance(timedelay) # Clock must advance to trigger, even if past timedelay self.assertEqual(self.char1.ndb.dummy_var, 'dummy_func ran')
def tearDown(self): super().tearDown() _TASK_HANDLER.clear()