Move player join code to lexicon.setup

This commit is contained in:
Tim Van Baak 2020-04-23 23:24:05 -07:00
parent 97ac9bf7e3
commit afb49a86db
3 changed files with 59 additions and 47 deletions

View File

@ -1,6 +1,11 @@
from amanuensis.lexicon.admin import valid_name, create_lexicon
from amanuensis.lexicon.setup import (
player_can_join_lexicon,
add_player_to_lexicon)
__all__ = [member.__name__ for member in [
valid_name,
create_lexicon,
player_can_join_lexicon,
add_player_to_lexicon,
]]

View File

@ -68,53 +68,6 @@ def get_user_lexicons(user):
if user.in_lexicon(lexicon)]
def valid_add(lex, player, password=None):
"""
Checks whether the given player can join a lexicon
"""
# Trivial failures
if lex is None:
return False
if player is None:
return False
# Can't join if already in the game
if player.id in lex.join.joined:
return False
# Can't join if the game is closed
if not lex.join.open:
return False
# Can't join if the player max is reached
if len(lex.join.joined) >= lex.join.max_players:
return False
# Can't join if the password doesn't check out
if lex.join.password is not None and lex.join.password != password:
return False
return True
def add_player(lex, player):
"""
Unconditionally adds a player to a lexicon
"""
# Verify arguments
if lex is None:
raise ArgumentError("Invalid lexicon: '{}'".format(lex))
if player is None:
raise ArgumentError("Invalid player: '{}'".format(player))
# Idempotently add player
added = False
with json_rw(lex.config_path) as cfg:
if player.id not in cfg.join.joined:
cfg.join.joined.append(player.id)
added = True
# Log to the lexicon's log
if added:
lex.add_log("Player '{0.username}' joined ({0.id})".format(player))
def remove_player(lex, player):
"""
Remove a player from a lexicon

View File

@ -2,3 +2,57 @@
Submodule of functions for managing lexicon games during the setup and
joining part of the game lifecycle.
"""
from amanuensis.errors import ArgumentError
from amanuensis.models import LexiconModel, UserModel
def player_can_join_lexicon(
player: UserModel,
lexicon: LexiconModel,
password: str = None):
"""
Checks whether the given player can join a lexicon
"""
# Trivial failures
if lexicon is None:
return False
if player is None:
return False
# Can't join if already in the game
if player.uid in lexicon.cfg.join.joined:
return False
# Can't join if the game is closed
if not lexicon.cfg.join.open:
return False
# Can't join if there's no room left
if len(lexicon.cfg.join.joined) >= lexicon.cfg.join.max_players:
return False
# Can't join if the password doesn't check out
if (lexicon.cfg.join.password is not None
and lexicon.cfg.join.password != password):
return False
return True
def add_player_to_lexicon(
player: UserModel,
lexicon: LexiconModel):
"""
Unconditionally adds a player to a lexicon
"""
# Verify arguments
if lexicon is None:
raise ArgumentError(f'Invalid lexicon: {lexicon}')
if player is None:
raise ArgumentError(f'Invalid player: {player}')
# Idempotently add player
added = False
with lexicon.ctx.edit_config() as cfg:
if player.uid not in cfg.join.joined:
cfg.join.joined.append(player.uid)
added = True
# Log to the lexicon's log
if added:
lexicon.log('Player "{0.cfg.username}" joined ({0.uid})'.format(player))