Files
agon/data/category.py
T

89 lines
2.6 KiB
Python

"""File for Category class."""
from typing import Optional
import json
from data.score import Score, ScoreTime # pylint: disable=import-error
class Category:
"""Stores a category's information and relative scores."""
def __init__(
self,
name: str,
ascending: Optional[bool] = False,
time_record: Optional[bool] = False,
) -> None:
self._name: str = name
self._ascending: bool = ascending
self._time_record: bool = time_record
self._scores: dict(Score) = {}
def __str__(self) -> str:
"""Creates a string from the class."""
return json.dumps(self.to_dict(), indent=4)
@property
def ascending(self) -> bool:
"""Getter for ascending bool."""
return self._ascending
@property
def name(self) -> str:
"""Getter for name."""
return self._name
@property
def time_record(self) -> bool:
"""Getter for time record bool."""
return self._time_record
@property
def scores(self) -> "list[Score]":
"""Getter for scores list."""
return self._scores.values()
def add_score(self, score: Score) -> None:
"""Adds a score to dictionary storage. Then sorts dictionary by score value."""
if score.user in self._scores:
del self._scores[score.user]
self._scores[score.user] = score
self._scores = dict(
sorted(self._scores.items(), key=lambda x: x[1].score, reverse=not self.ascending)
)
def from_dict(self, data: dict) -> None:
"""Fills out category from passed dictionary"""
self._ascending = data["ascending"]
self._time_record = data["time_record"]
for user, score in data["scores"].items():
if self.time_record:
self.add_score(ScoreTime(user, score))
else:
self.add_score(Score(user, score))
def get_user_score(self, user: str) -> Score:
"""Gets a user's score. None if doesn't exist."""
if user in self.scores:
return self._scores[user]
return None
def remove_score(self, score: Score) -> None:
"""Removes a score from dictionary storage."""
score = self._scores.pop(score.user)
del score
def to_dict(self) -> dict:
"""Saves category data as a python dictionary."""
data = {}
data["ascending"] = self.ascending
data["time_record"] = self.time_record
data["scores"] = {}
for score in self.scores:
data["scores"][score.user] = score.value
return data