Source code for novauniverse.interfaces.tournaments

from __future__ import annotations

from abc import abstractmethod
from typing import List, Dict

from .. import SearchInterface

from novauniverse import objects
from novauniverse.utils.search import SearchBy, Search
from novauniverse.objects.order_by import OrderByNotSupported

[docs] class TournamentInterface(SearchInterface): """ Tournaments at novauniverse are very similar so I made a whole separate interface class for it inheriting from the search interface. Use this for all tournaments, components in this class can be overridden and added to if needed. """ def __init__( self, supports = [SearchBy.ID, SearchBy.NAME], keys = { SearchBy.ID: "id", SearchBy.NAME: "display_name" } ) -> None: super().__init__(supports, keys)
[docs] def search(self, query: Search | int | str) -> objects.NovaBasicTournament | None: """Search for a tournament! Returns None if not found.""" return super().search(query, self.get_all())
[docs] @abstractmethod def get_all(self) -> List[objects.NovaBasicTournament]: """Returns all tournaments from the api in a list. Returns empty list if none.""" ...
[docs] @abstractmethod def get_latest(self) -> objects.NovaBasicTournament | None: """Returns the latest tournaments from the api. Returns None if there are no tournaments.""" ...
[docs] def get_top_players(self, order_by: objects.OrderBy = 0, max_players: int = 15) -> List[objects.TournamentPlayer]: """ Returns the top ranked players in this tournament based on your parameters. This method returns a list of :py:meth:`~novauniverse.objects.tournaments.tournament_player.TournamentPlayer` but with all scores and kills from previous tournaments combined. """ players: Dict[str, objects.TournamentPlayer] = {} if isinstance(order_by, objects.OrderBy): order_by = order_by.value if order_by in [0, 1]: for player in [player for mcf in self.get_all() for player in mcf.players]: if player.uuid in players: players[player.uuid].score += player.score players[player.uuid].kills += player.kills else: player.team_number = None; player.uid = None # We null these properties as they are irrelevant and are different in every tournament. players[player.uuid] = player key = (lambda: (lambda x: x[1].score) if order_by == 0 else (lambda x: x[1].kills))() return [item[1] for item in sorted(players.items(), key=key, reverse=True)[:max_players]] raise OrderByNotSupported(order_by)