Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,5 @@ dmypy.json
# PyCharm
.idea/

upload.sh
upload.sh
test.py
12 changes: 9 additions & 3 deletions tryhackme/path.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .task import PathTask

from . import utils

class Path:
def __init__(self, state, data):
Expand All @@ -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")
Expand All @@ -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
Expand Down
23 changes: 17 additions & 6 deletions tryhackme/question.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from . import utils

# TODO: de HTML all the things
class Question:
Expand All @@ -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)
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)
2 changes: 1 addition & 1 deletion tryhackme/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 8 additions & 3 deletions tryhackme/task.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -9,15 +10,19 @@ 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')
self.deadline = data.get('taskDeadline')
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__()
Expand Down
15 changes: 11 additions & 4 deletions tryhackme/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import json


import re
import html

def to_json(obj):
return json.dumps(obj, separators=(',', ':'), ensure_ascii=True)
Expand All @@ -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