evennia/reload/managers.py

51 lines
1.3 KiB
Python

import functions_general
class ReloadManager(object):
objects_cache = {}
failed = []
models = {}
def __init__(self, server):
self.server = server
def do_cache(self):
for module, info in self.models.iteritems():
module_obj = __import__(module)
for ituple in info:
mclass = getattr(module_obj, info[0])
for instance in mclass.__instances__():
instance.cache(self, do_save=ituple[1])
def do_reload(self):
self.do_cache()
self.server.reload()
self.reload_objects()
def cache_object(self, obj):
obj_dict = {}
for key, value in obj.__dict__.iteritems():
if not callable(obj[key]):
obj_dict[key] = value
self.objects_cache[obj] = obj_dict
def reload_objects(self):
for obj, cache in self.objects_cache.iteritems():
try:
obj.reload(cache)
except:
functions_general.log_errmsg("Failed to reload cache for object: %s." % (obj,))
self.failed.append(obj)
raise
self.objects_cache = {}
for obj in self.failed:
try:
obj.__dict__.update(cache)
except:
functions_general.log_errmsg("Failed to update object %s, giving up." %s (obj,))
raise
self.failed = []