diff --git a/idlerpg/models.py b/idlerpg/models.py index c24b431..2fab5e7 100644 --- a/idlerpg/models.py +++ b/idlerpg/models.py @@ -52,6 +52,16 @@ class Game(models.Model): class CharacterManager(models.Manager): """Query manager for creating a Character and taking operations relevant to the game.""" + def log_out_everyone(self): + """Log out every logged in character. + + This is probably being called on shutdown or another situation when we can't monitor state, so we'll + just recreate it whenever it is we come back online. + """ + self.filter(enabled=True, + status=Character.CHARACTER_STATUS_LOGGED_IN).update(status=Character.CHARACTER_STATUS_OFFLINE) + logger.info("ALL::ALL: logged out all currently online or logged in characters") + def register(self, name: str, game: Game, password: str, hostmask: str, character_class: str): """Create a character, with guardrails. diff --git a/tests/test_idlerpg_character.py b/tests/test_idlerpg_character.py index da43382..27ccd4e 100644 --- a/tests/test_idlerpg_character.py +++ b/tests/test_idlerpg_character.py @@ -44,6 +44,20 @@ class CharacterTest(TestCase): assert char.status == Character.CHARACTER_STATUS_OFFLINE assert char.last_login == logout_time + def test_log_out_everyone(self): + """Test logging out everyone in the database.""" + game = Game.objects.get(pk=1) + # make some data + Character.objects.register('loe1', game, 'test', 'loe1', 'log_out_everyone_tester') + Character.objects.register('loe2', game, 'test', 'loe2', 'log_out_everyone_tester') + Character.objects.register('loe3', game, 'test', 'loe3', 'log_out_everyone_tester') + + assert Character.objects.filter(status=Character.CHARACTER_STATUS_LOGGED_IN).count() >= 3 + + Character.objects.log_out_everyone() + + assert Character.objects.filter(status=Character.CHARACTER_STATUS_LOGGED_IN).count() == 0 + def test_cant_log_out_offline(self): """Test that we error if trying to log out a character already offline.""" char = Character.objects.get(pk=1)