from typing import List, cast, Optional
from . import htb
from .user import User
from .errors import IncorrectFlagException
[docs]class Endgame(htb.HTBObject):
"""The class representing Hack The Box endgames
Attributes:
name: The name of the Endgame
avatar: The relative URL of the Endgame's avatar
cover_image: The relative URL of the Endgame's cover image
retired: Whether the Endgame is retired
vip: Whether the Endgame requires VIP
points: The points awarded by the Endgame
completions: The number of players who have completed the Endgame
reset_votes: The number of votes to reset the Endgame
entry_points: IP addresses the Endgame can be contacted on
description: The HTML description of the Endgame
"""
name: str
avatar: str
cover_image: str
retired: bool
vip: bool
_detailed_attributes = (
"points",
"completions",
"reset_votes",
"entry_points",
"description",
)
points: int
completions: int
reset_votes: int
entry_points: List[str]
description: str
_authors: Optional[List[User]] = None
_author_ids: Optional[List[int]] = None
[docs] def submit(self, flag: str):
"""Submits a flag for an Endgame
Args:
flag: The flag for the Endgame
"""
submission = cast(
dict,
self._client.do_request(
f"endgame/{self.id}/flag",
json_data={
"flag": flag,
},
),
)
if submission["message"] == "Wrong flag":
raise IncorrectFlagException
return True
@property
def authors(self):
"""
The creators of the Endgame
Returns: A list of Users
"""
if self._authors is None:
self._authors = []
for user_id in self._author_ids:
self._authors.append(self._client.get_user(user_id))
return self._authors
def __repr__(self):
return f"<Endgame '{self.name}'>"
def __init__(self, data: dict, client: htb.HTBClient, summary=False):
self._client = client
self._detailed_func = client.get_endgame # type: ignore
self.id = data["id"]
self.name = data["name"]
self.avatar = data["avatar_url"]
self.cover_image = data["cover_image_url"]
self.retired = data["retired"]
self._author_ids = []
self.vip = data["vip"]
for user in data["creators"]:
self._author_ids.append(user["id"])
if not summary:
self.points = int(data["points"])
self.entry_points = data["entry_points"]
self.completions = data["players_completed"]
self.reset_votes = data["endgame_reset_votes"]
self.description = data["description"]
else:
self._is_summary = True