Source code for cassiopeia.core.account
from typing import Union
from datapipelines import NotFoundError
from merakicommons.cache import lazy_property
from merakicommons.container import searchable
from ..data import Region, Platform, Continent
from .common import CoreData, CassiopeiaGhost, ghost_load_on
from ..dto.account import AccountDto
##############
# Data Types #
##############
class AccountData(CoreData):
_dto_type = AccountDto
_renamed = {"gameName": "name", "tagLine": "tagline"}
##############
# Core Types #
##############
[docs]
@searchable(
{
str: ["name", "tagline", "region", "platform", "continent", "puuid"],
Region: ["region"],
Platform: ["platform"],
Continent: ["continent"],
}
)
class Account(CassiopeiaGhost):
_data_types = {AccountData}
def __init__(
self,
*,
puuid: str = None,
name: str = None,
tagline: str = None,
region: Union[Region, str] = None,
):
kwargs = {"region": region}
if puuid is not None:
kwargs["puuid"] = puuid
if name is not None:
kwargs["name"] = name
if tagline is not None:
kwargs["tagline"] = tagline
super().__init__(**kwargs)
@classmethod
def __get_query_from_kwargs__(
cls,
*,
puuid: str = None,
name: str = None,
tagline: str = None,
region: Union[Region, str],
) -> dict:
query = {"region": region}
if puuid is not None:
query["puuid"] = puuid
if name is not None:
query["name"] = name
if tagline is not None:
query["tagline"] = tagline
return query
def __get_query__(self):
query = {"region": self.region, "platform": self.platform}
try:
query["puuid"] = self._data[AccountData].puuid
except AttributeError:
pass
try:
query["name"] = self._data[AccountData].name
except AttributeError:
pass
try:
query["tagline"] = self._data[AccountData].tagline
except AttributeError:
pass
assert "puuid" in query or ("name" in query and "tagline" in query)
return query
def __eq__(self, other: "Account"):
if not isinstance(other, Account) or self.region != other.region:
return False
s = {}
o = {}
if hasattr(self._data[AccountData], "puuid"):
s["puuid"] = self.puuid
if hasattr(other._data[AccountData], "puuid"):
o["puuid"] = other.puuid
if hasattr(self._data[AccountData], "name"):
s["name"] = self.name
if hasattr(other._data[AccountData], "name"):
o["name"] = other.name
if hasattr(self._data[AccountData], "tagline"):
s["tagline"] = self.tagline
if any(s.get(key, "s") == o.get(key, "o") for key in s):
return True
else:
return self.id == other.id
def __str__(self):
puuid = "?"
name = "?"
tagline = "?"
if hasattr(self._data[AccountData], "puuid"):
puuid = self.puuid
if hasattr(self._data[AccountData], "name"):
name = self.name
if hasattr(self._data[AccountData], "tagline"):
tagline = self.tagline
return f"Account(puuid={puuid}, name={name}, tagline='{tagline}')"
@property
def exists(self):
try:
if not self._Ghost__all_loaded:
self.__load__()
# Make sure we can access these attributes
self.puuid
self.name
self.tagline
return True
except (AttributeError, NotFoundError):
return False
@lazy_property
def region(self) -> Region:
"""The region for this summoner."""
return Region(self._data[AccountData].region)
@lazy_property
def platform(self) -> Platform:
"""The platform for this summoner."""
return self.region.platform
@lazy_property
def continent(self) -> Platform:
"""The continent for this summoner."""
return self.region.continent
@CassiopeiaGhost.property(AccountData)
@ghost_load_on
def puuid(self) -> str:
return self._data[AccountData].puuid
@CassiopeiaGhost.property(AccountData)
@ghost_load_on
def name(self) -> str:
return self._data[AccountData].name
@CassiopeiaGhost.property(AccountData)
@ghost_load_on
def tagline(self) -> str:
return self._data[AccountData].tagline
@property
def name_with_tagline(self) -> str:
return f"{self.name}#{self.tagline}"
# Special core methods
@property
def summoner(self) -> "Summoner":
from .summoner import Summoner
return Summoner(puuid=self.puuid, region=self.region)
# Add circular references at the bottom
from .summoner import Summoner