🚨 Fixed DeepSource issues
This commit is contained in:
+1
-2
@@ -71,6 +71,7 @@ class Settings(BaseSettings):
|
|||||||
|
|
||||||
|
|
||||||
async def initialize_arq():
|
async def initialize_arq():
|
||||||
|
# skipcq: PYL-W0603
|
||||||
global arq
|
global arq
|
||||||
arq = await create_pool(RedisSettings.from_dsn(settings.redis))
|
arq = await create_pool(RedisSettings.from_dsn(settings.redis))
|
||||||
|
|
||||||
@@ -80,8 +81,6 @@ def settings() -> Settings:
|
|||||||
return Settings()
|
return Settings()
|
||||||
|
|
||||||
|
|
||||||
# asyncio.run(initialize_arq())
|
|
||||||
|
|
||||||
pool = redis_lib.ConnectionPool().from_url(settings().redis)
|
pool = redis_lib.ConnectionPool().from_url(settings().redis)
|
||||||
|
|
||||||
redis: redis_base_lib.client.Redis = redis_lib.Redis(connection_pool=pool)
|
redis: redis_base_lib.client.Redis = redis_lib.Redis(connection_pool=pool)
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ class GameInLobby(BaseModel):
|
|||||||
game_id: uuid.UUID
|
game_id: uuid.UUID
|
||||||
|
|
||||||
|
|
||||||
#
|
# skipcq: PY-W0069
|
||||||
# class UserProfileLinks(ormar.Model):
|
# class UserProfileLinks(ormar.Model):
|
||||||
# id: int = ormar.Integer(primary_key=True, autoincrement=True)
|
# id: int = ormar.Integer(primary_key=True, autoincrement=True)
|
||||||
# user: Optional[User] = ormar.ForeignKey(User)
|
# user: Optional[User] = ormar.ForeignKey(User)
|
||||||
|
|||||||
@@ -41,10 +41,3 @@ class QuizTivityPage(BaseModel):
|
|||||||
title: str | None
|
title: str | None
|
||||||
type: QuizTivityTypes
|
type: QuizTivityTypes
|
||||||
data: Pdf | Memory | Markdown
|
data: Pdf | Memory | Markdown
|
||||||
|
|
||||||
# @validator("type")
|
|
||||||
# def match_type_to_data_type(cls, v, values, **kwargs):
|
|
||||||
# print(values)
|
|
||||||
# if TYPE_CLASS_LIST[v] != type(values["data"]):
|
|
||||||
# raise ValueError("Specified Type doesn't match real data type")
|
|
||||||
# pass
|
|
||||||
|
|||||||
@@ -88,8 +88,9 @@ async def auth(request: Request, response: Response):
|
|||||||
google_uid=user_data.sub.hex,
|
google_uid=user_data.sub.hex,
|
||||||
avatar=gzipped_user_avatar(),
|
avatar=gzipped_user_avatar(),
|
||||||
)
|
)
|
||||||
|
# skipcq: PYL-W0703
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if type(e) == asyncpg.exceptions.UniqueViolationError:
|
if type(e) is asyncpg.exceptions.UniqueViolationError:
|
||||||
error = True
|
error = True
|
||||||
counter = 1
|
counter = 1
|
||||||
while error:
|
while error:
|
||||||
|
|||||||
@@ -116,8 +116,9 @@ async def auth(request: Request, response: Response):
|
|||||||
auth_type=UserAuthTypes.GITHUB,
|
auth_type=UserAuthTypes.GITHUB,
|
||||||
avatar=gzipped_user_avatar(),
|
avatar=gzipped_user_avatar(),
|
||||||
)
|
)
|
||||||
|
# skipcq: PYL-W0703
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if type(e) == asyncpg.exceptions.UniqueViolationError:
|
if type(e) is asyncpg.exceptions.UniqueViolationError:
|
||||||
error = True
|
error = True
|
||||||
counter = 1
|
counter = 1
|
||||||
while error:
|
while error:
|
||||||
|
|||||||
@@ -90,8 +90,9 @@ async def auth(request: Request, response: Response):
|
|||||||
google_uid=user_data.sub,
|
google_uid=user_data.sub,
|
||||||
avatar=gzipped_user_avatar(),
|
avatar=gzipped_user_avatar(),
|
||||||
)
|
)
|
||||||
|
# skipcq: PYL-W0703
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if type(e) == asyncpg.exceptions.UniqueViolationError:
|
if type(e) is asyncpg.exceptions.UniqueViolationError:
|
||||||
error = True
|
error = True
|
||||||
counter = 1
|
counter = 1
|
||||||
while error:
|
while error:
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ async def get_customized_avatar(
|
|||||||
clothe_color=clothe_color,
|
clothe_color=clothe_color,
|
||||||
clothe_graphic_type=clothe_graphic_type,
|
clothe_graphic_type=clothe_graphic_type,
|
||||||
).render_svg()
|
).render_svg()
|
||||||
|
# skipcq: PY-W0069
|
||||||
# print(f"skin_color: {len(AvatarItemsAsList.skin_color)},")
|
# print(f"skin_color: {len(AvatarItemsAsList.skin_color)},")
|
||||||
# print(f"hair_color: {len(AvatarItemsAsList.hair_color)},")
|
# print(f"hair_color: {len(AvatarItemsAsList.hair_color)},")
|
||||||
# print(f"facial_hair_type: {len(AvatarItemsAsList.facial_hair_type)},")
|
# print(f"facial_hair_type: {len(AvatarItemsAsList.facial_hair_type)},")
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ button_to_index_map = {"b": 0, "g": 1, "y": 2, "r": 3}
|
|||||||
@router.websocket("/socket/{id}")
|
@router.websocket("/socket/{id}")
|
||||||
async def websocket_endpoint(ws: WebSocket, game_id: str, id: str):
|
async def websocket_endpoint(ws: WebSocket, game_id: str, id: str):
|
||||||
try:
|
try:
|
||||||
if id in wss_clients.keys():
|
if id in wss_clients:
|
||||||
await ws.close(code=status.WS_1001_GOING_AWAY)
|
await ws.close(code=status.WS_1001_GOING_AWAY)
|
||||||
print("Client {} already exists.".format(id))
|
print("Client {} already exists.".format(id))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ def generate_code() -> str:
|
|||||||
"r",
|
"r",
|
||||||
] # Capital stands for long press, lowercase letter for short press
|
] # Capital stands for long press, lowercase letter for short press
|
||||||
resulting_code = ""
|
resulting_code = ""
|
||||||
for i in range(specified_length):
|
for _ in range(specified_length):
|
||||||
resulting_code += random.choice(buttons)
|
resulting_code += random.choice(buttons)
|
||||||
return resulting_code
|
return resulting_code
|
||||||
|
|
||||||
|
|||||||
@@ -106,9 +106,6 @@ async def finish_edit(edit_id: str, quiz_input: QuizInput):
|
|||||||
if quiz_input.cover_image == "":
|
if quiz_input.cover_image == "":
|
||||||
quiz_input.cover_image = None
|
quiz_input.cover_image = None
|
||||||
|
|
||||||
# if quiz_input.background_image is None and old_quiz_data.background_image is not None:
|
|
||||||
# mark_image_for_deletion(quiz_input.background_image)
|
|
||||||
|
|
||||||
if quiz_input.cover_image is not None and not check_image_string(quiz_input.cover_image)[0]:
|
if quiz_input.cover_image is not None and not check_image_string(quiz_input.cover_image)[0]:
|
||||||
raise HTTPException(status_code=400, detail="image url is not valid")
|
raise HTTPException(status_code=400, detail="image url is not valid")
|
||||||
|
|
||||||
|
|||||||
@@ -46,9 +46,8 @@ async def export_quiz(quiz_id: uuid.UUID, user: User = Depends(get_current_user)
|
|||||||
quiz_dict["updated_at"] = quiz_dict["updated_at"].isoformat()
|
quiz_dict["updated_at"] = quiz_dict["updated_at"].isoformat()
|
||||||
quiz_json = json.dumps(quiz_dict)
|
quiz_json = json.dumps(quiz_dict)
|
||||||
bin_data = gzip.compress(quiz_json.encode("utf-8"), compresslevel=9)
|
bin_data = gzip.compress(quiz_json.encode("utf-8"), compresslevel=9)
|
||||||
# bin_data = quiz_json.encode("utf-8")
|
|
||||||
bin_data = bin_data + quiz_delimiter
|
bin_data = bin_data + quiz_delimiter
|
||||||
for image_key in image_urls.keys():
|
for image_key in image_urls:
|
||||||
bin_data = bin_data + image_delimiter + str(image_key).encode("utf-8") + image_index_delimiter
|
bin_data = bin_data + image_delimiter + str(image_key).encode("utf-8") + image_index_delimiter
|
||||||
image_data = None
|
image_data = None
|
||||||
async with ClientSession() as session, session.get(
|
async with ClientSession() as session, session.get(
|
||||||
|
|||||||
@@ -134,8 +134,6 @@ async def get_live_game_data(
|
|||||||
|
|
||||||
@router.get("/user_count")
|
@router.get("/user_count")
|
||||||
async def get_game_user_count(game_pin: str, api_key: str, as_string: bool = False, as_array: bool = False):
|
async def get_game_user_count(game_pin: str, api_key: str, as_string: bool = False, as_array: bool = False):
|
||||||
# if redis_res is None:
|
|
||||||
# raise HTTPException(status_code=404, detail="Game not found")
|
|
||||||
user_id = await check_api_key(api_key)
|
user_id = await check_api_key(api_key)
|
||||||
redis_res = await redis.get(f"game_session:{game_pin}")
|
redis_res = await redis.get(f"game_session:{game_pin}")
|
||||||
if redis_res is None:
|
if redis_res is None:
|
||||||
@@ -149,12 +147,6 @@ async def get_game_user_count(game_pin: str, api_key: str, as_string: bool = Fal
|
|||||||
return {"players": {"count": player_count}}
|
return {"players": {"count": player_count}}
|
||||||
|
|
||||||
|
|
||||||
# class _LivePlayersReturn(BaseModel):
|
|
||||||
# # players: list[GamePlayer | None]
|
|
||||||
# answers: list[GameAnswer1 | None]
|
|
||||||
# players: list[GamePlayer | None]
|
|
||||||
|
|
||||||
|
|
||||||
@router.get(
|
@router.get(
|
||||||
"/players",
|
"/players",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ class StepInput(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/step/{step_id}")
|
@router.post("/step/{step_id}")
|
||||||
async def step_1(session_id: str, data: StepInput, request: Request, response: Response, step_id: int):
|
async def step_1_endpoint(session_id: str, data: StepInput, request: Request, response: Response, step_id: int):
|
||||||
if step_id < 0 or step_id > 2:
|
if step_id < 0 or step_id > 2:
|
||||||
raise HTTPException(status_code=401)
|
raise HTTPException(status_code=401)
|
||||||
redis_res = await redis.get(f"login_session:{session_id}")
|
redis_res = await redis.get(f"login_session:{session_id}")
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ def generate_code() -> str:
|
|||||||
"r",
|
"r",
|
||||||
] # Capital stands for long press, lowercase letter for short press
|
] # Capital stands for long press, lowercase letter for short press
|
||||||
resulting_code = ""
|
resulting_code = ""
|
||||||
for i in range(specified_length):
|
for _ in range(specified_length):
|
||||||
resulting_code += random.choice(buttons)
|
resulting_code += random.choice(buttons)
|
||||||
return resulting_code
|
return resulting_code
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ async def set_note(id: UUID, data: _SetNoteInput, user: User = Depends(get_curre
|
|||||||
return await res.update()
|
return await res.update()
|
||||||
|
|
||||||
|
|
||||||
|
# skipcq: PYL-W0105
|
||||||
"""
|
"""
|
||||||
@router.get("/export/{result_id}", response_class=StreamingResponse)
|
@router.get("/export/{result_id}", response_class=StreamingResponse)
|
||||||
async def export_result(result_id: UUID, user: User = Depends(get_current_user)):
|
async def export_result(result_id: UUID, user: User = Depends(get_current_user)):
|
||||||
|
|||||||
@@ -221,7 +221,6 @@ async def list_images(
|
|||||||
raise HTTPException(status_code=404, detail="No items found")
|
raise HTTPException(status_code=404, detail="No items found")
|
||||||
return_items: list[PrivateStorageItem] = []
|
return_items: list[PrivateStorageItem] = []
|
||||||
for item in storage_items:
|
for item in storage_items:
|
||||||
# print(item.quizzes)
|
|
||||||
return_items.append(PrivateStorageItem.from_db_model(item))
|
return_items.append(PrivateStorageItem.from_db_model(item))
|
||||||
return return_items
|
return return_items
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,6 @@ async def create_user(user: RouteUser, background_task: BackgroundTasks) -> User
|
|||||||
if len(user.username) == 32:
|
if len(user.username) == 32:
|
||||||
return JSONResponse({"details": "Username mustn't be 32 characters long"}, 400)
|
return JSONResponse({"details": "Username mustn't be 32 characters long"}, 400)
|
||||||
await user.save()
|
await user.save()
|
||||||
# print(settings.skip_email_verification)
|
|
||||||
if settings.skip_email_verification:
|
if settings.skip_email_verification:
|
||||||
user.verify_key = None
|
user.verify_key = None
|
||||||
user.verified = True
|
user.verified = True
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ class ReturnQuestion(QuizQuestion):
|
|||||||
if values["type"] == QuizQuestionType.RANGE and type(v) != RangeQuizAnswerWithoutSolution:
|
if values["type"] == QuizQuestionType.RANGE and type(v) != RangeQuizAnswerWithoutSolution:
|
||||||
raise ValueError("Answer must be from type RangeQuizAnswer if type is RANGE")
|
raise ValueError("Answer must be from type RangeQuizAnswer if type is RANGE")
|
||||||
if values["type"] == QuizQuestionType.VOTING and type(v[0]) != VotingQuizAnswer:
|
if values["type"] == QuizQuestionType.VOTING and type(v[0]) != VotingQuizAnswer:
|
||||||
# print("Answer must be from type VotingQuizAnswer if type is VOTING")
|
# skipcq: PTC-W0047
|
||||||
pass
|
pass
|
||||||
return v
|
return v
|
||||||
|
|
||||||
@@ -262,7 +262,6 @@ class ReturnQuestion(QuizQuestion):
|
|||||||
async def set_question_number(sid, data: str):
|
async def set_question_number(sid, data: str):
|
||||||
# data is just a number (as a str) of the question
|
# data is just a number (as a str) of the question
|
||||||
session = await sio.get_session(sid)
|
session = await sio.get_session(sid)
|
||||||
# print("set_question_number", data, session)
|
|
||||||
if session["admin"]:
|
if session["admin"]:
|
||||||
game_pin = session["game_pin"]
|
game_pin = session["game_pin"]
|
||||||
game_data = PlayGame.parse_raw(await redis.get(f"game:{session['game_pin']}"))
|
game_data = PlayGame.parse_raw(await redis.get(f"game:{session['game_pin']}"))
|
||||||
@@ -286,7 +285,6 @@ async def set_question_number(sid, data: str):
|
|||||||
temp_return["type"] = game_data.questions[int(float(data))].type
|
temp_return["type"] = game_data.questions[int(float(data))].type
|
||||||
if temp_return["type"] == QuizQuestionType.ORDER:
|
if temp_return["type"] == QuizQuestionType.ORDER:
|
||||||
random.shuffle(temp_return["answers"])
|
random.shuffle(temp_return["answers"])
|
||||||
# print("emitting")
|
|
||||||
await sio.emit(
|
await sio.emit(
|
||||||
"set_question_number",
|
"set_question_number",
|
||||||
{
|
{
|
||||||
@@ -375,8 +373,6 @@ async def submit_answer(sid: str, data: dict):
|
|||||||
answers = await redis.get(f"game_session:{session['game_pin']}:{data.question_index}")
|
answers = await redis.get(f"game_session:{session['game_pin']}:{data.question_index}")
|
||||||
diff = (time_q_started - now).total_seconds() * 1000 # - timedelta(milliseconds=latency)
|
diff = (time_q_started - now).total_seconds() * 1000 # - timedelta(milliseconds=latency)
|
||||||
|
|
||||||
# print(abs(diff) - latency, latency, abs(diff))
|
|
||||||
|
|
||||||
score = 0
|
score = 0
|
||||||
if answer_right:
|
if answer_right:
|
||||||
score = calculate_score(
|
score = calculate_score(
|
||||||
|
|||||||
@@ -27,9 +27,10 @@ class LocalStorage:
|
|||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
yield None
|
yield None
|
||||||
|
|
||||||
async def upload(self, file_name: str, data: BinaryIO, mime_type: str | None = None) -> None:
|
# skipcq: PYL-W0613
|
||||||
|
async def upload(self, file_name: str, file: BinaryIO, mime_type: str | None = None) -> None:
|
||||||
async with aiofiles.open(file=os.path.join(self.base_path, file_name), mode="wb") as f:
|
async with aiofiles.open(file=os.path.join(self.base_path, file_name), mode="wb") as f:
|
||||||
await aioshutil_copyfileobj(data, f)
|
await aioshutil_copyfileobj(file, f)
|
||||||
|
|
||||||
async def delete(self, file_names: [str]) -> None:
|
async def delete(self, file_names: [str]) -> None:
|
||||||
for i in file_names:
|
for i in file_names:
|
||||||
|
|||||||
@@ -103,15 +103,13 @@ class S3Storage:
|
|||||||
+ "Signature="
|
+ "Signature="
|
||||||
+ signature
|
+ signature
|
||||||
)
|
)
|
||||||
# if expiry is not None:
|
|
||||||
# authorization_header += f", Expires={expiry}"
|
|
||||||
|
|
||||||
# Send the request with the authorization header
|
# Send the request with the authorization header
|
||||||
headers = {"x-amz-date": amz_date, "Authorization": authorization_header}
|
headers = {"x-amz-date": amz_date, "Authorization": authorization_header}
|
||||||
request_url = self.base_url + path + "?" + canonical_querystring
|
request_url = self.base_url + path + "?" + canonical_querystring
|
||||||
|
|
||||||
return headers, request_url
|
return headers, request_url
|
||||||
|
|
||||||
|
# skipcq: PYL-W0613
|
||||||
async def upload(self, file: BinaryIO, file_name: str, mime_type: str | None = "application/octet-stream") -> None:
|
async def upload(self, file: BinaryIO, file_name: str, mime_type: str | None = "application/octet-stream") -> None:
|
||||||
headers, url = self._generate_aws_signature_v4(method="PUT", path=f"/{file_name}")
|
headers, url = self._generate_aws_signature_v4(method="PUT", path=f"/{file_name}")
|
||||||
async with ClientSession() as session, session.put(url, headers=headers, data=file) as resp:
|
async with ClientSession() as session, session.put(url, headers=headers, data=file) as resp:
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from classquiz.storage.errors import DeletionFailedError
|
|||||||
from thumbhash import image_to_thumbhash
|
from thumbhash import image_to_thumbhash
|
||||||
|
|
||||||
|
|
||||||
|
# skipcq: PYL-W0613
|
||||||
async def clean_editor_images_up(ctx):
|
async def clean_editor_images_up(ctx):
|
||||||
print("Cleaning images up")
|
print("Cleaning images up")
|
||||||
edit_sessions = await redis.smembers("edit_sessions")
|
edit_sessions = await redis.smembers("edit_sessions")
|
||||||
@@ -52,10 +53,12 @@ async def calculate_hash(ctx, file_id_as_str: str):
|
|||||||
try:
|
try:
|
||||||
if 0 < file_data.size < 20_970_000: # greater than 0 but smaller than 20mbytes
|
if 0 < file_data.size < 20_970_000: # greater than 0 but smaller than 20mbytes
|
||||||
file_data.thumbhash = image_to_thumbhash(file)
|
file_data.thumbhash = image_to_thumbhash(file)
|
||||||
|
# skipcq: PYL-W0703
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
hash_obj = xxhash.xxh3_128()
|
hash_obj = xxhash.xxh3_128()
|
||||||
|
|
||||||
|
# skipcq: PY-W0069
|
||||||
# assert hash_obj.block_size == 64
|
# assert hash_obj.block_size == 64
|
||||||
while chunk := file.read(6400):
|
while chunk := file.read(6400):
|
||||||
hash_obj.update(chunk)
|
hash_obj.update(chunk)
|
||||||
@@ -70,6 +73,7 @@ async def calculate_hash(ctx, file_id_as_str: str):
|
|||||||
await user.update()
|
await user.update()
|
||||||
|
|
||||||
|
|
||||||
|
# skipcq: PYL-W0613
|
||||||
async def quiz_update(ctx, old_quiz: Quiz, quiz_id: uuid.UUID):
|
async def quiz_update(ctx, old_quiz: Quiz, quiz_id: uuid.UUID):
|
||||||
new_quiz: Quiz = await Quiz.objects.get(id=quiz_id)
|
new_quiz: Quiz = await Quiz.objects.get(id=quiz_id)
|
||||||
old_images = extract_image_ids_from_quiz(old_quiz)
|
old_images = extract_image_ids_from_quiz(old_quiz)
|
||||||
@@ -83,8 +87,6 @@ async def quiz_update(ctx, old_quiz: Quiz, quiz_id: uuid.UUID):
|
|||||||
removed_images = list(set(old_images) - set(new_images))
|
removed_images = list(set(old_images) - set(new_images))
|
||||||
added_images = list(set(new_images) - set(old_images))
|
added_images = list(set(new_images) - set(old_images))
|
||||||
change_made = False
|
change_made = False
|
||||||
# print("added:", added_images)
|
|
||||||
# print("removed:", removed_images)
|
|
||||||
for image in removed_images:
|
for image in removed_images:
|
||||||
if "--" in image:
|
if "--" in image:
|
||||||
await storage.delete([image])
|
await storage.delete([image])
|
||||||
@@ -92,7 +94,6 @@ async def quiz_update(ctx, old_quiz: Quiz, quiz_id: uuid.UUID):
|
|||||||
item = await StorageItem.objects.get_or_none(id=uuid.UUID(image))
|
item = await StorageItem.objects.get_or_none(id=uuid.UUID(image))
|
||||||
if item is None:
|
if item is None:
|
||||||
continue
|
continue
|
||||||
# print("removed item")
|
|
||||||
try:
|
try:
|
||||||
await new_quiz.storageitems.remove(item)
|
await new_quiz.storageitems.remove(item)
|
||||||
except ormar.exceptions.NoMatch:
|
except ormar.exceptions.NoMatch:
|
||||||
@@ -103,7 +104,6 @@ async def quiz_update(ctx, old_quiz: Quiz, quiz_id: uuid.UUID):
|
|||||||
item = await StorageItem.objects.get_or_none(id=uuid.UUID(image))
|
item = await StorageItem.objects.get_or_none(id=uuid.UUID(image))
|
||||||
if item is None:
|
if item is None:
|
||||||
continue
|
continue
|
||||||
# print("added item")
|
|
||||||
await new_quiz.storageitems.add(item)
|
await new_quiz.storageitems.add(item)
|
||||||
change_made = True
|
change_made = True
|
||||||
if change_made:
|
if change_made:
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
// Stolen from https://svelte.dev/repl/c6a402704224403f96a3db56c2f48dfc?version=3.55.0
|
// Stolen from https://svelte.dev/repl/c6a402704224403f96a3db56c2f48dfc?version=3.55.0
|
||||||
|
// skipcq: JS-0119
|
||||||
let intersectionObserver;
|
let intersectionObserver;
|
||||||
|
|
||||||
function ensureIntersectionObserver() {
|
function ensureIntersectionObserver() {
|
||||||
|
|||||||
@@ -42,10 +42,12 @@ export const mint = async (
|
|||||||
|
|
||||||
// eslint-disable-next-line no-constant-condition
|
// eslint-disable-next-line no-constant-condition
|
||||||
while (true) {
|
while (true) {
|
||||||
|
// skipcq: JS-0003
|
||||||
const data = new TextEncoder().encode(`${challenge}:${counter.toString(16)}`);
|
const data = new TextEncoder().encode(`${challenge}:${counter.toString(16)}`);
|
||||||
const hashBuffer = await crypto.subtle.digest('SHA-1', data);
|
const hashBuffer = await crypto.subtle.digest('SHA-1', data);
|
||||||
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||||
const digest = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
const digest = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
||||||
|
// skipcq: JS-0050
|
||||||
if (digest.slice(0, hex_digits) == zeros) {
|
if (digest.slice(0, hex_digits) == zeros) {
|
||||||
result = counter.toString(16);
|
result = counter.toString(16);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ export const invertColor = (hexTripletColor: string): string => {
|
|||||||
let color_int = parseInt(color, 16); // convert to integer
|
let color_int = parseInt(color, 16); // convert to integer
|
||||||
color_int = 0xffffff ^ color_int; // invert three bytes
|
color_int = 0xffffff ^ color_int; // invert three bytes
|
||||||
color = color_int.toString(16); // convert to hex
|
color = color_int.toString(16); // convert to hex
|
||||||
color = ('000000' + color).slice(-6); // pad with leading zeros
|
color = `000000${color}`.slice(-6); // pad with leading zeros
|
||||||
color = '#' + color; // prepend #
|
color = `#${color}`; // prepend #
|
||||||
return color;
|
return color;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -20,13 +20,6 @@ export const calculate_score = (q_time: number, time_taken: number): number => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type RGB = [number, number, number];
|
export type RGB = [number, number, number];
|
||||||
export const getContrast = (foregroundColor: RGB, backgroundColor: RGB) => {
|
|
||||||
const foregroundLuminance = getLuminance(foregroundColor);
|
|
||||||
const backgroundLuminance = getLuminance(backgroundColor);
|
|
||||||
return backgroundLuminance < foregroundLuminance
|
|
||||||
? (backgroundLuminance + 0.05) / (foregroundLuminance + 0.05)
|
|
||||||
: (foregroundLuminance + 0.05) / (backgroundLuminance + 0.05);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getLuminance = (rgb: RGB): number => {
|
export const getLuminance = (rgb: RGB): number => {
|
||||||
const [r, g, b] = rgb.map((v) => {
|
const [r, g, b] = rgb.map((v) => {
|
||||||
@@ -36,6 +29,14 @@ export const getLuminance = (rgb: RGB): number => {
|
|||||||
return r * 0.2126 + g * 0.7152 + b * 0.0722;
|
return r * 0.2126 + g * 0.7152 + b * 0.0722;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getContrast = (foregroundColor: RGB, backgroundColor: RGB) => {
|
||||||
|
const foregroundLuminance = getLuminance(foregroundColor);
|
||||||
|
const backgroundLuminance = getLuminance(backgroundColor);
|
||||||
|
return backgroundLuminance < foregroundLuminance
|
||||||
|
? (backgroundLuminance + 0.05) / (foregroundLuminance + 0.05)
|
||||||
|
: (foregroundLuminance + 0.05) / (backgroundLuminance + 0.05);
|
||||||
|
};
|
||||||
|
|
||||||
export const getRgbColorFromHex = (hex: string): RGB => {
|
export const getRgbColorFromHex = (hex: string): RGB => {
|
||||||
hex = hex.slice(1);
|
hex = hex.slice(1);
|
||||||
const value = parseInt(hex, 16);
|
const value = parseInt(hex, 16);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// skipcq: JS-C1003
|
||||||
import * as yup from 'yup';
|
import * as yup from 'yup';
|
||||||
|
|
||||||
export const ABCDQuestionSchema = yup
|
export const ABCDQuestionSchema = yup
|
||||||
@@ -69,23 +70,17 @@ export const dataSchema = yup.object({
|
|||||||
answers: yup.lazy((v) => {
|
answers: yup.lazy((v) => {
|
||||||
if (Array.isArray(v)) {
|
if (Array.isArray(v)) {
|
||||||
if (typeof v[0].right === 'boolean') {
|
if (typeof v[0].right === 'boolean') {
|
||||||
console.log('ABCDQuestionSchema');
|
|
||||||
return ABCDQuestionSchema;
|
return ABCDQuestionSchema;
|
||||||
} else if (typeof v[0].case_sensitive === 'boolean') {
|
} else if (typeof v[0].case_sensitive === 'boolean') {
|
||||||
console.log('TextQuestionSchema');
|
|
||||||
return TextQuestionSchema;
|
return TextQuestionSchema;
|
||||||
} else if (v[0].id !== undefined) {
|
} else if (v[0].id !== undefined) {
|
||||||
console.log('OrderQuestionSchema');
|
|
||||||
return VotingQuestionSchema;
|
return VotingQuestionSchema;
|
||||||
} else if (v[0].answer !== undefined) {
|
} else if (v[0].answer !== undefined) {
|
||||||
console.log('VotingQuestionSchema');
|
|
||||||
return VotingQuestionSchema;
|
return VotingQuestionSchema;
|
||||||
}
|
}
|
||||||
} else if (typeof v === 'string' || v instanceof String) {
|
} else if (typeof v === 'string' || v instanceof String) {
|
||||||
console.log('StringQuestionSchema');
|
|
||||||
return yup.string().required("The slide mustn't be empty").nullable();
|
return yup.string().required("The slide mustn't be empty").nullable();
|
||||||
} else {
|
} else {
|
||||||
console.log('RangeQuestionSchema');
|
|
||||||
return RangeQuestionSchema;
|
return RangeQuestionSchema;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -7,7 +7,5 @@ import type { PageLoad } from './$types';
|
|||||||
|
|
||||||
export const load = (async ({ fetch }) => {
|
export const load = (async ({ fetch }) => {
|
||||||
const res = await fetch('/api/v1/storage/list');
|
const res = await fetch('/api/v1/storage/list');
|
||||||
if (res.ok) {
|
return { files: await res.json() };
|
||||||
return { files: await res.json() };
|
|
||||||
}
|
|
||||||
}) satisfies PageLoad;
|
}) satisfies PageLoad;
|
||||||
|
|||||||
@@ -138,23 +138,26 @@ def downgrade() -> None:
|
|||||||
conn = op.get_bind()
|
conn = op.get_bind()
|
||||||
session = Session(bind=conn)
|
session = Session(bind=conn)
|
||||||
all_cover_images = session.execute("SELECT cover_image, id from quiz where cover_image is not null;")
|
all_cover_images = session.execute("SELECT cover_image, id from quiz where cover_image is not null;")
|
||||||
|
stmt = text("UPDATE quiz SET cover_image = :n WHERE id=:i;")
|
||||||
for cover_image, id in all_cover_images:
|
for cover_image, id in all_cover_images:
|
||||||
new_cover_image = f"{settings.root_address}/api/v1/storage/download/{cover_image}"
|
new_cover_image = f"{settings.root_address}/api/v1/storage/download/{cover_image}"
|
||||||
# print(new_cover_image, id)
|
# print(new_cover_image, id)
|
||||||
session.execute(f"UPDATE quiz SET cover_image = '{new_cover_image}' WHERE id='{id}';")
|
session.execute(stmt, {"n": new_cover_image, "i": id})
|
||||||
|
|
||||||
all_background_images = session.execute("SELECT background_image, id from quiz where background_image is not null;")
|
all_background_images = session.execute("SELECT background_image, id from quiz where background_image is not null;")
|
||||||
|
stmt = text("UPDATE quiz SET cover_image = :n WHERE id=:i;")
|
||||||
for bg_image, id in all_background_images:
|
for bg_image, id in all_background_images:
|
||||||
new_bg_image = f"{settings.root_address}/api/v1/storage/download/{bg_image}"
|
new_bg_image = f"{settings.root_address}/api/v1/storage/download/{bg_image}"
|
||||||
# print(new_cover_image, id)
|
# print(new_cover_image, id)
|
||||||
session.execute(f"UPDATE quiz SET cover_image = '{new_bg_image}' WHERE id='{id}';")
|
session.execute(stmt, {"n": new_bg_image, "i": id})
|
||||||
|
|
||||||
all_questions = session.execute("SELECT questions, id from quiz;")
|
all_questions = session.execute("SELECT questions, id from quiz;")
|
||||||
|
stmt = text("UPDATE quiz SET questions = :r WHERE id=:i;")
|
||||||
question_image_regex = r"(?=.{36}--.{36})"
|
question_image_regex = r"(?=.{36}--.{36})"
|
||||||
for question, id in all_questions:
|
for question, id in all_questions:
|
||||||
question_as_json = json.dumps(question)
|
question_as_json = json.dumps(question)
|
||||||
result = re.sub(question_image_regex, f"{settings.root_address}/api/v1/storage/download/", question_as_json)
|
result = re.sub(question_image_regex, f"{settings.root_address}/api/v1/storage/download/", question_as_json)
|
||||||
session.execute(f"UPDATE quiz SET questions = '{result}' WHERE id='{id}';")
|
session.execute(stmt, {"r": result, "i": id})
|
||||||
|
|
||||||
## ADDED STORAGE ITEM
|
## ADDED STORAGE ITEM
|
||||||
op.drop_table("storageitems_quiztivitys")
|
op.drop_table("storageitems_quiztivitys")
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
import socketio
|
import socketio
|
||||||
|
|
||||||
@@ -63,4 +64,4 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
__main__()
|
__main__()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user