Implement player add/remove
This commit is contained in:
parent
e8b209e231
commit
5e8a761675
@ -122,7 +122,25 @@ def command_player_add(args):
|
||||
"""
|
||||
Add a player to a lexicon
|
||||
"""
|
||||
raise NotImplementedError() # TODO
|
||||
# Module imports
|
||||
from config import logger
|
||||
from lexicon import LexiconModel
|
||||
from lexicon.manage import add_player
|
||||
from user import UserModel
|
||||
|
||||
# Verify arguments
|
||||
u = UserModel.by(name=args.username)
|
||||
if u is None:
|
||||
logger.error("Could not find user '{}'".format(args.username))
|
||||
return -1
|
||||
lex = LexiconModel.by(name=args.lexicon)
|
||||
if lex is None:
|
||||
logger.error("Could not find lexicon '{}'".format(args.lexicon))
|
||||
return -1
|
||||
|
||||
# Internal call
|
||||
add_player(lex, u)
|
||||
|
||||
|
||||
@requires_lexicon
|
||||
@requires_username
|
||||
@ -133,7 +151,28 @@ def command_player_remove(args):
|
||||
Removing a player dissociates them from any characters
|
||||
they control but does not delete any character data.
|
||||
"""
|
||||
raise NotImplementedError() # TODO
|
||||
# Module imports
|
||||
from config import logger
|
||||
from lexicon import LexiconModel
|
||||
from lexicon.manage import remove_player
|
||||
from user import UserModel
|
||||
|
||||
# Verify arguments
|
||||
u = UserModel.by(name=args.username)
|
||||
if u is None:
|
||||
logger.error("Could not find user '{}'".format(args.username))
|
||||
return -1
|
||||
lex = LexiconModel.by(name=args.lexicon)
|
||||
if lex is None:
|
||||
logger.error("Could not find lexicon '{}'".format(args.lexicon))
|
||||
return -1
|
||||
if lex.editor == u.id:
|
||||
logger.error("Can't remove the editor of a lexicon")
|
||||
return -1
|
||||
|
||||
# Internal call
|
||||
remove_player(lex, u)
|
||||
|
||||
|
||||
@requires_lexicon
|
||||
def command_player_list(args):
|
||||
|
@ -94,4 +94,71 @@ def get_all_lexicons():
|
||||
# Load all of the lexicons
|
||||
lexes = map(lambda id: lexicon.LexiconModel.by(lid=id), lids)
|
||||
|
||||
return lexes
|
||||
return lexes
|
||||
|
||||
|
||||
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 ValueError("Invalid lexicon: '{}'".format(lex))
|
||||
if player is None:
|
||||
raise ValueError("Invalid player: '{}'".format(player))
|
||||
|
||||
# Idempotently add player
|
||||
with config.json_rw(lex.config_path) as cfg:
|
||||
if player.id not in cfg.join.joined:
|
||||
cfg.join.joined.append(player.id)
|
||||
|
||||
|
||||
def remove_player(lex, player):
|
||||
"""
|
||||
Remove a player from a lexicon
|
||||
"""
|
||||
# Verify arguments
|
||||
if lex is None:
|
||||
raise ValueError("Invalid lexicon: '{}'".format(lex))
|
||||
if player is None:
|
||||
raise ValueError("Invalid player: '{}'".format(player))
|
||||
if lex.editor == player.id:
|
||||
raise ValueError("Can't remove the editor '{}' from lexicon '{}'".format(player.username, lex.name))
|
||||
|
||||
# Idempotently remove player
|
||||
with config.json_rw(lex.config_path) as cfg:
|
||||
if player.id in cfg.join.joined:
|
||||
cfg.join.joined.remove(player.id)
|
||||
|
||||
# TODO Reassign the player's characters to the editor
|
||||
|
||||
|
||||
def list_players(lex):
|
||||
"""
|
||||
"""
|
||||
pass
|
Loading…
Reference in New Issue
Block a user