From 5b5bb4b30cde0882c6510ab7941aac4a84fd436c Mon Sep 17 00:00:00 2001 From: Remy Moll Date: Fri, 15 Jan 2021 16:40:48 +0100 Subject: [PATCH] Actually working persistence by overloading a dict --- bot/framework.py | 3 -- launcher.py | 5 ++-- persistence/main.py | 68 +++++++++++++++++++++++++++++++++++++++++++++ wrapper.py | 1 - 4 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 persistence/main.py diff --git a/bot/framework.py b/bot/framework.py index aa1b0db..1b03368 100644 --- a/bot/framework.py +++ b/bot/framework.py @@ -65,9 +65,6 @@ class BotFramework(): def react_chats(self): """Checks unanswered messages and answers them""" - # HACKY: TODO remove - self.persistence.sync() - # writes persistent variables to file so that they ACTUALLY persist num = self.telegram.fetch_updates() for i in range(num): self.react_command() diff --git a/launcher.py b/launcher.py index 93e51a9..b8ef4fc 100644 --- a/launcher.py +++ b/launcher.py @@ -4,17 +4,16 @@ import clock.main import dashboard.main # wrapper import wrapper - +import persistence.main # misc. from threading import Thread -import shelve class Launcher(): """Launches all other submodules""" def __init__(self): """""" - self.persistence = shelve.DbfilenameShelf("persistence/prst.db", writeback = True) + self.persistence = persistence.main.PersistentDict("persistence/prst.json") if len(self.persistence) == 0: self.init_persistence() self.persistence["global"]["reboots"] += 1 diff --git a/persistence/main.py b/persistence/main.py new file mode 100644 index 0000000..21791fb --- /dev/null +++ b/persistence/main.py @@ -0,0 +1,68 @@ +import json +import os + + + +class PersistentDict(dict): + """""" + def __init__(self, file_name, *args, **kwargs): + + super().__init__(*args, **kwargs) + self.path = file_name + self.last_action = "" + if not os.path.exists(self.path): + with open(self.path, "a") as f: + f.write("{}") + self.read_dict() + + + def write_dict(self): + with open(self.path, "w") as f: + json.dump(self, f) + self.last_action = "w" + + def read_dict(self): + with open(self.path) as f: + tmp = dict(json.load(f)) + for key in tmp: + super().__setitem__(key, tmp[key]) + self.last_action = "r" + + + def __setitem__(self, key, value): + if self.last_action != "r": + self.read_dict() + + super().__setitem__(key,value) + self.write_dict() # writes 'self' to a json file. + + def __getitem__(self, key): + if self.last_action != "r": + self.read_dict() + + ret_val = super().__getitem__(key) + if type(ret_val) == dict: + ret_val = HookedDict(key, self, ret_val) + + return ret_val + + def clear(self): + super().clear() + self.write_dict() + return {} + +class HookedDict(dict): + def __init__(self, own_name, parent_dict, *args, **kwargs): + super().__init__(*args, **kwargs) + self.name = own_name + self.parent = parent_dict + + def __setitem__(self, key, value): + super().__setitem__(key, value) + self.parent.__setitem__(self.name, self) + + def __getitem__(self, key): + ret_val = super().__getitem__(key) + if type(ret_val) == dict: + ret_val = HookedDict(key, self, ret_val) + return ret_val \ No newline at end of file diff --git a/wrapper.py b/wrapper.py index b4e44b7..7c3b1d5 100644 --- a/wrapper.py +++ b/wrapper.py @@ -19,7 +19,6 @@ class Wrapper(): while True: action() time.sleep(sleep_delta) - self.own.persistence.sync()