from src.messages import messages from src.events import Event from src import settings as var from src import users __all__ = ["get_players", "get_all_players", "get_participants", "get_target", "get_main_role", "get_all_roles"] def get_players(roles=None, *, mainroles=None): if mainroles is None: mainroles = var.MAIN_ROLES if roles is None: roles = set(mainroles.values()) pl = set() for user, role in mainroles.items(): if role in roles: pl.add(user) if mainroles is not var.MAIN_ROLES: # we weren't given an actual player list (possibly), # so the elements of pl are not necessarily in var.ALL_PLAYERS return list(pl) return [p for p in var.ALL_PLAYERS if p in pl] def get_all_players(roles=None): if roles is None: roles = var.ROLES pl = set() for role in roles: for nick in var.ROLES[role]: pl.add(users._get(nick)) # FIXME return pl def get_participants(): """List all players who are still able to participate in the game.""" evt = Event("get_participants", {"players": get_players()}) evt.dispatch(var) return evt.data["players"] def get_target(var, wrapper, message, *, allow_self=False, allow_bot=False): if not message: wrapper.pm(messages["not_enough_parameters"]) return players = get_players() if not allow_self and wrapper.source in players: players.remove(wrapper.source) if allow_bot: players.append(users.Bot) match, count = users.complete_match(message, players) if match is None: if not count and users.lower(wrapper.source.nick).startswith(users.lower(message)): return wrapper.source wrapper.pm(messages["not_playing"].format(message)) return return match def get_main_role(user): role = var.MAIN_ROLES.get(user) if role is not None: return role # not found in player list, see if they're a special participant if user in get_participants(): evt = Event("get_participant_role", {"role": None}) evt.dispatch(var, user) role = evt.data["role"] if role is None: raise ValueError("User {0} isn't playing and has no defined participant role".format(user)) return role def get_all_roles(user): return {role for role, nicks in var.ROLES.items() if user.nick in nicks}