X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/d1ea05b06625b91b6d4fc9580fff461b47b3570c..30e3843de07b9c4e6ca6e92fcae715d28ac2a39e:/ctlmod.py diff --git a/ctlmod.py b/ctlmod.py index 86943d1..24dd236 100644 --- a/ctlmod.py +++ b/ctlmod.py @@ -1,6 +1,11 @@ +# Erebus IRC bot - Author: John Runyon +# module loading/unloading/tracking code + import sys +import modlib modules = {} +dependents = {} def isloaded(modname): return modname in modules def modhas(modname, attname): return getattr(self.modules[modname], attname, None) is not None @@ -8,19 +13,41 @@ def modhas(modname, attname): return getattr(self.modules[modname], attname, Non def load(parent, modname): if not isloaded(modname): mod = __import__(modname) + reload(mod) + + if 1 not in mod.modinfo['compatible']: + return modlib.error('API-incompatible') + modules[modname] = mod + dependents[modname] = [] + + for dep in mod.modinfo['depends']: + if dep not in modules: + depret = load(parent, dep) + if not depret: + return + dependents[dep].append(modname) + + ret = mod.modstart(parent) - if not ret: + if ret is not None and not ret: del modules[modname] + del dependents[modname] + for dep in mod.modinfo['depends']: + dependents[dep].remove(modname) return ret - else: - return -1 + else: #if not isloaded...else: + return modlib.error('already loaded') def unload(parent, modname): if isloaded(modname): + for dependent in dependents[modname]: + unload(parent, dependent) + for dep in dependents[modname]: + dependents[dep].remove(modname) self.modules[modname].modstop(parent) else: - return -1 + return modlib.error('already unloaded') def reloadmod(parent, modname): if isloaded(modname):