Source code for chicken_dinner.models.leaderboard

"""Leaderboard model."""
from tabulate import tabulate

from chicken_dinner.models.player import Player
from chicken_dinner.util import camel_to_snake


[docs]class Leaderboard(object): """Leaderboard model. An object for a leaderboard and its top players. :param pubg: an instance of the class :class:`chicken_dinner.pubgapi.PUBG` :param str game_mode: the game mode for the leaderboard :param str shard: the shard for the seasons response """ def __init__(self, pubg, game_mode, shard=None): self._shard = shard self._game_mode = game_mode self._pubg = pubg self.response = self._pubg._core.leaderboard(game_mode) self._rank_to_index = {p["attributes"]["rank"]: idx for idx, p in enumerate(self.response["included"])} @property def shard(self): """The shard for this leaderboard.""" return self._shard or self._pubg.shard @property def game_mode(self): """The game mode for this leaderboard""" return self._game_mode @property def ids(self): """The player ids from this leaderboard in rank order.""" return [p["id"] for p in self.response["data"]["relationships"]["players"]["data"]] @property def url(self): """A URL for this leaderboard resource.""" return self.response["links"]["self"] @property def names(self): """The player names from this leaderboard in rank order.""" return [ self.response["included"][self._rank_to_index[rank]]["attributes"]["name"] for rank in range(1, len(self.response["included"]) + 1) ]
[docs] def ids_to_names(self): """A map of player ids to names.""" return {p["id"]: p["attributes"]["name"] for p in self.response["included"]}
[docs] def names_to_ids(self): """A map of player names to ids""" return {p["attributes"]["name"]: p["id"] for p in self.response["included"]}
[docs] def name(self, rank): """The name of the player at the given rank.""" return self.response["included"][self._rank_to_index[rank]]["attributes"]["name"]
[docs] def id(self, rank): """The player_id of the player at the given rank.""" return self.response["data"]["relationships"]["players"]["data"][rank - 1]["id"]
[docs] def stats(self, rank): """The player stats for the player at the given rank.""" return { camel_to_snake(k): v for k, v in self.response["included"][self._rank_to_index[rank]]["attributes"]["stats"].items() }
[docs] def data(self, rank): """The player raw data blob from the response for the player at the given rank.""" return self.response["included"][rank - 1]
[docs] def to_table(self, exclude_fields=None): """Create a string representing the leaderboard and stats. fields are: "rank", "id", "name", "rank_points", "wins", "games", "win_ratio", "average_damage", "kills", "kill_death_ratio", "average_rank" :param list(str) exclude_fields: a list of fields to include """ if exclude_fields is None: exclude_fields = [] data = [] for player in self.response["included"]: player_data = { "rank": player["attributes"]["rank"], "id": player["id"], "name": player["attributes"]["name"], } for k, v in player["attributes"]["stats"].items(): player_data[camel_to_snake(k)] = v data.append(player_data) data = sorted(data, key=lambda x: x["rank"]) for f in exclude_fields: for d in data: d.pop(f, None) return tabulate(data, headers="keys")
[docs] def get_player(self, rank): """Get a player object for the player at the given rank.""" return Player(self._pubg, self.id(rank), shard=self._shard)