Source code for rankade.models.Player
# rankade.models.Player.py
from dataclasses import dataclass, field
from typing import ClassVar, Dict, List, Optional, Type
from ..Consts import GHOST_PREFIX
from .Base import Page, RankadeObject
[docs]
@dataclass(kw_only=True, slots=True)
class Player(RankadeObject):
"""Represents a single player returned by the Rankade API."""
id: str
"""Player id"""
ghost: bool
"""True if player is a ghost"""
displayName: str
"""Player display name"""
icon: str
"""Player Icon URL"""
username: Optional[str] = None
"""Player username, will be None if player is a ghost"""
[docs]
def __post_init__(self):
if isinstance(self.ghost, int): # pyright: ignore[reportUnnecessaryIsInstance]
self.ghost = bool(self.ghost)
@property
def is_ghost(self):
"""Convenience method returns self.ghost"""
return self.ghost
[docs]
@dataclass(kw_only=True, slots=True)
class Players(Page[Player]):
"""
Represents a list of player objects returned by the Rankade server.
Individual player objects returned by the server can be accessed in the same way as a regular list.
"""
totalPlayers: int = field(default=0)
"""Total matches on all pages."""
_content_class: ClassVar[Type[RankadeObject]] = Player
"""Classvar to allow the an object in the list to be created from a dict returned from the server."""
@property
def ids(self) -> List[str]:
"""Player & ghost ids"""
return [player.id for player in self.data]
@property
def ghosts(self) -> List[Player]:
"""All ghost players."""
return [player for player in self.data if player.is_ghost]
@property
def display_names(self) -> List[str]:
"""
Display names for players & ghosts.
Ghost display names have a '*' prefix.
"""
return [player.displayName for player in self.data]
@property
def display_names_clean(self) -> List[str]:
"""
Display names for players & ghosts.
Ghost display names will be returned without '*' prefix.
"""
return [player.displayName.replace(GHOST_PREFIX, "") for player in self.data]
@property
def usernames(self) -> List[str | None]:
"""Usernames for all players, ghosts not included."""
x = [player.username for player in self.data if player.username != ""]
return x
@property
def icons(self) -> Dict[str, str]:
"""All icon URIs for players & ghosts (if set.)"""
ids = [player.id for player in self.data if player.icon != ""]
icons = [player.icon for player in self.data if player.icon != ""]
return dict(zip(ids, icons, strict=False))