|
|
|
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()
|