diff --git a/.gitignore b/.gitignore index 9b4170a..d701a09 100644 --- a/.gitignore +++ b/.gitignore @@ -128,4 +128,5 @@ dmypy.json # PyCharm .idea/ -upload.sh \ No newline at end of file +upload.sh +test.py \ No newline at end of file diff --git a/tryhackme/path.py b/tryhackme/path.py index cbd827b..0f96cae 100644 --- a/tryhackme/path.py +++ b/tryhackme/path.py @@ -1,5 +1,5 @@ from .task import PathTask - +from . import utils class Path: def __init__(self, state, data): @@ -14,9 +14,9 @@ def __init__(self, state, data): def _from_data(self, data): self.code = data.get("code") - self.description = data.get("description") + self.raw_description = data.get("description") self.color = data.get("color") - self.intro = data.get("intro") + self.raw_intro = data.get("intro") self.type = data.get("contentType") self.public = data.get("public", False) self.room_count = data.get("roomNo") @@ -34,6 +34,12 @@ def _sync(self, data): self.user = self._state.store_user(data.get('username')) @property + def description(self): + return utils.HTML_parse(self.raw_description) + @property + def intro(self): + return utils.HTML_parse(self.raw_intro) + @property def tasks(self): return [PathTask(state=self._state, data=task) for task in self._tasks] @property diff --git a/tryhackme/question.py b/tryhackme/question.py index 8415a02..5882b0a 100644 --- a/tryhackme/question.py +++ b/tryhackme/question.py @@ -1,3 +1,4 @@ +from . import utils # TODO: de HTML all the things class Question: @@ -6,12 +7,22 @@ def __init__(self, state, data): self._from_data(data) def _from_data(self, data): - self.question = data.get("question") + self.raw_question = data.get("question") self.number = data.get("questionNo") - self.hint = data.get("hint") - self.description = data.get("answerDesc", None) + self.raw_hint = data.get("hint") + self.raw_description = data.get("answerDesc", "") self.extra_points = data.get("extraPoints", None) self.correct = data.get("correct", False) - self.attempts = data.get("attempts", None) - self.submission = data.get("submission", None) - self.has_answer = data.get("noAnswer", False) \ No newline at end of file + self.attempts = data.get("attempts", 0) + self.submission = data.get("submission", "") + self.has_answer = data.get("noAnswer", False) + + @property + def question(self): + return utils.HTML_parse(self.raw_question) + @property + def description(self): + return utils.HTML_parse(self.raw_description) + @property + def hint(self): + return utils.HTML_parse(self.raw_hint) \ No newline at end of file diff --git a/tryhackme/room.py b/tryhackme/room.py index ce8e941..c3ba880 100644 --- a/tryhackme/room.py +++ b/tryhackme/room.py @@ -59,7 +59,7 @@ def scoreboard(self): def tasks(self): # TODO: add sessionless http client for no session task gathering if self.freeToUse or self._state.subscribed: - return [RoomTask(state=self._state, data=task) for task in self._state.http.get_room_tasks(room_code=self.name)] + return [RoomTask(state=self._state, data=task) for task in self._state.http.get_room_tasks(room_code=self.name).get('data')] else: return [RoomTask(state=self._state, data=task) for task in self._state.http.get_room_tasks(room_code=self.name, settings={"static": True})] @property diff --git a/tryhackme/task.py b/tryhackme/task.py index 5790498..40e4239 100644 --- a/tryhackme/task.py +++ b/tryhackme/task.py @@ -1,6 +1,7 @@ from .question import Question +from . import utils + -# TODO: html elements removing class RoomTask: def __init__(self, state, data): self._state = state @@ -9,8 +10,8 @@ def __init__(self, state, data): self._from_data(data) def _from_data(self, data): - self.title = data.get('taskTitle') - self.description = data.get('taskDesc') + self.raw_title = data.get('taskTitle') + self.raw_description = data.get('taskDesc') self.type = data.get('taskType') self.number = data.get('taskNo') self.created = data.get('taskCreated') @@ -18,6 +19,10 @@ def _from_data(self, data): self.uploadId = data.get('uploadId') self._questions = data.get('tasksInfo', []) if self._state.authenticated else data.get('questions', []) + @property + def title(self): + return utils.HTML_parse(self.raw_title, "*") + @property def question_count(self): return self._questions.__len__() diff --git a/tryhackme/utils.py b/tryhackme/utils.py index 192e5a6..f98ecbe 100644 --- a/tryhackme/utils.py +++ b/tryhackme/utils.py @@ -1,6 +1,6 @@ import json - - +import re +import html def to_json(obj): return json.dumps(obj, separators=(',', ':'), ensure_ascii=True) @@ -12,7 +12,14 @@ def response_to_json_or_text(response): if response.headers['content-type'].startswith('application/json'): return json.loads(text) except KeyError: - # Thanks Cloudflare + # $ Thanks Cloudflare pass - return text + + +_HTML_TAGS_ = re.compile("<[^<]*>") +def HTML_parse(text, replace=""): + text = text.replace("\n", "") + text = html.unescape(text) + text = re.sub(_HTML_TAGS_, replace, text) + return text \ No newline at end of file