def from_tibiadata(cls, content, vocation=None):
        """Builds a highscores object from a TibiaData highscores response.

        Notes
        -----
        Since TibiaData.com's response doesn't contain any indication of the vocation filter applied,
        :py:attr:`vocation` can't be determined from the response, so the attribute must be assigned manually.

        If the attribute is known, it can be passed for it to be assigned in this method.

        Parameters
        ----------
        content: :class:`str`
            The JSON content of the response.
        vocation: :class:`VocationFilter`, optional
            The vocation filter to assign to the results. Note that this won't affect the parsing.

        Returns
        -------
        :class:`Highscores`
            The highscores contained in the page, or None if the content is for the highscores of a nonexistent world.

        Raises
        ------
        InvalidContent
            If content is not a JSON string of the highscores response."""
        json_content = parse_json(content)
        try:
            highscores_json = json_content["highscores"]
            if "error" in highscores_json["data"]:
                return None
            world = highscores_json["world"]
            category = highscores_json["type"]
            highscores = cls(world, category)
            for entry in highscores_json["data"]:
                value_key = "level"
                if highscores.category in [Category.ACHIEVEMENTS, Category.LOYALTY_POINTS, Category.EXPERIENCE]:
                    value_key = "points"
                if highscores.category == Category.EXPERIENCE:
                    highscores.entries.append(ExpHighscoresEntry(entry["name"], entry["rank"], entry["voc"],
                                                                 entry[value_key], entry["level"]))
                elif highscores.category == Category.LOYALTY_POINTS:
                    highscores.entries.append(LoyaltyHighscoresEntry(entry["name"], entry["rank"], entry["voc"],
                                                                     entry[value_key], entry["title"]))
                else:
                    highscores.entries.append(HighscoresEntry(entry["name"], entry["rank"], entry["voc"],
                                                              entry[value_key]))
            highscores.results_count = len(highscores.entries)
        except KeyError:
            raise InvalidContent("content is not a TibiaData highscores response.")
        if isinstance(vocation, VocationFilter):
            highscores.vocation = vocation
        return highscores
def from_tibiadata ( cls , content , vocation = None ) : json_content = parse_json ( content ) try : highscores_json = json_content [ "highscores" ] if "error" in highscores_json [ "data" ] : return None world = highscores_json [ "world" ] category = highscores_json [ "type" ] highscores = cls ( world , category ) for entry in highscores_json [ "data" ] : value_key = "level" if highscores . category in [ Category . ACHIEVEMENTS , Category . LOYALTY_POINTS , Category . EXPERIENCE ] : value_key = "points" if highscores . category == Category . EXPERIENCE : highscores . entries . append ( ExpHighscoresEntry ( entry [ "name" ] , entry [ "rank" ] , entry [ "voc" ] , entry [ value_key ] , entry [ "level" ] ) ) elif highscores . category == Category . LOYALTY_POINTS : highscores . entries . append ( LoyaltyHighscoresEntry ( entry [ "name" ] , entry [ "rank" ] , entry [ "voc" ] , entry [ value_key ] , entry [ "title" ] ) ) else : highscores . entries . append ( HighscoresEntry ( entry [ "name" ] , entry [ "rank" ] , entry [ "voc" ] , entry [ value_key ] ) ) highscores . results_count = len ( highscores . entries ) except KeyError : raise InvalidContent ( "content is not a TibiaData highscores response." ) if isinstance ( vocation , VocationFilter ) : highscores . vocation = vocation return highscores
Builds a highscores object from a TibiaData highscores response.

        Notes
        -----
        Since TibiaData.com's response doesn't contain any indication of the vocation filter applied,
        :py:attr:`vocation` can't be determined from the response, so the attribute must be assigned manually.

        If the attribute is known, it can be passed for it to be assigned in this method.

        Parameters
        ----------
        content: :class:`str`
            The JSON content of the response.
        vocation: :class:`VocationFilter`, optional
            The vocation filter to assign to the results. Note that this won't affect the parsing.

        Returns
        -------
        :class:`Highscores`
            The highscores contained in the page, or None if the content is for the highscores of a nonexistent world.

        Raises
        ------
        InvalidContent
            If content is not a JSON string of the highscores response.