diff --git a/MultiServer.py b/MultiServer.py index ca352281..1bbbed69 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -16,6 +16,7 @@ import pickle import itertools import time import operator +import hashlib import ModuleUpdate @@ -58,6 +59,12 @@ modify_functions = { } +def get_saving_second(seed_name: str, interval: int = 60) -> int: + # save at expected times so other systems using savegame can expect it + # represents the target second of the auto_save_interval at which to save + return int(hashlib.sha256(seed_name.encode()).hexdigest(), 16) % interval + + class Client(Endpoint): version = Version(0, 0, 0) tags: typing.List[str] = [] @@ -463,10 +470,16 @@ class Context: def _start_async_saving(self): if not self.auto_saver_thread: def save_regularly(): - import time + # time.time() is platform dependent, so using the expensive datetime method instead + def get_datetime_second(): + now = datetime.datetime.now() + return now.second + now.microsecond * 0.000001 + + second = get_saving_second(self.seed_name, self.auto_save_interval) while not self.exit_event.is_set(): try: - time.sleep(self.auto_save_interval) + next_wakeup = (second - get_datetime_second()) % self.auto_save_interval + time.sleep(max(1.0, next_wakeup)) if self.save_dirty: logging.debug("Saving via thread.") self._save() diff --git a/WebHostLib/static/assets/tracker.js b/WebHostLib/static/assets/tracker.js index 0eeda35a..22f6f72f 100644 --- a/WebHostLib/static/assets/tracker.js +++ b/WebHostLib/static/assets/tracker.js @@ -75,10 +75,18 @@ window.addEventListener('load', () => { console.info(tables.search()); tables.draw(); }); + const tracker = document.getElementById('tracker-wrapper').getAttribute('data-tracker'); + const target_second = document.getElementById('tracker-wrapper').getAttribute('data-second') + 3; + + function getSleepTimeSeconds(){ + // -40 % 60 is -40, which is absolutely wrong and should burn + var sleepSeconds = (((target_second - new Date().getSeconds()) % 60) + 60) % 60; + return sleepSeconds || 60; + } const update = () => { const target = $("
"); - const tracker = document.getElementById('tracker-wrapper').getAttribute('data-tracker'); + console.log("Updating Tracker..."); target.load("/tracker/" + tracker, function (response, status) { if (status === "success") { target.find(".table").each(function (i, new_table) { @@ -97,9 +105,9 @@ window.addEventListener('load', () => { console.log(response); } }) + setTimeout(update, getSleepTimeSeconds()*1000); } - - setInterval(update, 30000); + setTimeout(update, getSleepTimeSeconds()*1000); window.addEventListener('resize', () => { adjustTableHeight(); diff --git a/WebHostLib/templates/genericTracker.html b/WebHostLib/templates/genericTracker.html index fa070ea6..508c084e 100644 --- a/WebHostLib/templates/genericTracker.html +++ b/WebHostLib/templates/genericTracker.html @@ -9,7 +9,7 @@ {% block body %} {% include 'header/dirtHeader.html' %} -