Source code for brawlstats.models

from box import Box, BoxList

from .utils import bstag

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


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(f'No such index: {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 f'<Members object count={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 Club(BaseBox): """A club object with all of its attributes.""" def __repr__(self): return f"<Club object name='{self.name}' tag='{self.tag}'>" def __str__(self): return f'{self.name} ({self.tag})'
[docs] def get_members(self) -> Members: """Gets the members of a club. Note: It is preferred to get the members via Club.members since this method makes an extra API call but returns the same data. Returns ------- Members A list of the members in a club. """ url = f'{self.client.api.CLUB}/{bstag(self.tag)}/members' 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 f"<Player object name='{self.name}' tag='{self.tag}'>" def __str__(self): return f'{self.name} ({self.tag})'
[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 = f'{self.client.api.CLUB}/{bstag(self.club.tag)}' return self.client._get_model(url, model=Club)
[docs] def get_battle_logs(self) -> BattleLog: """Gets the player's battle logs. Returns ------- BattleLog The battle log containing the player's most recent battles. """ url = f'{self.client.api.PROFILE}/{bstag(self.tag)}/battlelog' return self.client._get_model(url, model=BattleLog)
[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 Brawlers(BaseBoxList): """A list of available brawlers and information about them.""" def __init__(self, client, data): super().__init__(client, data['items'])
[docs] class EventRotation(BaseBoxList): """A list of events in the current rotation.""" pass