117 lines
3.4 KiB
Python
117 lines
3.4 KiB
Python
import tomlkit
|
|
import json
|
|
from pathlib import Path
|
|
from tomlkit import TOMLDocument
|
|
from typing import Any
|
|
|
|
|
|
class Mod:
|
|
__config: TOMLDocument
|
|
|
|
__has_meta_json: bool
|
|
__meta: dict[str, Any]
|
|
|
|
__path: Path
|
|
__name: str
|
|
__description: str
|
|
__author: str
|
|
__enabled: bool
|
|
|
|
@property
|
|
def path(self) -> Path:
|
|
return self.__path
|
|
|
|
# Mod metadata
|
|
@property
|
|
def name(self) -> str | None:
|
|
if self.__has_meta_json:
|
|
if "name" in self.__meta:
|
|
return self.__meta.get("name", str)
|
|
if "name" not in self.__config:
|
|
return None
|
|
return self.__config.get("name", str)
|
|
|
|
@property
|
|
def description(self) -> str | None:
|
|
if self.__has_meta_json:
|
|
if "description" in self.__meta:
|
|
return self.__meta.get("description", str)
|
|
if "description" not in self.__config.keys():
|
|
return None
|
|
else:
|
|
return self.__config.get("description", str)
|
|
|
|
@property
|
|
def long_description(self) -> str | None:
|
|
if "descriptionLong" in self.__meta:
|
|
return self.__meta.get("descriptionLong", str)
|
|
return None
|
|
|
|
@property
|
|
def author(self) -> str | None:
|
|
# TODO: return list with authors
|
|
if self.__has_meta_json:
|
|
if "authors" in self.__meta:
|
|
authors: list[str] = self.__meta.get("authors", list[str])
|
|
return ", ".join(authors)
|
|
if "author" not in self.__config:
|
|
return None
|
|
return self.__config.get("author", str)
|
|
|
|
@property
|
|
def enabled(self) -> bool:
|
|
return self.__enabled
|
|
|
|
@enabled.setter
|
|
def enabled(self, value: bool) -> None:
|
|
if value == self.__enabled:
|
|
# Nothing to do
|
|
return
|
|
|
|
config_toml = Path(self.__path, "config.toml")
|
|
with config_toml.open("w") as config_file:
|
|
self.__config["enabled"] = value
|
|
tomlkit.dump(self.__config, config_file)
|
|
self.__enabled = value
|
|
|
|
def __init__(self, path: Path) -> None:
|
|
self.__path = path
|
|
self.__meta = {}
|
|
|
|
try:
|
|
config_toml = Path(self.__path, "config.toml")
|
|
with config_toml.open() as config_file:
|
|
self.__config = tomlkit.load(config_file)
|
|
|
|
if "enabled" not in self.__config:
|
|
raise InvalidModError("config.toml does not contain the enabled key")
|
|
self.__enabled = self.__config.get("enabled", bool)
|
|
except FileNotFoundError:
|
|
raise InvalidModError("config.toml does not exist")
|
|
|
|
meta_json: Path = Path(self.__path, "meta.json")
|
|
if meta_json.exists():
|
|
self.__has_meta_json = True
|
|
try:
|
|
with meta_json.open() as file:
|
|
self.__meta = json.load(file)
|
|
except json.JSONDecodeError as e:
|
|
print("Failed to parse meta.json!: ", e.msg)
|
|
else:
|
|
self.__has_meta_json = False
|
|
|
|
def __str__(self) -> str:
|
|
return f"Mod({self.__path})"
|
|
|
|
|
|
class InvalidModError(Exception):
|
|
"""
|
|
This exception is raised when the Mod class gets given a path of something that's not a valid mod
|
|
"""
|
|
|
|
def __init__(self, message: str) -> None:
|
|
super().__init__(message)
|
|
self.message = message
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.message}"
|