Source code for brawlstats.models

from box import Box, BoxList

from .utils import bstag

__all__ = ['Player', 'Club', 'Members', 'Ranking', 'BattleLog', 'Constants', 'Brawlers']


class BaseBox:
    def __init__(self, client, data):
        self.client = client
        self.from_data(data)

    def from_data(self, data):
        self.raw_data = data
        self._boxed_data = Box(data, camel_killer_box=True)
        return self

    def __getattr__(self, attr):
        try:
            return getattr(self._boxed_data, attr)
        except AttributeError:
            try:
                return super().__getattr__(attr)
            except AttributeError:
                return None  # users can use an if statement rather than try/except to find a missing attribute

    def __getitem__(self, item):
        try:
            return self._boxed_data[item]
        except IndexError:
            raise IndexError('No such index: {}'.format(item))


class BaseBoxList(BaseBox):
    def from_data(self, data):
        self.raw_data = data
        self._boxed_data = BoxList(data, camel_killer_box=True)
        return self

    def __len__(self):
        return sum(1 for i in self)


[docs]class Members(BaseBoxList): """A list of the members in a club.""" def __init__(self, client, data): super().__init__(client, data['items']) def __repr__(self): return '<Members object count={}>'.format(len(self))
[docs]class Club(BaseBox): """A club object with all of its attributes.""" def __repr__(self): return "<Club object name='{0.name}' tag='{0.tag}'>".format(self) def __str__(self): return '{0.name} ({0.tag})'.format(self)
[docs] def get_members(self) -> Members: """Gets the members of a club. Returns ------- Members A list of the members in a club. """ url = '{}/{}/members'.format(self.client.api.CLUB, bstag(self.tag)) return self.client._get_model(url, model=Members)
[docs]class Player(BaseBox): """A player object with all of its attributes.""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.team_victories = self.x3vs3_victories def __repr__(self): return "<Player object name='{0.name}' tag='{0.tag}'>".format(self) def __str__(self): return '{0.name} ({0.tag})'.format(self)
[docs] def get_club(self) -> Club: """Gets the player's club. Returns ------- Club or None A list of the members in a club, or None if the player is not in a club. """ if not self.club: if self.client.is_async: async def wrapper(): return None return wrapper() return None url = '{}/{}'.format(self.client.api.CLUB, bstag(self.club.tag)) return self.client._get_model(url, model=Club)
[docs]class Ranking(BaseBoxList): """A player or club ranking that contains a list of players or clubs.""" def __init__(self, client, data): super().__init__(client, data['items']) def __repr__(self): return '<Ranking object count={}>'.format(len(self))
[docs]class BattleLog(BaseBoxList): """A player battle object with all of its attributes.""" def __init__(self, client, data): super().__init__(client, data['items'])
[docs]class Constants(BaseBox): """Data containing some Brawl Stars constants.""" pass
[docs]class Brawlers(BaseBoxList): """A list of available brawlers and information about them.""" def __init__(self, client, data): super().__init__(client, data['items'])