add a Character manager operation to log everyone out

this is without penalty

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
This commit is contained in:
Brian S. Stephan 2024-05-14 14:10:33 -05:00
parent 04e09af8a9
commit 27fcecd8aa
Signed by: bss
GPG Key ID: 3DE06D3180895FCB
2 changed files with 24 additions and 0 deletions

View File

@ -52,6 +52,16 @@ class Game(models.Model):
class CharacterManager(models.Manager): class CharacterManager(models.Manager):
"""Query manager for creating a Character and taking operations relevant to the game.""" """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): def register(self, name: str, game: Game, password: str, hostmask: str, character_class: str):
"""Create a character, with guardrails. """Create a character, with guardrails.

View File

@ -44,6 +44,20 @@ class CharacterTest(TestCase):
assert char.status == Character.CHARACTER_STATUS_OFFLINE assert char.status == Character.CHARACTER_STATUS_OFFLINE
assert char.last_login == logout_time 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): def test_cant_log_out_offline(self):
"""Test that we error if trying to log out a character already offline.""" """Test that we error if trying to log out a character already offline."""
char = Character.objects.get(pk=1) char = Character.objects.get(pk=1)