Source code for hackthebox.user

from typing import List, Optional, TYPE_CHECKING

from hackthebox.content import Content

from . import htb
from .solve import MachineSolve, ChallengeSolve, EndgameSolve, FortressSolve, Solve


if TYPE_CHECKING:
    from .htb import HTBClient
    from .team import Team


[docs]class User(htb.HTBObject): """The class representing Hack The Box Users Attributes: name: The username of the User avatar: The relative URL of the User's avatar ranking: The User's position on the Hall of Fame points: The User's current total points user_owns: The User's total Machine user owns root_owns: The User's total Machine root owns user_bloods: The User's total Machine user bloods root_bloods: The User's total Machine root bloods rank_name: The name of the User's current rank country_name: The name of the User's country team: The User's Team public: Whether the User's profile is publicly visible timezone: The User's timezone vip: Whether the User is VIP vip_plus: Whether the user is VIP+ respects: The number of respects the User has university: The User's University university_name: The User's university's name description: The User's description github: The User's Github profile linkedin: The User's LinkedIn profile twitter: The User's Twitter account website: The User's website respected: Whether the active User respects the User followed: Whether the active User follows the User rank_id: The ID of the User's rank rank_progress: The User's progress to the next rank next_rank: The next rank the User will reach next_rank_points: The points required to reach the next rank rank_requirement: The ownership required for the current Rank """ name: str avatar: str ranking: int points: int root_owns: int user_owns: int root_bloods: int user_bloods: int rank_name: str _detailed_attributes = ( "timezone", "vip", "vip_plus", "respects", "university", "university_name", "description", "github", "linkedin", "twitter", "website", "respected", "followed", "rank_id", "rank_progress", "next_rank", "next_rank_points", "rank_ownership", "rank_requirement", "country_name", "team", "public", ) timezone: str vip: bool vip_plus: bool respects: int # TODO: University object university = None university_name: str description: str github: str linkedin: str twitter: str website: str respected: bool followed: bool rank_id: int rank_progress: int next_rank: str next_rank_points: int rank_ownership: float rank_requirement: int country_name: str # noinspection PyUnresolvedReferences team: "Team" public: bool _activity: Optional[List[Solve]] = None @property def activity(self): if not self._activity: self._activity = [] solve_list = (self._client.do_request(f"user/profile/activity/{self.id}"))[ "profile" ]["activity"] for solve_item in solve_list: solve_type = solve_item["object_type"] if solve_type == "machine": self._activity.append(MachineSolve(solve_item, self._client)) elif solve_type == "challenge": self._activity.append(ChallengeSolve(solve_item, self._client)) elif solve_type == "endgame": self._activity.append(EndgameSolve(solve_item, self._client)) elif solve_type == "fortress": self._activity.append(FortressSolve(solve_item, self._client)) return self._activity def __repr__(self): return f"<User '{self.name}'>" # noinspection PyUnresolvedReferences def __init__(self, data: dict, client: "HTBClient", summary: bool = False): """Initialise a `User` using API data""" self._client = client self._detailed_func = client.get_user # type: ignore self.id = data["id"] self.name = data["name"] self.user_owns = data["user_owns"] self.points = data["points"] self.avatar = data["avatar"] if summary: self._is_summary = True self.ranking = data["rank"] self.root_owns = data["root_owns"] self.user_bloods = data.get("user_bloods_count") or 0 self.root_bloods = data.get("root_bloods_count") or 0 self.rank_name = data.get("rank_text") or "" else: self.ranking = data["ranking"] self.root_owns = data["system_owns"] self.user_bloods = data["user_bloods"] self.root_bloods = data["system_bloods"] self.rank_name = data["rank"] self.respects = data["respects"] self.university = data["university"] self.university_name = data["university_name"] self.description = data["description"] self.github = data["github"] self.linkedin = data["linkedin"] self.twitter = data["twitter"] self.website = data["website"] self.respected = data.get("isRespected", False) self.followed = data.get("isFollowed", False) self.rank_progress = data["current_rank_progress"] self.next_rank = data["next_rank"] self.next_rank_points = data["next_rank_points"] self.rank_ownership = float(data["rank_ownership"]) self.rank_requirement = data["rank_requirement"] self.country_name = data["country_name"] self.team = data["team"] self.public = bool(data["public"]) # noinspection PyUnresolvedReferences def get_content(self): return Content(self.id, self._client) # noinspection PyUnresolvedReferences def get_machines(self): return self.get_content().machines # noinspection PyUnresolvedReferences def get_challenges(self): return self.get_content().challenges