from json import dumps, loads from logging import DEBUG, INFO, basicConfig, getLogger from os import environ, mkdir from os.path import exists from pathlib import Path class SimpleJsonStorage(dict): """A simple json file. It is a dictionary which saves to disk on all writes. It is optimised for ease of hacking and accessibility and not for performance or efficiency. Written by decentral1se, as part of: https://git.vvvvvvaria.org/decentral1se/xbotlib/src/branch/main/xbotlib.py """ def __init__(self, filename, log, *args, **kwargs): """Initialise the object.""" self.filename = Path(filename).absolute() self.log = getLogger(__name__) self._loads() self.update(*args, **kwargs) def _loads(self): """Load the file.""" if not exists(self.filename): return try: with open(self.filename, "r") as handle: self.update(loads(handle.read())) except Exception as exception: message = f"Loading file storage failed: {exception}" self.log.error(message, exc_info=exception) exit(1) def _dumps(self): """Save the file to disk.""" try: with open(self.filename, "w") as handle: handle.write(dumps(self, indent=4, sort_keys=True)) except Exception as exception: message = f"Saving file storage failed: {exception}" self.log.error(message, exc_info=exception) exit(1) def __setitem__(self, key, val): """Write data to the file.""" super().__setitem__(key, val) self._dumps() def __delitem__(self, key): """Remove data from the file.""" super().__delitem__(key) self._dumps() def update(self, *args, **kwargs): """Update the file.""" for k, v in dict(*args, **kwargs).items(): self[k] = v self._dumps()